一、循环
playbook中的循环一般使用loop赋值列表搭配item变量进行迭代来实现,可以设置简单的单变量与多变量字典列表循环。loop写在play片段中与name同级。
loop: ##单变量
- westos1
- westos2
- ...
{{item}} ##引用
loop: ##多变量 字典列表
- name: westos1
age: 18
- name: westos2
age: 20
- ...
{{item['name']}} ##引用
{{item['age']}}
实例:
建立用户westos1-3,密码分别为123、456、789
---
- name:
hosts: all
tasks:
- name: user
user:
name: "{{item['NAME']}}"
state: present
password: "{{item['PASSWD']}}"
loop:
- NAME: westos1
PASSWD: $6$KrDUPp7kcHC6z8vb$TZpXIp0bDwHlltHWP.Jt3Y9/fSY4t1ZorNNWB08jOZtPN4daLS1vaLiS1Ju9kpZNNM6awrIkffBNwt99TDina1 ##openssl passwd -6 生成
- NAME: westos2
PASSWD: $6$IPSOjPujSt1c3.GI$kCYoxalePiJexVqVgl3QJV2BHZfQ/8H7a9tbhVtPVSTpfzAJ76UkrDWgYYE1HI9aF6dGly2OIrnJTduwUvAvN/
- NAME: westos3
PASSWD: $6$YqBHyeJFulqsZtHy$XFegXoT3NufZXwj8pGrIhBgsgQlfAnFdQH1HuxbnZnJyZwbPNZsu5xyVMZFP4zwE045XGZtk5osUmmjOsZOjw1
二、条件
when 控制所在的play片段的执行,满足成立则执行,不满足条件则不执行。when也是在play片段内书写,与name同级。
when: ##一个条件
- 条件1
when: ##两个条件同时满足才执行 and
- 条件1
- 条件2
when: > ##两个条件满足其中一个则执行 or
条件1
or
条件2
条件判断(value意为变量) | 描述 |
value == "字符串",value == 数字 | 变量等于 |
value < 数字 | 变量小于 |
value > 数字 | 变量大于 |
value <= 数字 | 变量小于等于 |
value >= 数字 | 变量大于等于 |
value != 数字 | 变量不等于 |
value is defined | 变量存在 |
value is not defined | 变量不存在 |
value is in value | 变量为 |
value is not in value | 变量不为 |
value | 变量的bool值为true |
not value | 变量的bool值为false |
value in value2 | value的值在value2列表中 |
测试:
建立playbook ~/ansibles/lvm.yml要求如下:
*建立大小为1500M名为exam_lvm的lvm 在westos组中
*如果westos不存在请输出:
vg westos is not exist
*如果westos大小不足1500M请输出:
vg westos is less then 1500M
并建立800M大小的lvm
---
- name: create exam_lv
hosts: all
tasks:
- name: show massage
debug:
msg: westos is not exist
when: ansible_facts['lvm']['vgs']['westos'] is not defined
- name: create_1500Mlvm
lvol:
lv: exam_lvm
vg: westos
size: 1500M
when: ansible_facts['lvm']['vgs']['westos'] is defined
ignore_errors: yes
register: OUTPUT
- name: check massage
debug:
msg: westos is less then 1500M
when:
- ansible_facts['lvm']['vgs']['westos'] is defined
- OUTPUT.rc is defined
- name: create_800Mlvm
lvol:
lv: exam_lvm
vg: westos
size: 800M
when:
- ansible_facts['lvm']['vgs']['westos'] is defined
- OUTPUT.rc is defined
效果:
受控主机有三台,50中westos组足够1500M、100中westos组不足1500M、150中没有wstos组
playbook符合要求
三、触发器
notify: ##当前play片段执行后,受控主机有更改(显示黄色),则触发指定的handlers中的动作,与所在play片段的那么同级。
handlers: ##触发器触发后执行的动作,与当前playbook的tasks、hosts等同级。
四、处理失败任务
1. ignore_errors
当play遇到任务失败不会终止playbook
ignore_errors: yes ##将会忽略当前任务失败继续运行下面的任务,默认为no,与play片段中的name同级
2. force_handlers
当任务失败后play被终止也会调用触发器进程
force_handlers: yes ##与playbook中的hosts、tasks同级
3. changed_when
强制控制所在play片段是否报告changed
changed_when: true | false
演示:
当前执行test.yml,报告为ok
加上changed_when: true后执行,报告为changed
4. failed_when
当符合条件时强制任务失败
failed_when: true ##强制play任务失败
failed_when: false ##强制play任务成功
failed_when: 条件 ##满足条件时,强制play任务失败
5. block、rescue、always 关键字
关键字 | 描述 |
block | 定义首要要运行的任务,与rescue成对出现 |
rescue | 定义当block中出现失败任务后运行的任务,与block成对出现 |
always | 定义最终独立运行的任务 |
测试:
建立playbook ~/westos.yml要求为:建立大小为1500M名为/dev/vdb1的设备;如果/dev/vdb不存在输出/dev/vdb is not exist;如果/dev/vdb大小不足2G请输出/dev/vdb is less then 2G,并建立800M大小的/dev/vdb1;将vdb1挂载到/westos上。
思路分析:
建立/westos
检测/dev/vdb是否存在
1. 不存在则输出/dev/vdb is not exist
2. 存在则 block-建立2G的vdb1
1)执行成功说明vdb足够2G,触发:删除2G的vdb1、建立 1500M的vdb1、 格式化、建立挂载点、永久挂载
2)执行失败说明vdb不足2G,rescue-建立800M的vdb1,触发格式化、建 立挂载点、永久挂载
---
- name: create_vdb1
hosts: all
tasks:
- name: check /dev/vdb
debug:
msg: /dev/vdb is not exist
when: ansible_facts['devices']['vdb'] is not defined
- name: create_vdb1
block:
- name: check_2G
parted:
device: /dev/vdb
number: 1
state: present
part_end: 2GiB
when: ansible_facts['devices']['vdb'] is defined
notify:
- remove_2G
- create_1500M
- create_filesystem
- touch_westos
- mount_vdb1
rescue:
- name: create_800M
parted:
device: /dev/vdb
number: 1
state: present
part_end: 800MiB
when:
- ansible_facts['devices']['vdb'] is defined
notify:
- show_message
- create_filesystem
- touch_westos
- mount_vdb1
handlers:
- name: show_message
debug:
msg: /dev/vdb is less then 2G
- name: remove_2G
parted:
device: /dev/vdb
number: 1
state: absent
- name: create_1500M
parted:
device: /dev/vdb
number: 1
state: present
part_end: 1500MiB
- name: create_filesystem
filesystem:
fstype: xfs
dev: /dev/vdb1
force: yes
- name: touch_westos
file:
path: /westos
state: directory
- name: mount_vdb1
mount:
path: /westos
src: /dev/vdb1
fstype: xfs
state: mounted
效果:
当前受控主机有三台,50中/dev/vdb足够2G、100中/dev/vdb不足2G、150中没有/dev/vdb
此playbook符合要求