1 用playbook安裝nginx
- 思路:先在一台機器上編譯安裝好nginx、打包,然後再用ansible去下發
先在服務端編譯nginx(服務端為chy01 192.168.212.11 客戶機為chy02 192.168.212.12)
<code>[root@chy01 ~]</code><code># cd /etc/ansible/</code>
<code>[root@chy01 ansible]</code><code># mkdir nginx_install //先建立一個nginx的安裝目錄</code>
<code>[root@chy01 ansible]</code><code># cd nginx_install/</code>
<code>[root@chy01 nginx_install]</code><code># mkdir -p roles/{common,install}/{handlers,files,meta,tasks,templates,vars}</code>
<code>說明:roles目錄下有兩個角色,common為一些準備操作,</code><code>install</code><code>為安裝nginx的操作。每個角色下面又有幾個目錄,handlers下面是當發生改變時要執行的操作,通常用在配置檔案發生改變,重新開機服務。files為安裝時用到的一些檔案,meta為說明資訊,說明角色依賴等資訊,tasks裡面是核心的配置檔案,templates通常存一些配置檔案,啟動腳本等模闆檔案,vars下為定義的變量</code>
<code>[root@chy01 nginx_install]</code><code># ls roles/</code>
<code>common </code><code>install</code>
<code>[root@chy01 nginx_install]</code><code># ls roles/install/</code>
<code>files handlers meta tasks templates vars</code>
<code>[root@chy01 ~]</code><code># ls /etc/init.d/nginx </code>
<code>/etc/init</code><code>.d</code><code>/nginx</code>
<code>[root@chy01 ~]</code><code># ls /usr/local/nginx/</code>
<code>client_body_temp/ fastcgi_temp/ logs/ sbin/ uwsgi_temp/ </code>
<code>conf/ html/ proxy_temp/ scgi_temp/ </code>
<code>[root@chy01 ~]</code><code># ls /usr/local/nginx/conf/nginx.conf</code>
<code>/usr/local/nginx/conf/nginx</code><code>.conf</code>
<code>(如上是之前編譯好的nginx,在這裡就不需要再次編譯安裝了)</code>
編譯完成後需要在服務端打包nginx包:如下操作
<code>[root@chy01 </code><code>local</code><code>]</code><code># tar czvf nginx.tar.gz --exclude "nginx.conf" --exclude "vhosts" nginx/</code>
<code>(如上是打包nginx目錄打包成nginx.</code><code>tar</code><code>.gz 但是在打包的過程中是不需要打包nginx.conf與vhosts的)</code>
<code>[root@chy01 </code><code>local</code><code>]</code><code># mv nginx.tar.gz /etc/ansible/nginx_install/roles/install/files/</code>
<code>//</code><code>将壓縮包移動到建立的nginx_install目錄下去 </code>
<code>[root@chy01 </code><code>local</code><code>]</code><code># cp nginx/conf/nginx.conf /etc/ansible/nginx_install/roles/install/templates/</code>
<code>[root@chy01 </code><code>local</code><code>]</code><code># cp /etc/init.d/nginx /etc/ansible/nginx_install/roles/install/templates/</code>
<code>啟動腳本、配置檔案都要放到</code><code>/etc/ansible/nginx_install/roles/install/templates</code><code>下面</code>
定義common的tasks,nginx是需要一些依賴包的
<code>[root@chy01 </code><code>local</code><code>]</code><code># cd /etc/ansible/nginx_install/roles/</code>
<code>[root@chy01 roles]</code><code># cd common/</code>
<code>[root@chy01 common]</code><code># vi tasks/main.yml </code>
<code>- name: Install initializtion require software</code>
<code> </code><code>yum: name={{ item }} state=installed</code>
<code> </code><code>with_items:</code>
<code> </code><code>- zlib-devel</code>
<code> </code><code>- pcre-devel</code>
<code>(安裝依賴包與相應的庫)</code>
定義變量
<code>[root@chy01 common]</code><code># vim /etc/ansible/nginx_install/roles/install/vars/main.yml </code>
<code>nginx_user: www</code>
<code>nginx_port: 80</code>
<code>nginx_basedir: </code><code>/usr/local/nginx</code>
<code>//</code><code>左邊是定義的名字,右邊是值</code>
<code>[root@chy01 common]</code><code># vim /etc/ansible/nginx_install/roles/install/tasks/copy.yml //把所有用到的文檔拷貝到目标機器(定義一個子配置檔案)</code>
<code>- name: Copy Nginx Software </code>
<code> </code><code>copy: src=nginx.</code><code>tar</code><code>.gz dest=</code><code>/tmp/nginx</code><code>.</code><code>tar</code><code>.gz owner=root group=root</code>
<code>- name: Uncompression Nginx Software</code>
<code> </code><code>shell: </code><code>tar</code> <code>zxf </code><code>/tmp/nginx</code><code>.</code><code>tar</code><code>.gz -C </code><code>/usr/local/</code>
<code>- name: Copy Nginx Start Script</code>
<code> </code><code>template: src=nginx dest=</code><code>/etc/init</code><code>.d</code><code>/nginx</code> <code>owner=root group=root mode=0755</code>
<code>- name: Copy Nginx Config</code>
<code> </code><code>template: src=nginx.conf dest={{ nginx_basedir }}</code><code>/conf/</code> <code>owner=root group=root mode=0644</code>
建立使用者并且啟動服務以及删除壓縮包
<code>[root@chy01 common]</code><code># vim /etc/ansible/nginx_install/roles/install/tasks/install.yml </code>
<code>- name: Create Nginx User</code>
<code> </code><code>user: name={{ nginx_user }} state=present createhome=no shell=</code><code>/sbin/nologin</code>
<code>- name: Start Nginx Service</code>
<code> </code><code>shell: </code><code>/etc/init</code><code>.d</code><code>/nginx</code> <code>start</code>
<code>- name: Add Boot Start Nginx Service</code>
<code> </code><code>shell: chkconfig --level 345 nginx on</code>
<code>- name: Delete Nginx compression files</code>
<code> </code><code>shell: </code><code>rm</code> <code>-rf </code><code>/tmp/nginx</code><code>.</code><code>tar</code><code>.gz</code>
<code>//</code> <code>nginx_user 調用參數;state=present 表示存在。</code>
再建立main.yml并且把copy和install調用
<code>[root@chy01 tasks]</code><code># vim /etc/ansible/nginx_install/roles/install/tasks/main.yml </code>
<code>- include: copy.yml</code>
<code>- include: </code><code>install</code><code>.yml</code>
<code>到此兩個roles:common和</code><code>install</code><code>就定義完成了</code>
最後要定義一個入口配置檔案
<code>[root@chy01 tasks]</code><code># vim /etc/ansible/nginx_install/install.yml </code>
<code>---</code>
<code>- hosts: chy02</code>
<code> </code><code>remote_user: root</code>
<code> </code><code>gather_facts: True</code>
<code> </code><code>roles:</code>
<code> </code><code>- common</code>
<code> </code><code>- </code><code>install</code>
<code>[root@chy01 tasks]</code><code># ansible-playbook /etc/ansible/nginx_install/install.yml</code>
<code>[DEPRECATION WARNING]: The use of </code><code>'include'</code> <code>for</code> <code>tasks has been deprecated. Use </code><code>'import_tasks'</code> <code>for</code> <code>static inclusions or </code>
<code>'include_tasks'</code> <code>for</code> <code>dynamic inclusions. This feature will be removed </code><code>in</code> <code>a future release. Deprecation warnings can be disabled by</code>
<code> </code><code>setting deprecation_warnings=False </code><code>in</code> <code>ansible.cfg.</code>
<code>[DEPRECATION WARNING]: include is kept </code><code>for</code> <code>backwards compatibility but usage is discouraged. The module documentation details </code>
<code>page may explain </code><code>more</code> <code>about this rationale.. This feature will be removed </code><code>in</code> <code>a future release. Deprecation warnings can be </code>
<code>disabled by setting deprecation_warnings=False </code><code>in</code> <code>ansible.cfg.</code>
<code>PLAY [chy02] *********************************************************************************************************************</code>
<code>TASK [Gathering Facts] ***********************************************************************************************************</code>
<code>ok: [chy02]</code>
<code>TASK [common : Install initializtion require software] ***************************************************************************</code>
<code>failed: [chy02] (item=[u</code><code>'zlib-devel'</code><code>, u</code><code>'pcre-devel'</code><code>]) => {</code><code>"changed"</code><code>: </code><code>false</code><code>, </code><code>"failed"</code><code>: </code><code>true</code><code>, </code><code>"item"</code><code>: [</code><code>"zlib-devel"</code><code>, </code><code>"pcre-devel"</code><code>], </code><code>"msg"</code><code>: </code><code>"No Package matching '['zlib-devel'' found available, installed or updated"</code><code>, </code><code>"rc"</code><code>: 0, </code><code>"results"</code><code>: []}</code>
<code> </code><code>to retry, use: --limit @</code><code>/etc/ansible/nginx_install/install</code><code>.retry</code>
<code>PLAY RECAP ***********************************************************************************************************************</code>
<code>chy02 : ok=1 changed=0 unreachable=0 failed=1 </code>
<code>在執行的時候會報一個錯誤,這時初步感覺是因為不支援循環,解決方法需要修改一下main.yml的配置檔案</code>
<code> </code><code>yum: name=</code><code>"pcre-devel,zlib-devel"</code> <code>state=installed</code>
<code>[root@chy01 common]</code><code># ansible-playbook /etc/ansible/nginx_install/install.yml</code>
<code>再次啟動就正常了</code>
<code>[root@chy02 ~]</code><code># ps aux |grep nginx</code>
<code>root 5566 0.0 0.0 45484 1284 ? Ss 03:05 0:00 nginx: master process </code><code>/usr/local/nginx/sbin/nginx</code> <code>-c </code><code>/usr/localnginx/conf/nginx</code><code>.conf</code>
<code>nobody 5568 0.0 0.2 47972 3920 ? S 03:05 0:00 nginx: worker process</code>
<code>nobody 5569 0.0 0.2 47972 3920 ? S 03:05 0:00 nginx: worker process</code>
<code>root 5683 0.0 0.0 112664 976 pts</code><code>/0</code> <code>R+ 03:05 0:00 </code><code>grep</code> <code>--color=auto nginx</code>
<code>//</code><code>在客戶機測試成功</code>
<code>如上需要注意一個問題:需要釋放80端口,還需要保證客戶機上沒有安裝nginx(包括用yum安裝的)</code>

本文轉自我不是瘦子51CTO部落格,原文連結:http://blog.51cto.com/chy940405/1980400,如需轉載請自行聯系原作者