目录
handlers-触发器
配合notify使用,通过notify监控是否发生改动,从而触发handlers。
handlers是在task全部执行完之后再执行。
下发nfs配置文件并重启:
- hosts: nfs
tasks:
- name: 发文件
copy:
src: /etc/exports
dest: /etc/exports
backup: yes
notify:
- 重启nfs
handlers:
- name: 重启nfs
systemd:
name: nfs
state: reloaded
执行过程:
[root@m01 ~]# ansible-playbook handlers.yml
PLAY [nfs] ***************************************************************************************************************************************
TASK [Gathering Facts] ***************************************************************************************************************************
ok: [172.16.1.31]
TASK [发文件] ***************************************************************************************************************************************
changed: [172.16.1.31]
RUNNING HANDLER [重启nfs] **************************************************************************************************************************
changed: [172.16.1.31]
PLAY RECAP ***************************************************************************************************************************************
172.16.1.31 : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
when-判断
设置task运行的条件,满足添加后运行。
主机名为web01的安装软件:
- hosts: all
gather_facts: no
tasks:
- name: install htop
yum:
name: htop
state: installed
when: ansible_hostname == "web01"
对不符合条件的主机会skipping跳过。
[root@m01 ~]# ansible-playbook when.yml
PLAY [all] ***************************************************************************************************************************************
TASK [Gathering Facts] ***************************************************************************************************************************
ok: [172.16.1.41]
ok: [172.16.1.7]
ok: [172.16.1.31]
TASK [install htop] ******************************************************************************************************************************
skipping: [172.16.1.31]
skipping: [172.16.1.41]
ok: [172.16.1.7]
PLAY RECAP ***************************************************************************************************************************************
172.16.1.31 : ok=1 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
172.16.1.41 : ok=1 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
172.16.1.7 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
循环
在ansible中loop和with_items都可以循环。
单变量循环
存在循环时,item代表变量。
重启rpcbind和nfs服务:
- hosts: nfs
gather_facts: no
tasks:
- name: 重启rpcbind,nfs
systemd:
name: "{{ item }}"
state: restarted
loop:
- rpcbind
- nfs
[root@m01 ~]# ansible-playbook loop.yml
PLAY [nfs] ***************************************************************************************************************************************
TASK [重启rpcbind,nfs] *****************************************************************************************************************************
changed: [172.16.1.31] => (item=rpcbind)
changed: [172.16.1.31] => (item=nfs)
PLAY RECAP ***************************************************************************************************************************************
172.16.1.31 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
多变量循环
在loop或者with_itmes级别下每个列表中定义多个变量,引用时使用item.变量名
创建用户:
- hosts: nfs
gather_facts: no
tasks:
- name: 创建用户
user:
name: "{{ item.name }}"
uid: "{{ item.uid }}"
state: present
loop:
- { name: wang1, uid: 3000 }
- { name: wang2, uid: 3001 }
[root@m01 ~]# ansible-playbook loop2.yml
PLAY [nfs] ***************************************************************************************************************************************
TASK [创建用户] **************************************************************************************************************************************
ok: [172.16.1.31] => (item={u'name': u'wang1', u'uid': 3000})
ok: [172.16.1.31] => (item={u'name': u'wang2', u'uid': 3001})
PLAY RECAP ***************************************************************************************************************************************
172.16.1.31 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Jinja2-模板
template模块配合Jinja2模板一起使用,从管理机传送文件到被控机上并将模板中的变量解析。
Jinja2也有自己的语法。
模板文件后缀使用.j2。
jinja2模板:
主机名:{{ansible_hostname}}
版本:{{ansible_distribution}}
playbook:
- hosts: all
tasks:
- name: 分发文件
template:
src: /root/template.j2
dest: /etc/host.j2
backup: yes
运行结果:
[root@nfs01 ~]# cat /etc/host.j2
主机名:nfs01
版本:CentOS
include-引用
将一个较大的剧本拆分多个剧本。tasks比较多时,可以将tasks写在独立的文件内,通过include引用。
playbook:
- hosts: backup
tasks:
- include_tasks: yum_install.yml
- hosts: web
tasks:
- include_tasks: yum_remove.yml
include文件:
- name: install_htop
yum:
name: htop
state: present
- name: remove_htop
yum:
name: htop
state: absent
roles-角色
一个剧本目录结构规范,按照规范存放剧本的文件。
官方定义的roles目录有好几个,此处列了最常用的几个。
使用roles目录结构后,tasks中的各种应用都可以省略路径。
roles/
top.yml 主文件
hosts 主机清单
nfs-server/ 功能目录
files/ 存放文件,copy模块调用的目录
templates/ 存放模板文件(.j2),template模块调用的目录
tasks/main.yml tasks内容
handlers/main.yml handlers触发器内容
group_vars/ 变量目录
使用rules后,主文件(入口文件)不再写tasks,直接写roles即可,会自己调用tasks下的文件。tasks文件只需要写对应的tasks即可,并且tasks中对文件和变量的应用也无需制定路径。
主文件写法:
- hosts: nfs
roles:
- role: nfs-server #role下的功能目录名
vault-加密
对ansible需要使用的文件进行加密,如:hosts、变量文件、剧本文件等。
#加密文件
ansible-vault encrypt hosts
#使用,--ask-vault-pass
ansible all -m ping --ask-vault-pass
#解密文件
ansible-vault decrypt hosts