流程控制
handler
when
loop/with_items
---------------------------------------------------------
handlers触发器
应用场景:一般用于分发配置文件的时候.
如果配置文件发生变化则重启服务,如果没有变化则不重启。
案例01: 没有使用触发器handlers
---
- hosts: nfs
tasks:
- name: 分发配置文件
copy:
src: /etc/exports
dest: /etc/exports
backup: yes
- name: 重启服务
systemd:
name: nfs
state: reloaded
---------------------------------------------------------
案例01:使用handlers之后
---
- hosts: nfs
gather_facts: no
tasks:
- name: 分发配置文件
copy:
src: /etc/exports
dest: /etc/exports
backup: yes
notify:
- 重启服务
handlers:
- name: 重启服务
systemd:
name: nfs
state: reloaded
---------------------------------------------------------
handlers触发器,应用场景:配置文件发生变化,然后重启服务(或做其他)。
格式: 埋雷:设置绊雷(notify: 写个名字) , handlers设置名字和模块
注意事项: handlers放在剧本的最后,否则都会被识别为handlers
============================================================================
when判断
用于给ans运行的task(模块)设置条件,满足或不满足条件在运行对应的模块。
应用建议: when进行判断,一般与变量一起使用。
when条件一般与facts变量或register变量一起使用。
只想在web01上执行安装软件的操作
- hosts: all
tasks:
- name: 只有web01输出信息
debug:
msg: "这是web01,正在安装软件...."
when: ansible_hostname == "web01"
---------------------------------------------------------
when中使用的符号
==等于
≠不等于
is match(web)
ansible_hostname is match("web|backup") #类似于grep,正则。
ansible_hostname is not match("web|backup") #取反,排除
---------------------------------------------------------
案例02 : 如果系统是centos则 安装sl,cowsay,如果是ubuntu 则安装cmatrix
- hosts: all
tasks:
- name: yum sl,cowsay
yum:
name: sl,cowsay
state: installed
when: ansible_distribution == "CentOS"
#when:
- 条件一
- 条件二,这样写法,是and的写法
#when: 条件一 or 条件二
- name: apt cmatrix
apt:
name: cmatrix
state: present
when: ansible_distribution == "Ubuntu"
============================================================================
循环:包括2种:
with_*:with_items
loop
批量创建文件,批量添加用户,批量启动或重启服务
案例03: 批量启动服务 rpcbind 然后 nfs服务
- hosts: nfs
gather_facts: false
tasks:
- name: 重启服务
systemd:
name: "{{ item }}"
state: restarted
loops: #loops也可以写成with_item
- rpcbind
- nfs
---------------------------------------------------------
案例04 循环与多个变量例子
- hosts: all
gather_facts: false
tasks:
- name: add user
user:
name: "{{ item.name }}"
uid: "{{ item.uid }}"
state: present
loop:
- { name: 'zhangsan', uid: 2020 }
- { name: 'lisi', uid: 2021 }
- { name: 'wangwu', uid: 2022 }
============================================================================
剧本调试:
剧本单步执行
tag标签
忽略错误
---------------------------------------------------------
检查语法与单步执行
-C --check 模拟运行,不作出改变,一些变量可能会提示报错,因为-C没有真正运行剧本.
--syntax-check 只做语法检查,不运行。
高级:--step 单步运行. y执行这个task,n忽略这个task,c自动运行
---------------------------------------------------------
tag标签
tag标签类似于超市物品的分类,只不过tag标签是给ansible中的task进行分类--加上标记。
运行剧本的时候运行指定的tag标签或排除某些tag
-t 运行的标签,如果多个标签通过","分割
--skip-tags 排除指定的tags,如果多个标签通过","分割
----------------------------
- hosts: backup
tasks:
- name: 01. 部署nfs-utils,rpcbind
yum:
name: nfs-utils,rpcbind
state: present
tags:
- 01.install
- name: 02. 修改配置文件
......
执行:ansible-playbook -i hosts -t 01.install -C 14.deploy-nfs-tag.yml
---------------------------------------------------------
忽略错误
运行剧本的时候,因为重复运行导致的错误提示,并非是真的错误.
比如:目录已经存在,用户已经存在.
在这种情况下,我们可以通过ignore_errors忽略错误,让剧本可以继续运行
ignore_errors: true
true/false
yes/no