24.15 ansible介绍
不需要安装客户端,通过 sshd 去通信
基于模块工作,模块可以由任何语言开发
不仅支持命令行使用模块,也支持编写 yaml 格式的 playbook,易于编写和阅读
安装十分简单,centos 上可直接 yum 安装
有提供UI(浏览器图形化)www.ansible.com/tower,收费的
官方文档 http://docs.ansible.com/ansible/latest/index.html
ansible 已经被 redhat 公司收购,它在 github 上是一个非常受欢迎的开源软件,github 地址https://github.com/ansible/ansible
一本不错的入门电子书https://ansible-book.gitbooks.io/ansible-first-book/
24.16 ansible安装
1、准备两台机器,arslinux-01,arslinux-02
2、在 arslinux-01 上安装 ansible
[root@arslinux-01 ~]# yum list|grep ansible
[root@arslinux-01 ~]# yum install -y ansible ansible-doc
3、在 arslinux-01 上生成密钥对
[root@arslinux-01 ~]# ssh-keygen -t rsa
如果 /root/.ssh/ 下有 id_rsa.pub 则不需要生成密钥对
4、将公钥放到 arslinux-01,arslinux-02 上的 /root/.ssh/authorized_keys 中
5、验证连接
[root@arslinux-01 ~]# ssh 192.168.194.132
Last login: Sun Aug 4 21:08:02 2019 from 192.168.194.1
6、配置主机组
[root@arslinux-01 ~]# vim /etc/ansible/hosts
[testhost]
127.0.0.1
192.168.194.132
说明: testhost 为主机组名字,自定义的。 下面两个 ip 为组内的机器 ip
24.17 ansible 远程执行命令
ansible testhost -m command -a '命令' 批量远程命令
这里的 testhost 为主机组名,-m 后边是模块名字,-a 后面是命令。当然我们也可以直接写一个 ip,针对某一台机器来执行命令
[root@arslinux-01 ~]# ansible testhost -m command -a 'w'
127.0.0.1 | CHANGED | rc=0 >>
21:38:20 up 1:11, 3 users, load average: 0.25, 0.14, 0.15
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.194.1 117月19 24days 0.05s 0.05s -bash
root pts/1 192.168.194.1 21:07 4.00s 2.63s 0.00s ssh -C -o ControlMaster=auto -o ControlPersist=60s -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o ConnectTimeout=10 -o ControlPath=/root/.ansible/cp/6220ae23ea -tt arslinux-02 /bin/sh -c '/usr/bin/python /root/.ansible/tmp/ansible-tmp-1564925899.21-98869728293746/AnsiballZ_command.py && sleep 0'
root pts/4 localhost 21:38 0.00s 0.25s 0.01s w
arslinux-02 | CHANGED | rc=0 >>
21:38:21 up 3:17, 3 users, load average: 0.08, 0.03, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.194.1 146月19 50days 0.04s 0.04s -bash
root pts/1 192.168.194.1 21:08 53.00s 0.04s 0.04s -bash
root pts/2 arslinux-01 21:38 1.00s 0.32s 0.01s w
[root@arslinux-01 ~]# ansible 192.168.194.132 -m command -a 'w'
arslinux-02 | CHANGED | rc=0 >>
21:38:52 up 3:18, 3 users, load average: 0.05, 0.03, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.194.1 146月19 50days 0.04s 0.04s -bash
root pts/1 192.168.194.1 21:08 1:24 0.04s 0.04s -bash
root pts/2 arslinux-01 21:38 1.00s 0.43s 0.01s w
错误: "msg": "Aborting, target uses selinux but python bindings (libselinux-python) aren't installed!"
解决: yum install -y libselinux-python
ansible testhost -m shell -a '命令' shell 模块同样可以实现远程执行的命令
[root@arslinux-01 ~]# ansible testhost -m shell -a 'hostname'
arslinux-02 | CHANGED | rc=0 >>
arslinux-02
127.0.0.1 | CHANGED | rc=0 >>
arslinux-01
24.18 ansible拷贝文件或目录
ansible arslinux-02 -m copy -a 'src= dest= owner= group= mode= ' 拷贝目录或文件
[root@arslinux-01 ~]# ansible 192.168.194.132 -m copy -a "src=/etc/ansible dest=/tmp/ansible_test owner=root group=root mode=0755"
192.168.194.132 | CHANGED => {
"changed": true,
"dest": "/tmp/ansible_test/",
"src": "/etc/ansible"
}
[root@arslinux-02 ~]# ll -d /tmp/ansible_test/
drwxr-xr-x 3 root root 21 8月 4 22:02 /tmp/ansible_test/
[root@arslinux-02 ~]# date
2019年 08月 04日 星期日 22:03:09 CST
注意:源目录会放到目标目录下面去,如果目标指定的目录不存在,它会自动创建。
如果拷贝的是文件,dest 指定的名字和源如果不同,并且它不是已经存在的目录,相当于拷贝过去后又重命名。但相反,如果 desc 是目标机器上已经存在的目录,则会直接把文件拷贝到该目录下面
针对文件操作
[root@arslinux-01 ~]# ansible 192.168.194.132 -m copy -a "src=/etc/passwd dest=/tmp/123 owner=root group=root mode=0755"
192.168.194.132 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "66cfbbd6ccbbfb5edb8b3d364df81d2d9ce9e619",
"dest": "/tmp/123",
"gid": 0,
"group": "root",
"md5sum": "d5a72a116f1f47476e3156915f62972e",
"mode": "0755",
"owner": "root",
"size": 1776,
"src": "/root/.ansible/tmp/ansible-tmp-1564927633.07-72798416414339/source",
"state": "file",
"uid": 0
}
[root@arslinux-02 ~]# ll /tmp/123
-rwxr-xr-x 1 root root 1776 8月 4 22:07 /tmp/123
[root@arslinux-02 ~]# tail -3 /tmp/123
pure-ftp:x:1020:1020::/home/pure-ftp:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
zabbix:x:997:994:Zabbix Monitoring System:/var/lib/zabbix:/sbin/nologin
这里的/tmp/123和源机器上的/etc/passwd是一致的,但如果目标机器上已经有/tmp/123目录,则会再/tmp/123目录下面建立passwd文件
24.19 ansible远程执行脚本
1、创建一个脚本
[root@arslinux-01 ~]# vim /tmp/test.sh
#!/bin/bash
echo `date` > /tmp/ansible_test.txt
2、分发脚本
[root@arslinux-01 ~]# ansible testhost -m copy -a "src=/tmp/test.sh dest=/tmp/test.sh mode=0755"
192.168.194.132 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "b70386033f7568a51de8209c2065dcbd917ca4b1",
"dest": "/tmp/test.sh",
"gid": 0,
"group": "root",
"md5sum": "6da17d4e84617796e1b3c7bfdd083d93",
"mode": "0755",
"owner": "root",
"size": 49,
"src": "/root/.ansible/tmp/ansible-tmp-1564928697.25-67620899139563/source",
"state": "file",
"uid": 0
}
127.0.0.1 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "b70386033f7568a51de8209c2065dcbd917ca4b1",
"dest": "/tmp/test.sh",
"gid": 0,
"group": "root",
"mode": "0755",
"owner": "root",
"path": "/tmp/test.sh",
"size": 49,
"state": "file",
"uid": 0
}
3、执行脚本
[root@arslinux-01 ~]# ansible testhost -m shell -a "/tmp/test.sh"
192.168.194.132 | CHANGED | rc=0 >>
127.0.0.1 | CHANGED | rc=0 >>
[root@arslinux-02 ~]# ll /tmp/
总用量 8
-rwxr-xr-x 1 root root 1776 8月 4 22:07 123
drwxr-xr-x 3 root root 21 8月 4 22:02 ansible_test
-rwxr-xr-x 1 root root 49 8月 4 22:24 test.sh
[root@arslinux-02 ~]# date
2019年 08月 04日 星期日 22:26:22 CST
脚本需要 755 权限,如果不是 755 权限,执行不了
4、shell 模块,还支持远程执行命令并且带管道,而 command 不支持
[root@arslinux-01 ~]# ansible testhost -m command -a "cat /etc/passwd |wc -l"
192.168.194.132 | FAILED | rc=1 >>
cat:无效选项 -- l
Try 'cat --help' for more information.non-zero return code
127.0.0.1 | FAILED | rc=1 >>
cat:无效选项 -- l
Try 'cat --help' for more information.non-zero return code
[root@arslinux-01 ~]# ansible testhost -m shell -a "cat /etc/passwd |wc -l"
192.168.194.132 | CHANGED | rc=0 >>
25
127.0.0.1 | CHANGED | rc=0 >>
37
ansible 需要先将脚本写好并分发到各机器上,然后在批量执行脚本
saltstack 则可以批量远程执行脚本,不需要分发
24.20 ansible管理任务计划
ansible 组名/ip/机器名 -m cron -a "name=' ' job=' ' weekday= " 远程管理任务计划
[root@arslinux-01 ~]# ansible 192.168.194.132 -m cron -a "name='test cron' job='/bin/touch /tmp/1234546.txt' weekday=6"
192.168.194.132 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"envs": [],
"jobs": [
"test cron"
]
}
[root@arslinux-02 ~]# crontab -l
#Ansible: test cron
* * * * 6 /bin/touch /tmp/1234546.txt
说明:cron 是模块;name 自定义 crontab任务的名称;job 指的是任务;weekday 指每周几
其他的时间表示:分钟 minute 小时 hour 日期 day 月份 month
ansible 组名/ip/机器名 -m cron -a "name=' ' state=absent" 删除 cron
[root@arslinux-01 ~]# ansible testhost -m cron -a "name='test cron' state=absent"
192.168.194.132 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"envs": [],
"jobs": []
}
[root@arslinux-02 ~]# crontab -l
[root@arslinux-02 ~]#
24.21 ansible安装包和管理服务
ansible 组名/ip/机器名 -m yum -a "name=包名" 远程 yum 安装包
ansible 组名/ip/机器名 -m yum -a "name=包名 state=removed" 远程卸载
[root@arslinux-01 ~]# ansible 192.168.194.132 -m yum -a "name=httpd"
[root@arslinux-01 ~]# ansible 192.168.194.132 -m yum -a "name=httpd state=removed"
重新安装、启动并设置开机启动
[root@arslinux-01 ~]# ansible 192.168.194.132 -m yum -a "name=httpd state=remove state=installed"
ansible 组名/ip/机器名 -m service -a "name= state= enabled= " 启动服务并设开机启动
[root@arslinux-01 ~]# ansible 192.168.194.132 -m service -a "name=httpd state=started enabled=no"
[root@arslinux-02 ~]# ps aux|grep httpd
root 11746 0.3 0.5 224052 5000 ? Ss 23:07 0:00 /usr/sbin/httpd -DFOREGROUND
apache 11747 0.0 0.2 224052 2948 ? S 23:07 0:00 /usr/sbin/httpd -DFOREGROUND
apache 11749 0.0 0.2 224052 2948 ? S 23:07 0:00 /usr/sbin/httpd -DFOREGROUND
apache 11750 0.0 0.2 224052 2948 ? S 23:07 0:00 /usr/sbin/httpd -DFOREGROUND
apache 11751 0.0 0.2 224052 2948 ? S 23:07 0:00 /usr/sbin/httpd -DFOREGROUND
apache 11752 0.0 0.2 224052 2948 ? S 23:07 0:00 /usr/sbin/httpd -DFOREGROUND
root 11769 0.0 0.0 112724 988 pts/1 R+ 23:07 0:00 grep --color=auto httpd
[root@arslinux-02 ~]# date
2019年 08月 04日 星期日 23:07:43 CST
说明:name 是服务名称;state 是操作、状态;enabled 指是否开机启动
Ansible文档的使用
ansible-doc -l 列出所有的模块
ansible-doc cron 查看指定模块的文档
24.22 使用 ansible playbook
Ansible playbook 相当于把模块写入到配置文件里面
1、编辑 test.yml 文件
[root@arslinux-01 ansible]# vim test.yml
---
- hosts: 192.168.194.132
remote_user: root
tasks:
- name: test_playbook
shell: touch /tmp/arsenal4life.txt
说明: 第一行需要有三个杠,hosts 参数指定了对哪些主机进行参作,如果是多台机器可以用逗号作为分隔,也可以使用主机组,在 /etc/ansible/hosts 里定义;
user 参数指定了使用什么用户登录远程主机操作;
tasks 指定了一个任务,其下面的 name 参数同样是对任务的描述,在执行过程中会打印出来,shell是 ansible 模块名字
2、用 ansible-playbook 执行
[root@arslinux-01 ansible]# ansible-playbook test.yml
PLAY [192.168.194.132] *********************************************************************************************************
TASK [Gathering Facts] *********************************************************************************************************
ok: [192.168.194.132]
TASK [test_playbook] ***********************************************************************************************************
[WARNING]: Consider using the file module with state=touch rather than running 'touch'. If you need to use command because
file is insufficient you can add 'warn: false' to this command task or set 'command_warnings=False' in ansible.cfg to get rid
of this message.
changed: [192.168.194.132]
PLAY RECAP *********************************************************************************************************************
192.168.194.132 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@arslinux-01 ansible]#
3、查看
[root@arslinux-02 ~]# ll /tmp/arsenal4life.txt
-rw-r--r-- 1 root root 0 8月 5 20:57 /tmp/arsenal4life.txt
24.23 playbook 里的变量
创建用户的 playbook:
1、编辑 create_user.yml
[root@arslinux-01 ansible]# vim create_user.yml
---
- name: create_user
hosts: 192.168.194.132
user: root
gather_facts: false
vars:
- user: "test"
tasks:
- name: create user
user: name="{{ user }}"
说明:name 参数对该 playbook 实现的功能做一个概述,后面执行过程中,会打印 name 变量的值 ,可以省略;gather_facts 参数指定了在以下任务部分执行前,是否先执行 setup 模块获取主机相关信息,这在后面的 task 会使用到 setup 获取的信息时用到;vars 参数,指定了变量,这里指定一个 user 变量,其值为 test ,需要注意的是,变量值一定要用引号引住;user 提定了调用 user 模块,name 是 user 模块里的一个参数,而增加的用户名字调用了上面 user 变量的值;{{ }} 定义变量
2、执行
[root@arslinux-01 ansible]# ansible-playbook create_user.yml
PLAY [create_user] *************************************************************************************************************
TASK [create user] *************************************************************************************************************
changed: [192.168.194.132]
PLAY RECAP *********************************************************************************************************************
192.168.194.132 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
3、查看
[root@arslinux-02 ~]# id test
uid=1001(test) gid=1001(test) 组=1001(test)
4、如果用户已经存在,那么不会变更
[root@arslinux-01 ansible]# ansible-playbook create_user.yml
PLAY [create_user] *************************************************************************************************************
TASK [create user] *************************************************************************************************************
ok: [192.168.194.132]
PLAY RECAP *********************************************************************************************************************
192.168.194.132 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
24.24 playbook 里的循环
1、编辑 while.yml
[root@arslinux-01 ansible]# vim while.yml
---
- hosts: 192.168.194.132
user: root
tasks:
- name: change mode for files
file: path=/tmp/{{ item }} state=touch mode=600
with_items:
- 1.txt
- 2.txt
- 3.txt
说明: with_items为循环的对象
2、执行
[root@arslinux-01 ansible]# ansible-playbook while.yml
PLAY [192.168.194.132] *********************************************************************************************************
TASK [Gathering Facts] *********************************************************************************************************
ok: [192.168.194.132]
TASK [change mode for files] ***************************************************************************************************
changed: [192.168.194.132] => (item=1.txt)
changed: [192.168.194.132] => (item=2.txt)
changed: [192.168.194.132] => (item=3.txt)
PLAY RECAP *********************************************************************************************************************
192.168.194.132 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
3、查看
[root@arslinux-02 ~]# ll /tmp/*.txt
-rw------- 1 root root 0 8月 5 21:45 /tmp/1.txt
-rw------- 1 root root 0 8月 5 21:45 /tmp/2.txt
-rw------- 1 root root 0 8月 5 21:45 /tmp/3.txt
-rw-r--r-- 1 root root 43 8月 4 22:28 /tmp/ansible_test.txt
-rw-r--r-- 1 root root 0 8月 5 21:08 /tmp/arsenal4lifeaaa.txt
-rw-r--r-- 1 root root 0 8月 5 20:57 /tmp/arsenal4life.txt
[root@arslinux-02 ~]# date
2019年 08月 05日 星期一 21:46:07 CST
24.25 playbook 里的条件判断
1、编辑 when.yml
[root@arslinux-01 ansible]# vim when.yml
---
- hosts: testhost
user: root
gather_facts: True
tasks:
- name: use when
shell: touch /tmp/when.txt
when: ansible_ens33.ipv4.address == "192.168.194.132"
2、执行
[root@arslinux-01 ansible]# ansible-playbook when.yml
PLAY [testhost] ****************************************************************************************************************
TASK [Gathering Facts] *********************************************************************************************************
ok: [192.168.194.132]
ok: [127.0.0.1]
TASK [use when] ****************************************************************************************************************
skipping: [127.0.0.1]
[WARNING]: Consider using the file module with state=touch rather than running 'touch'. If you need to use command because
file is insufficient you can add 'warn: false' to this command task or set 'command_warnings=False' in ansible.cfg to get rid
of this message.
changed: [192.168.194.132]
PLAY RECAP *********************************************************************************************************************
127.0.0.1 : ok=1 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
192.168.194.132 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
3、查看
[root@arslinux-02 ~]# ll /tmp/when.txt
-rw-r--r-- 1 root root 0 8月 5 22:06 /tmp/when.txt
[root@arslinux-02 ~]# date
2019年 08月 05日 星期一 22:07:11 CST
24.26 playbook 中的 handlers
1、编辑 handler.yml
[root@arslinux-01 ansible]# vim handler.yml
---
- name: handlers test
hosts: 192.168.194.132
user: root
tasks:
- name: copy file
copy: src=/etc/passwd dest=/tmp/aaabbbccc.txt
notify: test handlers
handlers:
- name: test handlers
shell: echo "111111" >> /tmp/aaabbbccc.txt
2、执行
[root@arslinux-01 ansible]# ansible-playbook handler.yml
PLAY [handlers test] ***********************************************************************************************************
TASK [Gathering Facts] *********************************************************************************************************
ok: [192.168.194.132]
TASK [copy file] ***************************************************************************************************************
changed: [192.168.194.132]
RUNNING HANDLER [test handlers] ************************************************************************************************
changed: [192.168.194.132]
PLAY RECAP *********************************************************************************************************************
192.168.194.132 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
3、查看
[root@arslinux-02 ~]# tail !$
tail /tmp/aaabbbccc.txt
mysql:x:1009:1009::/home/mysql:/bin/bash
php-fpm:x:1010:1011::/home/php-fpm:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
virftp:x:1011:1012::/home/virftp:/sbin/nologin
pure-ftp:x:1020:1020::/home/pure-ftp:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
zabbix:x:997:994:Zabbix Monitoring System:/var/lib/zabbix:/sbin/nologin
111111
说明:只有 copy 模块真正执行后,才会去调用下面的 handlers 相关的操作。也就是说如果 1.txt 和 2.txt 内容是一样的,并不会去执行 handlers 里面的 shell 相关命令。 这种比较适合配置文件发生更改后,重启服务的操作
24.27/24.28 playbook 安装 nginx
思路:先在一台机器上编译安装好nginx、打包,然后再用ansible去下发
1、创建各级目录,方便管理
[root@arslinux-01 ansible]# mkdir nginx_install
[root@arslinux-01 ansible]# cd nginx_install
[root@arslinux-01 nginx_install]# mkdir -p roles/{common,install}/{handlers,files,meta,tasks,templates,vars}
[root@arslinux-01 nginx_install]# ls roles/
common/ install/
[root@arslinux-01 nginx_install]# ls roles/common/
files/ handlers/ meta/ tasks/ templates/ vars/
[root@arslinux-01 nginx_install]# ls roles/install/
files/ handlers/ meta/ tasks/ templates/ vars/
说明:roles 目录下有两个角色,common 为一些准备操作,install 为安装nginx的操作。每个角色下面又有几个目录,handlers 下面是当发生改变时要执行的操作,通常用在配置文件发生改变,重启服务。files 为安装时用到的一些文件,meta 为说明信息,说明角色依赖等信息,tasks 里面是核心的配置文件,templates 通常存一些配置文件,启动脚本等模板文件,vars 下为定义的变量
2、打包 nginx 目录,不打包配置文件,例如 nginx.conf,vhost 下的配置文件
[root@arslinux-01 local]# tar czvf nginx.tar.gz --exclude "nginx.conf" --exclude "vhost" nginx/
nginx/
nginx/sbin/
nginx/sbin/nginx.old
nginx/sbin/nginx
nginx/conf/
nginx/conf/koi-win
nginx/conf/koi-utf
nginx/conf/win-utf
nginx/conf/mime.types
nginx/conf/mime.types.default
nginx/conf/fastcgi_params
nginx/conf/fastcgi_params.default
nginx/conf/fastcgi.conf
nginx/conf/fastcgi.conf.default
nginx/conf/uwsgi_params
nginx/conf/uwsgi_params.default
nginx/conf/scgi_params
nginx/conf/scgi_params.default
nginx/conf/nginx.conf.default
nginx/conf/nginx.conf.bak
nginx/conf/htpasswd
nginx/conf/aminglinux.key
nginx/conf/aminglinux.csr
nginx/conf/aminglinux.crt
nginx/logs/
nginx/logs/error.log
nginx/logs/access.log
nginx/logs/nginx_error.log
nginx/html/
nginx/html/50x.html
nginx/html/index.html
nginx/html/1.php
nginx/client_body_temp/
nginx/proxy_temp/
nginx/fastcgi_temp/
nginx/uwsgi_temp/
nginx/scgi_temp/
3、将 nginx 各部分拷贝到 ansible 下的对应目录下
[root@arslinux-01 local]# cp nginx.tar.gz /etc/ansible/nginx_install/roles/install/files/
[root@arslinux-01 local]# cp nginx/conf/nginx.conf /etc/ansible/nginx_install/roles/install/templates/
[root@arslinux-01 local]# cp /etc/init.d/nginx /etc/ansible/nginx_install/roles/install/templates/
4、定义 common 的 tasks,nginx 是需要一些依赖包的
[root@arslinux-01 local]# cd /etc/ansible/nginx_install/roles/common/
[root@arslinux-01 common]# vim tasks/main.yml
- name: Install initializtion require software
yum: name={{ item }} state=installed
with_items:
- zlib-devel
- pcre-devel
这里也可以写成 yum: name="pcre-devel,zlib-devel" state=installed
5、定义变量
[root@arslinux-01 common]# cd ../install/
[root@arslinux-01 install]# vim vars/main.yml
nginx_user: www
nginx_port: 80
nginx_basedir: /usr/local/nginx
6、首先要把所有用到的文档拷贝到目标机器
[root@arslinux-01 install]# vim tasks/copy.yml
- name: Copy Nginx Software
copy: src=nginx.tar.gz dest=/tmp/nginx.tar.gz owner=root group=root
- name: Uncompression Nginx Software
shell: tar zxf /tmp/nginx.tar.gz -C /usr/local/
- name: Copy Nginx Start Script
template: src=nginx dest=/etc/init.d/nginx owner=root group=root mode=0755
- name: Copy Nginx Config
template: src=nginx.conf dest={{ nginx_basedir }}/conf/ owner=root group=root mode=0644
说明:src 不用写绝对路径,因为会自动在 files 下去找;templates,它是一个模块功能,与 copy 不同的是他的文本文件采用了 jinga2 语法,copy 模块会到 files 下去找,而 template 模块会到 template 目录下去找,不需要单独定义
7、创建用户,启动服务,删除压缩包
[root@arslinux-01 install]# vim tasks/install.yml
- name: Create Nginx User
user: name={{ nginx_user }} state=present createhome=no shell=/sbin/nologin
- name: Start Nginx Service
shell: /etc/init.d/nginx start
- name: Add Boot Start Nginx Service
shell: chkconfig --level 345 nginx on
- name: Delete Nginx compression files
shell: rm -rf /tmp/nginx.tar.gz
说明:变量 nginx_user 在 var 下的 main.yml 中定义;用 chkconfig 来启动 nginx 而不是 systemctl
8、再创建 main.yml 并且把 copy 和 install 调用
[root@arslinux-01 install]# vim tasks/main.yml
- include: copy.yml
- include: install.yml
说明:可以将 tasks 目录下的 copy.yml 和 install.yml 和在一个 yml 文件下,不过分开更便于查看
到此两个 roles:common 和 install 就定义完成了,接下来要定义一个入口配置文件
9、定义入口配置文件
[root@arslinux-01 install]# vim /etc/ansible/nginx_install/install.yml
---
- hosts: 192.168.194.132
remote_user: root
gather_facts: True
roles:
- common
- install
10、执行操作
[root@arslinux-01 install]# ansible-playbook /etc/ansible/nginx_install/install.yml
PLAY [192.168.194.132] *********************************************************************************************************
TASK [Gathering Facts] *********************************************************************************************************
ok: [192.168.194.132]
TASK [common : Install initializtion require software] *************************************************************************
[DEPRECATION WARNING]: Invoking "yum" only once while using a loop via squash_actions is deprecated. Instead of using a loop to
supply multiple items and specifying `name: "{{ item }}"`, please use `name: ['zlib-devel', 'pcre-devel']` and remove the
loop. This feature will be removed in version 2.11. Deprecation warnings can be disabled by setting deprecation_warnings=False
in ansible.cfg.
ok: [192.168.194.132] => (item=[u'zlib-devel', u'pcre-devel'])
TASK [install : Copy Nginx Software] *******************************************************************************************
changed: [192.168.194.132]
TASK [install : Uncompression Nginx Software] **********************************************************************************
[WARNING]: Consider using the unarchive module rather than running 'tar'. If you need to use command because unarchive is
insufficient you can add 'warn: false' to this command task or set 'command_warnings=False' in ansible.cfg to get rid of this
message.
changed: [192.168.194.132]
TASK [install : Copy Nginx Start Script] ***************************************************************************************
changed: [192.168.194.132]
TASK [install : Copy Nginx Config] *********************************************************************************************
changed: [192.168.194.132]
TASK [install : Create Nginx User] *********************************************************************************************
changed: [192.168.194.132]
TASK [install : Start Nginx Service] *******************************************************************************************
changed: [192.168.194.132]
TASK [install : Add Boot Start Nginx Service] **********************************************************************************
changed: [192.168.194.132]
TASK [install : Delete Nginx compression files] ********************************************************************************
[WARNING]: Consider using the file module with state=absent rather than running 'rm'. If you need to use command because file
is insufficient you can add 'warn: false' to this command task or set 'command_warnings=False' in ansible.cfg to get rid of
this message.
changed: [192.168.194.132]
PLAY RECAP *********************************************************************************************************************
192.168.194.132 : ok=10 changed=8 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
运行流程参考图:
11、查看
[root@arslinux-02 ~]# netstat -lntp
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:80 0.0.0.0:* LISTEN 9877/nginx: master
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 6730/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 7056/master
tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN 6741/zabbix_agentd
tcp6 0 0 :::3306 :::* LISTEN 6971/mysqld
tcp6 0 0 :::111 :::* LISTEN 1/systemd
tcp6 0 0 :::80 :::* LISTEN 9877/nginx: master
tcp6 0 0 :::22 :::* LISTEN 6730/sshd
tcp6 0 0 ::1:25 :::* LISTEN 7056/master
tcp6 0 0 :::10050 :::* LISTEN 6741/zabbix_agentd
[root@arslinux-02 ~]# ll /etc/init.d/
总用量 56
-rw-r--r--. 1 root root 18281 8月 24 2018 functions
-rwxr-xr-x 1 root root 10592 6月 1 16:54 mysqld
-rwxr-xr-x. 1 root root 4569 8月 24 2018 netconsole
-rwxr-xr-x. 1 root root 7923 8月 24 2018 network
-rwxr-xr-x 1 root root 1141 8月 6 22:39 nginx
-rw-r--r--. 1 root root 1160 10月 31 2018 READM
因为没有 nginx.conf 未配置虚拟主机,80 端口也就不存在,
总结说明:总入口文件 install.yml 定义对哪台机器进行操作,可以定义 role 也就是子目录、子 playbook 脚本;common 里面会去找 tasks,tasks 会去找其中的 main.yml,操作都会先去找 tasks;install 里一样会去找 tasks,tasks 会去找 main.yml,而 main.yml 又包含两个同目录下的 copy.yml 和 install.yml,他们会分别执行
24.29/24.30 playbook 管理配置文件
管理 nginx 配置文件的 playbook
1、创建目录
[root@arslinux-01 ~]# mkdir -p /etc/ansible/nginx_config/roles/{new,old}/{files,handlers,vars,tasks}
[root@arslinux-01 ~]# cd /etc/ansible/nginx_config/
[root@arslinux-01 nginx_config]# ls roles/
new/ old/
说明:其中 new 为更新时用到的,old 为回滚时用到的,files 下面为 nginx.conf 和 vhosts 目录,handlers 为重启 nginx 服务的命令
关于回滚,需要在执行 playbook 之前先备份一下旧的配置,所以对于老配置文件的管理一定要严格,千万不能随便去修改线上机器的配置,并且要保证 new/files 下面的配置和线上的配置一致
2、把 nginx.conf 和 vhosts 目录放到 files 目录下面
[root@arslinux-01 nginx_config]# cd /usr/local/nginx/conf/
[root@arslinux-01 conf]# cp -r nginx.conf vhost/ /etc/ansible/nginx_config/roles/new/files/
3、定义变量
[root@arslinux-01 conf]# vim /etc/ansible/nginx_config/roles/new/vars/main.yml nginx_basedir: /usr/local/nginx
4、定义重新加载 nginx 服务
[root@arslinux-01 conf]# vim /etc/ansible/nginx_config/roles/new/handlers/main.yml - name: restart nginx shell: /etc/init.d/nginx reload
5、定义核心任务(拷贝配置、加载 handlers)
[root@arslinux-01 conf]# vim /etc/ansible/nginx_config/roles/new/tasks/main.yml - name: copy conf file copy: src={{ item.src }} dest={{ nginx_basedir }}/{{ item.dest }} backup=yes owner=root group=root mode=0644 with_items: - { src: nginx.conf, dest: conf/nginx.conf } - { src: vhost, dest: conf/ } notify: restart nginx
6、定义总入口配置文件
[root@arslinux-01 conf]# vim /etc/ansible/nginx_config/update.yml --- - hosts: 192.168.194.132 user: root roles: - new
7、执行
[root@arslinux-01 conf]# ansible-playbook /etc/ansible/nginx_config/update.yml PLAY [192.168.194.132] ********************************************************************************************************* TASK [Gathering Facts] ********************************************************************************************************* ok: [192.168.194.132] TASK [new : copy conf file] **************************************************************************************************** ok: [192.168.194.132] => (item={u'dest': u'conf/nginx.conf', u'src': u'nginx.conf'}) changed: [192.168.194.132] => (item={u'dest': u'conf/', u'src': u'vhost'}) RUNNING HANDLER [new : restart nginx] ****************************************************************************************** changed: [192.168.194.132] PLAY RECAP ********************************************************************************************************************* 192.168.194.132 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@arslinux-02 ~]# ps aux|grep nginx root 6776 0.0 0.2 46112 2944 ? Ss 20:05 0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf nobody 8409 0.0 0.4 48600 4020 ? S 20:52 0:00 nginx: worker process nobody 8410 0.0 0.4 48600 4020 ? S 20:52 0:00 nginx: worker process root 8437 0.0 0.0 112724 988 pts/0 R+ 20:54 0:00 grep --color=auto nginx [root@arslinux-02 ~]# date 2019年 08月 07日 星期三 20:53:05 CST
8、更改 vhost 参数,更新后查看
[root@arslinux-01 conf]# echo 1111 >> /etc/ansible/nginx_config/roles/new/files/nginx.conf [root@arslinux-01 conf]# ansible-playbook /etc/ansible/nginx_config/update.yml PLAY [192.168.194.132] ********************************************************************************************************* TASK [Gathering Facts] ********************************************************************************************************* ok: [192.168.194.132] TASK [new : copy conf file] **************************************************************************************************** changed: [192.168.194.132] => (item={u'dest': u'conf/nginx.conf', u'src': u'nginx.conf'}) ok: [192.168.194.132] => (item={u'dest': u'conf/', u'src': u'vhost'}) RUNNING HANDLER [new : restart nginx] ****************************************************************************************** changed: [192.168.194.132] PLAY RECAP ********************************************************************************************************************* 192.168.194.132 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@arslinux-02 ~]# tail -3 /usr/local/nginx/conf/nginx.conf include vhost/*.conf; } 1111
9、回滚操作
回滚操作就是把旧的配置覆盖,然后重新加载 nginx 服务, 每次改动 nginx 配置文件之前先备份到 old 里,对应目录为 /etc/ansible/nginx_config/roles/old/files,回滚的 backup.yml 对应的 roles 为 old
1)备份
[root@arslinux-01 conf]# rsync -av /etc/ansible/nginx_config/roles/new/ /etc/ansible/nginx_config/roles/old/
2)定义回滚操作的总入口
[root@arslinux-01 nginx_config]# cp update.yml rollback.yml [root@arslinux-01 nginx_config]# vim rollback.yml --- - hosts: 192.168.194.132 user: root roles: - old
3)模拟更改配置内容
[root@arslinux-01 nginx_config]# echo 21232332 >> /etc/ansible/nginx_config/roles/new/files/nginx.conf [root@arslinux-01 nginx_config]# ansible-playbook update.yml [root@arslinux-02 ~]# tail -3 /usr/local/nginx/conf/nginx.conf } 1111 21232332
4)回滚执行操作
[root@arslinux-01 nginx_config]# ansible-playbook rollback.yml [root@arslinux-02 ~]# tail -3 /usr/local/nginx/conf/nginx.conf include vhost/*.conf; } 1111
总结:每次变更,update 之前先将配置文件备份再更改,改完在 playbook update,有问题可以回滚
以下是几个示例,帮助你巩固playbook的用法
示例: https://blog.51cto.com/215687833/1888534
示例:https://www.cnblogs.com/xuyingzhong/p/8466976.html
示例:http://www.yfshare.vip/2017/03/16/Ansible-Playbooks%E4%B9%8B%E5%AE%89%E8%A3%85Mysql/