目录
handlers-触发器
when-判断
循环
单变量循环
多变量循环
Jinja2-模板
include-引用
roles-角色
vault-加密
handlers-触发器
配合notify使用,通过notify监控是否发生改动,从而触发handlers。
handlers是在task全部执行完之后再执行。
下发nfs配置文件并重启:
- hosts: nfstasks:- name: 发文件copy:src: /etc/exportsdest: /etc/exportsbackup: yesnotify:- 重启nfshandlers:- name: 重启nfssystemd:name: nfsstate: reloaded
执行过程:
[root@m01 ~]# ansible-playbook handlers.ymlPLAY [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: allgather_facts: notasks:- name: install htopyum:name: htopstate: installedwhen: ansible_hostname == "web01"
对不符合条件的主机会skipping跳过。
[root@m01 ~]# ansible-playbook when.ymlPLAY [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: nfsgather_facts: notasks:- name: 重启rpcbind,nfssystemd:name: "{{ item }}"state: restartedloop:- rpcbind- nfs
[root@m01 ~]# ansible-playbook loop.ymlPLAY [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: nfsgather_facts: notasks:- name: 创建用户user:name: "{{ item.name }}"uid: "{{ item.uid }}"state: presentloop:- { name: wang1, uid: 3000 }- { name: wang2, uid: 3001 }
[root@m01 ~]# ansible-playbook loop2.ymlPLAY [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: alltasks:- name: 分发文件template:src: /root/template.j2dest: /etc/host.j2backup: yes
运行结果:
[root@nfs01 ~]# cat /etc/host.j2
主机名:nfs01
版本:CentOS
include-引用
将一个较大的剧本拆分多个剧本。tasks比较多时,可以将tasks写在独立的文件内,通过include引用。
playbook:
- hosts: backuptasks:- include_tasks: yum_install.yml- hosts: webtasks:- include_tasks: yum_remove.yml
include文件:
- name: install_htopyum:name: htopstate: present
- name: remove_htopyum:name: htopstate: 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: nfsroles:- 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