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,如需转载请自行联系原作者