基於ansible的roles實現nginx源碼安裝部署php
ansible是一款比較熱門的自動化部署工具。具備比較好兼用性,並且使用比較簡單,而今天咱們經過roles來實現咱們的自動化部署;先講講經過roles實現部署的好處吧,經過roles咱們便很好的管理咱們要部署的內容,並且經過roles來管理,使得咱們使用ansible變得更方便。html
環境主機:node1 172.25.0.29 ansiblenode
node2 172.25.0.30 測試主機nginx
先看一下role角色定義:web
---以特定的層級目錄結構進行組織的tasks、variables、handlers、templates、files(依賴的文件)等;shell
角色目錄的定義:bash
role_name/(以角色名命名的目錄)app
files/:框架
存儲由copy或script等模塊調用的文件; ssh
tasks/:
此目錄中至少應該有一個名爲main.yml的文件,用於定義各task;其它的文件須要由main.yml進行「包含」調用;
handlers/:
此目錄中至少應該有一個名爲main.yml的文件,用於定義各handler;其它的文件須要由main.yml進行「包含」調用;
vars/:
此目錄中至少應該有一個名爲main.yml的文件,用於定義各variable;其它的文件須要由main.yml進行「包含」調用;
templates/:
存儲由template模塊調用的模板文本;
meta/:
此目錄中至少應該有一個名爲main.yml的文件,定義當前角色的特殊設定及其依賴關係;其它的文件須要由main.yml進行「包含」調用;
default/:
此目錄中至少應該有一個名爲main.yml的文件,用於設定默認變量;
接下來開始實現nginx快速安裝
主意小事項:
作ansible要先作ssh的公私鑰認證,我這裏作了就不在演示了。
一、建立roles的所須要的目錄
[root@node1 ansible]# mkdir -pv roles/nginx/{files,templates,vars,handlers,meta,default,tasks} mkdir: created directory ‘roles/nginx’ mkdir: created directory ‘roles/nginx/files’ mkdir: created directory ‘roles/nginx/templates’ mkdir: created directory ‘roles/nginx/vars’ mkdir: created directory ‘roles/nginx/handlers’ mkdir: created directory ‘roles/nginx/meta’ mkdir: created directory ‘roles/nginx/default’ mkdir: created directory ‘roles/nginx/tasks’
二、定義角色路徑:
[root@node1 nginx]# cat /etc/ansible/nginx.yaml - hosts: 172.25.0.30 remote_user: root roles: - nginx ###這個表示roles目錄下的nginx目錄
三、在tasks文件夾裏面定義咱們的task。
[root@node1 nginx]# cat tasks/main.yml - name: copy nginx package to remote host copy: src=nginx-1.12.0.tar.gz dest=/tmp/nginx-1.12.0.tar.gz #### 這裏是調用files模塊 tags: cppkg - name: tar nginx shell: cd /tmp;tar -xf nginx-1.12.0.tar.gz - name: install pakger yum: name={{ item }} state=latest with_items: - openssl-devel - pcre-devel - gcc - name: install nginx shell: cd /tmp/nginx-1.12.0;useradd nginx;./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre;make && make install - name: copy conf file nginx.conf ### 這裏調用的是templates模塊 template: src=nginx.conf dest=/usr/local/nginx/conf/nginx.conf tags: ngxconf notify: reload nginx service ###這裏調用的是handlers模塊
四、往file添加咱們的nginx壓縮包
[root@node1 files]# wget http://nginx.org/download/nginx-1.12.0.tar.gz
五、template這一行也要添加對應的template這個目錄和主服務端定義的變量:
[root@node1 nginx]# cat templates/nginx.conf ###這裏文件用來自定義咱們所須要的,我這裏只做演示,就定了兩個參數。 user nginx; worker_processes {{ ansible_processor_vcpus }}; #修改CPU進程數量 #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 65535; } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen {{ ngxport }}; server_name www.xiaozhang.com; access_log logs/www.xiaozhang.com ; #location / { # proxy_pass http://172.25.0.29; #} #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # location ~ \.php$ { root /web; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } include vhosts/*.conf; }
##這裏須要注意的就是模板變量(客戶端自動採集)、和在服務端定義的變量`ngx_port`
六、接下來在vars目錄下添加自定義變量
[root@node1 nginx]# cat vars/main.yml ngxport: "8080"
七、接下來再到handlers目錄下添加自定義觸發器模塊:
[root@node1 handlers]# cat main.yml - name: reload nginx service shell: /usr/local/nginx/sbin/nginx
八、咱們查看一下目錄結構:
[root@node1 roles]# tree . └── nginx ├── default ├── files │ └── nginx-1.12.0.tar.gz ├── handlers │ └── main.yml ├── meta ├── tasks │ └── main.yml ├── templates │ └── nginx.conf └── vars └── main.yml
九、開始部署,先檢查一下
[root@node1 ~]# ansible-playbook -C /etc/ansible/nginx.yaml PLAY [172.25.0.30] ****************************************************************************************************************************************** TASK [Gathering Facts] ************************************************************************************************************************************** ok: [172.25.0.30] TASK [nginx : copy nginx package to remote host] ************************************************************************************************************ changed: [172.25.0.30] TASK [nginx : tar nginx] ************************************************************************************************************************************ skipping: [172.25.0.30] TASK [nginx : install pakger] ******************************************************************************************************************************* ok: [172.25.0.30] => (item=[u'openssl-devel', u'pcre-devel', u'gcc']) TASK [nginx : install nginx] ******************************************************************************************************************************** skipping: [172.25.0.30] TASK [nginx : copy conf file nginx.conf] ******************************************************************************************************************** changed: [172.25.0.30] RUNNING HANDLER [nginx : reload nginx service] ************************************************************************************************************** skipping: [172.25.0.30] PLAY RECAP ************************************************************************************************************************************************** 172.25.0.30 : ok=4 changed=2 unreachable=0 failed=0 [root@node1 ~]#
##咱們發現檢測沒問題,開始部署:
[root@node1 ~]# ansible-playbook /etc/ansible/nginx.yaml PLAY [172.25.0.30] ****************************************************************************************************************************************** TASK [Gathering Facts] ************************************************************************************************************************************** ok: [172.25.0.30] TASK [nginx : copy nginx package to remote host] ************************************************************************************************************ changed: [172.25.0.30] TASK [nginx : tar nginx] ************************************************************************************************************************************ changed: [172.25.0.30] TASK [nginx : install pakger] ******************************************************************************************************************************* ok: [172.25.0.30] => (item=[u'openssl-devel', u'pcre-devel', u'gcc']) TASK [nginx : install nginx] ******************************************************************************************************************************** changed: [172.25.0.30] TASK [nginx : copy conf file nginx.conf] ******************************************************************************************************************** changed: [172.25.0.30] NOTIFIED: [nginx | reload nginx service] ******************************************************************************************************************** changed: [172.25.0.30] PLAY RECAP ************************************************************************************************************************************************** 172.25.0.30 : ok=6 changed=2 unreachable=0 failed=0
十、查看測試結果,在node2上:
[root@node2 conf]# cat /usr/local/nginx/conf/nginx.conf user nginx; worker_processes 2; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 65535; } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 8080; server_name www.xiaozhang.com; access_log logs/www.xiaozhang.com ; #location / { # proxy_pass http://172.25.0.29; ###咱們能夠看到 worker_processes 和listen 這兩個參數已經獲取到。
[root@node2 conf]# netstat -ntpl Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 10896/nginx: master
咱們也發現咱們的服務也起來了。證實咱們的roles部署是成功的。
總結
該實驗是ansible的roles一個方面應用,主要是爲了可以快速實現一個服務的部署,固然啦,咱們利用這樣的方法還能夠部署更多的服務,咱們要認識到ansible提供給咱們的只是一個框架。因此咱們在應用時要懂得轉變,靈活運用。