ansible中的任务执行控制
1 循环
循环迭代任务
1.1 简单循环
(1)格式
loop: ##赋值列表
- value1
- value2
- ...
{{item}} ##迭代变量名称
(2)loop使用的示例
- 题目: 利用loop在受控主机建立多个文件
---
- name: loop
hosts: list1
tasks:
- name: touch file
file:
path: /opt/{{item}} ##迭代变量
state: touch
loop: ##赋值列表
- file1
- file2
...
测试结果
1.2 循环散列或字典列表
实例:
---
- name: loop
hosts: list1
tasks:
- name: touch file
file:
path: /opt/{{item.name}}
owner: "{{item.owner}}"
state: touch
loop:
- name: file1 ##字典列表
owner: westos
- name: file2
owner: root
...
测试
2 条件
格式:
when:
- 条件1
- 条件2
条件判断
= value == "字符串",value == 数字
< value < 数字
> value > 数字
<= value <= 数字
>= value >= 数字
!= value != 数字
is defined value value is defined ##变量存在
is not defined value is not defined ##变量不存在
bool变量 为true value ##value的值为true
bool变量 false not value ##value的值为false
value in value2 ##value的值在value2列表中
多条件组合
when:
条件1 and 条件2
- 条件1
- 条件2
when:
条件1 or 条件2
when: >
条件1
or
条件2
测试题:如果westos组不存在,报错;否则创建一个800M的lvm
查看lvm的信息:ansible list1 -m setup -a "filter=ansible_lvm"
---
- name: create lvm
hosts: list1
tasks:
- name:
debug:
msg: "westos is not exit"
when: ansible_facts['lvm']['vgs']['westos'] is not defined ##如果westos的vg组不存在,提示不存在
- lvol:
vg: westos
lv: westos
size: 800
when: ansible_facts['lvm']['vgs']['westos'] is defined ##创建一个800M的vg
---
- name: create lvm
hosts: list1
tasks:
- name:
debug:
msg: "westos is not exit"
- lvol:
vg: westos
lv: westos
state: absent
force: yes
when: ansible_facts['lvm'] is defined
3 触发器
notify: 触发器当遇到更改是触发handlers
handlers: 触发器触发后执行的动作
实例:配置ftp服务
---
- name: config vsftpd
hosts: list1
tasks:
- name: install vsftpd
dnf:
name: vsftpd
state: present
- name: config vsftpd.conf
template:
src: ./vsftpd.conf.j2
dest: /etc/vsftpd/vsftpd.conf
notify: restarted vsftpd ##当j2文件更改时会触动handlers
- name: config ftpdir
file:
path: /var/ftp/pub
mode: '775'
group: ftp
setype: "public_content_rw_t"
- name: set sebool
seboolean:
name: ftpd_anon_write
state: yes
persistent: yes
handlers:
- name: restarted vsftpd
service:
name: vsftpd
state: restarted
enabled: yes
...
4 处理失败任务
4.1 ignore_errors
作用:当play遇到任务失败时会终止
ignore_errors: yes 将会忽略任务失败使下面的任务继续运行
---
- name: config vsftpd
hosts: list1
tasks:
- name:
shell: rpm -q vsftpd ##如果vstftp未安装,会报错
ignore_errors: yes ##如果程序报错,会忽略错误,继续执行下面的命令
- name: install vsftpd
dnf:
name: vsftpd
state: present
...
4.2 force_handlers
- 作用:当任务失败后play被终止也会调用触发器进程
配置完成
---
- name: config vsftpd
force_handlers: yes ##执行过程中出错也会调用触发器进程,否则幸存程序将终止
hosts: list1
tasks:
- name: install vsftpd
dnf:
name: vsftpd
state: present
- name: config vsftpd.conf
template:
src: ./vsftpd.conf.j2
dest: /etc/vsftpd/vsftpd.conf
notify: restarted vsftpd ##当j2文件更改时会触动handlers
- name: firewalld
firewalld:
service: vsftpd ##执行到此处时会出错
permanent: yes
state: enabled
handlers:
- name: restarted vsftpd
service:
name: vsftpd
state: restarted
enabled: yes
当 force_handlers: no,或没有此语句时:
当脚本中force_handlers: yes时:如果执行过程中任务失败也会启动触发器
4.3 changed_when
- 作用:控制任务在何时报告它已进行更改
---
- name: config vsftpd
force_handlers: yes
hosts: list1
tasks:
- name: install vsftpd
dnf:
name: vsftpd
state: present
- name: config vsftpd.conf
template:
src: ./vsftpd.conf.j2
dest: /etc/vsftpd/vsftpd.conf
changed_when: true
notify: restarted vsftpd
handlers:
- name: restarted vsftpd
service:
name: vsftpd
state: restarted
enabled: yes
不更改j2模板文件, changed_when: false或者未定义 changed_when时:
不更改j2模板文件,脚本中changed_when: true时:
4.4 failed_when
作用:当符合条件时强制任务失败
---
- name: config vsftpd
force_handlers: yes
hosts: list1
tasks:
- name: check vsft
shell: rpm -q vsftpd
register: vsftpd_status ##注册变量
failed_when: vsftpd_status.rc==0 ##vsftp已经安装时强制任务失败
- name: install vsftpd
dnf:
name: vsftpd
state: present
- name: restarted vsftpd
service:
name: vsftpd
state: restarted
enabled: yes
4.5 block
block: ##定义要运行的任务
rescue: ##定义当block句子中出现失败任务后运行的任务
always: ##定义最终独立运行的任务
练习题:
建立大小为1500M名为/dev/vdb1的设备
如果/dev/vdb不存在请输入:
/dev/vdb is not exist
如果/dev/vdb大小不足2G请输出:
/dev/vdb is less then 2G
并建立800M大小的/dev/vdb1
此设备挂载到/westos上
ansible list1 -m setup
---
- name:
hosts: list1
tasks:
- block:
- name: create vdb 2G
parted:
device: /dev/vdb
number: 1
state: present
part_end: 2GiB
- name: delete vdb 2G
parted:
device: /dev/vdb
number: 1
state: absent
- name: create vdb 1500MiB
parted:
device: /dev/vdb
number: 1
state: present
part_end: 1500MiB
when: ansible_facts['devices']['vdb'] is defined
rescue:
- debug:
msg: "vdb is less than 2G"
- name: create vdb1 800MiB
parted:
device: /dev/vdb
number: 1
state: present
part_end: 800MiB
always:
- name: Create filesystem on /dev/vdb1
filesystem:
fstype: xfs
dev: /dev/vdb1
force: yes
- name: mount
mount:
path: /westos
src: /dev/vdb1
fstype: xfs
opts: defaults
state: present
- name: vdb is not exit
debug:
msg: "vdb is not exit!!"
when: ansible_facts['devices']['vdb'] is not defined