一、流程控制
1、handlers触发器
应用场景:一般用于分发配置文件的时候.
如果配置文件发生变化则重启服务,如果没有变化则重启.
案例01: 没有使用触发器handlers
yaml
- hosts: web
gather_facts: no
tasks:
- name: 分发配置文件
copy:
src: exports
dest: /data/exports
backup: yes
notify:
- 重启服务
handlers:
- name: 重启服务
systemd:
name: nfs
state: reloaded
- handlers触发器,应用场景:配置文件发生变化,然后重启服务(或做其他)
- 格式:埋雷:设置绊雷(notify:写个名字),handlers设置名字和模块
- 注意事项:handlers放在剧本的最后,否则都会被识别为handlers.
2、when判断
用于给ans运行的task(模块)设置条件,满足或不满足条件在运行对应的模块.
应用建议: when进行判断,一般与变量一起使用.
when条件一般与facts变量或register变量一起使用.
案例02 : 如果系统是centos则 安装sl,cowsay,如果是ubuntu 则安装cmatrix
yaml
- hosts: all
tasks:
- name: yum sl,cowsay
yum:
name: sl,cowsay
state: installed
when: ansible_distribution == "CentOS"
- name: apt cmatrix
apt:
name: cmatrix
state: present
when: ansible_distribution == "Ubuntu"
ssh安全策略:禁止root账号登录
sh[root@nanjing ssh]# vim /etc/ssh/sshd_config 修改内容:PermitRootLogin no [root@nanjing ssh]# systemctl reload sshd -> % ssh root@43.137.51.15 root@43.137.51.15's password: Permission denied, please try again. -> % ssh shishuwu@43.137.51.152 shishuwu@43.137.51.152's password: [root@nanjing shishuwu]# su - root [root@nanjing ~]# pwd /root
- when用于进行判断,满足/不满足条件就执行对应的模块(不满足条件的主机提示skip).
- when一般与变量一起使用.
- (条件1) and (条件2)
- (条件1) or (条件2)
- ansible_hostname is match("web|backup") #类似于grep,支持正则.
- ansible_hostname is not match("web|backup") #取反,排除.
3、循环
因为在 Ansible 2.5 版本之后,
with_items
被弃用,应该使用loop
或loop_control
替代。
loop 批量创建文件,批量添加用户,批量启动或重启服务.
案例03: 批量启动服务 rpcbind 然后 nfs服务
yaml
- hosts: nfs
gather_facts: no
tasks:
- name: 重启rpcbind,nfs
systemd:
name: "{{ item }}"
state: restarted
loop:
- rpcbind
- nfs
案例04 循环创建用户指定UID
yaml
hosts: all
gather_facts: no
tasks:
- name: add user
user:
shell: /bin/bash
name: "{{ item.name }}"
uid: "{{ item.uid }}"
state: present
loop:
- { name: 'oldboy', uid: 2020 }
- { name: 'lidao', uid: 2021 }
- { name: 'lidao996', uid: 2022 }
二、剧本调试
1、检查语法与单步执行
-C
--check 模拟运行,不作出改变,一些变量可能会提示报错,因为-C没有真正运行剧本
--syntax-check
只做语法检查,不运行.
高级: step 单步运行. y执行这个task,n忽略这个task,c自动运行
2、tag标签
tag标签类似于超市物品的分类,只不过tag标签是给ansible中的task进行分类.加上标记
运行剧本的时候运行指定的tag标签或排除某些tag.
sh
ansible-playbook -i hosts -t 04.start srv 14.deploy-nfs-tag.yml
运行剧本的时候
-t
运行的标签,如果多个标签通过","分割skip-tags
排除指定的tags,如果多个标签通过","分割
3、忽略错误
运行剧本的时候,因为重复运行导致的错误提示,并发是真的错误.
比如:目录已经存在,用户已经存在. 在这种情况下,我们可以通过ignore_errors忽略错误,让剧本可以继续运行.
sh
ignore_errors: true
三、Jinja2模版
template模块与xxx.j2文件
应用场景:
1、进行分发配置文件或文件的时候,需要在文件中使用变量,需要使用jinja2文件 nginx.conf.j2,需要使用template模块进行分发.
2、进行判断
3、进行循环
yaml
- hosts: all
gather_facts: no
tasks:
- name: 分发motd文件
template:
src: templates/motd.j2
dest: /etc/motd
backup: yes
- name: 分发motd文件
copy:
src: templates/motd.j2
dest: /tmp/motd
backup: yes
四、include文件包含
day42暂不更新,赶进度~~~