24.21 ansible安装包和管理服务
24.22 使用ansible playbook
24.23 playbook里的变量
24.24 playbook里的循环
24.25 playbook里的条件判断
24.26 playbook中的handlers
24.21 ansible安装包和管理服务
远程安装软件
格式:ansible 主机名/主机组 -m yum -a "name=软件名 state=installed"
1
[root@kun01 ~]# ansible testhost -m yum -a "name=httpd state=installed"
在kun02上1
2[root@kun02 ~]# rpm -qa httpd ##已经安装了httpd
httpd-2.4.6-80.el7.centos.1.x86_64
卸载软件
格式:ansible 主机名/主机组 -m yum -a "name=软件名 state=removed"
1
[root@kun01 ~]# ansible testhost -m yum -a "name=httpd state=removed"
在kun02上1
[root@kun02 ~]# rpm -qa httpd ##没有显示任何包已安装
远程启动服务
格式:ansible 主机名/主机组 -m service -a "name=服务名 state=started enabled=yes"
1
[root@kun01 ~]# ansible testhost -m service -a "name=httpd state=started enabled=yes"
ansible查询文档
类似与man命令
查询ansible所有模块
格式:ansible-doc -l
1
[root@kun02 ~]# ansible-doc -l
查询某个模块的参数
格式:ansible-doc 模块名
1
[root@kun01 ~]# ansible-doc copy
24.22 使用ansible playbook
playbook是把模块写入到一起的配置文件。方便管理,playbook文件已yml结尾,类似shell脚本
编辑playbook文件
1 | [root@kun01 ~]# cd /etc/ansible/ |
第一行
需要有三个杠
,hosts
参数指定了对哪些主机进行参作,如果是多台机器可以用逗号
作为分隔,也可以使用主机组
,在/etc/ansible/hosts
里定义;user
参数指定了使用什么用户登录远程主机操作;tasks
指定了一个任务,其下面的name参数同样是对任务的描述,在执行过程中会打印出来;shell
是ansible模块名字
执行playbook文件
格式:ansible-playbook yml名
1
[root@kun01 ansible]# ansible-playbook test.yml
在kun02上1
2[root@kun02 ~]# ls -l /tmp/kun.txt
-rw------- 1 root root 4 9月 12 21:22 /tmp/kun.txt
24.23 playbook里的变量
创建一个远程创建用户的playbook1
2
3
4
5
6
7
8
9
10
11
12[root@kun01 ansible]# vim create_user.yml
---
- name: create_user
hosts: 192.168.80.102
user: root
gather_facts: false
vars:
- user: "kun1"
tasks:
- name: create user
user: name="{{ user }}"
name
参数对该playbook实现的功能做一个概述,后面执行过程中,会打印 name变量的值 ,可以省略;gather_facts
参数指定了在以下任务部分执行前,是否先执行setup模块获取主机相关信息,这在后面的task会使用到setup获取的信息时用到;vars
参数,指定了变量,这里指变量名是user,其值为test ,需要注意的是,变量值一定要用引号引住;
最后一个user指调用user模块,name是user模块里的一个参数,而增加的用户名字调用了上面user变量的值。引用变量用 {{变量名}}1
2
3
4
5
6
7
8
9[root@kun01 ansible]# ansible-playbook create_user.yml
PLAY [create_user] **********************************************************************************************
TASK [create user] **********************************************************************************************
changed: [192.168.80.102]
PLAY RECAP ******************************************************************************************************
192.168.80.102 : ok=1 changed=1 unreachable=0 failed=0
在kun02上1
2[root@kun02 ~]# id kun1
uid=1003(kun1) gid=1003(kun1) 组=1003(kun1)
24.24 playbook循环
创建一个更改文件权限的playbook1
2
3
4
5
6
7
8
9
10
11
12
13
14[root@kun01 ansible]# vim while.yml
---
- name: change mode for file
hosts: 192.168.80.102
user: root
gather_facts: false
tasks:
- name: change mode for file
file: path=/tmp/{{ item }} state=touch mode=600
with_items:
- 1.txt
- 2.txt
- 3.txt
with_items
指定循环的对象 state=touch
为了创建文件1
2
3
4
5
6
7
8
9
10
11[root@kun01 ansible]# ansible-playbook while.yml
PLAY [change mode for file] *************************************************************************************
TASK [change mode for file] *************************************************************************************
changed: [192.168.80.102] => (item=1.txt)
changed: [192.168.80.102] => (item=2.txt)
changed: [192.168.80.102] => (item=3.txt)
PLAY RECAP ******************************************************************************************************
192.168.80.102 : ok=1 changed=1 unreachable=0 failed=0
在kun02上1
2
3
4[root@kun02 ~]# ll /tmp/*.txt ##创建文件 权限是600
-rw------- 1 root root 0 9月 12 22:47 /tmp/1.txt
-rw------- 1 root root 0 9月 12 22:47 /tmp/2.txt
-rw------- 1 root root 0 9月 12 22:47 /tmp/3.txt
24.25 playbook中的条件判断
创建一个判断gather facter信息是否该IP的playbook1
2
3
4
5
6
7
8
9[root@kun01 ansible]# vim when.yml
---
- name: use when
hosts: testhost
tasks:
- name: use when
shell: touch /tmp/when.txt
when: ansible_ens33.ipv4.address=="192.168.80.101"
when
就是if判断 当gather fact中的ansible_ens33的.ipv4的address等于192.168.80.101就会执行shell模块1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17[root@kun01 ansible]# ansible-playbook when.yml
PLAY [use when] *************************************************************************************************
TASK [Gathering Facts] ******************************************************************************************
ok: [192.168.80.102]
ok: [127.0.0.1]
TASK [use when] *************************************************************************************************
skipping: [192.168.80.102]
[WARNING]: Consider using file module with state=touch rather than running touch
changed: [127.0.0.1]
PLAY RECAP ******************************************************************************************************
127.0.0.1 : ok=2 changed=1 unreachable=0 failed=0
192.168.80.102 : ok=1 changed=0 unreachable=0 failed=0
查看主机的gather fact信息
gather fact用于收集主机的信息
格式:ansible 主机名/主机组 -m setup
1
[root@kun01 ansible]# ansible testhost -m setup
24.26 playbook中的handlers
handlers
类似&&
当前一个模块执行成功后就会执行handlers模块 前模块要notify
来指定执行哪个handlers模块。一般在服务器发生变化之后要执行的一些操作,比如我们修改了配置文件后,需要重启一下服务的时候
都会使用handlers1
2
3
4
5
6
7
8
9
10
11
12
13
14[root@kun01 ansible]# vim handlers.yml
---
- name: use handlers
hosts: 192.168.80.102
gather_facts: false
user: root
tasks:
- name: copy file
copy: src=/etc/passwd dest=/tmp/handlers.txt
notify: test handlers
handlers:
- name: test handlers
shell: echo "11111" >> /tmp/handlers.txt
只有copy模块真正执行后,才会去调用下面的handlers相关的操作。当copy不成功,并不会去执行handlers里面的shell相关命令。 这种比较适合配置文件发生更改后,重启服务的操作
。1
2
3
4
5
6
7
8
9
10
11
12[root@kun01 ansible]# ansible-playbook handlers.yml
PLAY [use handlers] *********************************************************************************************
TASK [copy file] ************************************************************************************************
changed: [192.168.80.102]
RUNNING HANDLER [test handlers] *********************************************************************************
changed: [192.168.80.102]
PLAY RECAP ******************************************************************************************************
192.168.80.102 : ok=2 changed=2 unreachable=0 failed=0
在kun02上1
2[root@kun02 ~]# tail -1 /tmp/handlers.txt
11111