Ansible任务控制loop循环、when和block条件判断介绍演示
目录
一.循环迭代(loop/with_items)
1.作用
2.案例演示
(1)遍历输出以列表形式定义的abc
(2)遍历输出以变量定义的webservers组内主机
(3)遍历输出以字典定义的数据
(4)遍历嵌套定义的loop
二.条件判断(when)
1.作用
2.when语句的比较运算符
(1)!=/==用于比较两个对象是否不等/相等,可用于字符串、数字类型
(2)>/<,>=/<=用于比较两个对象的大小
3.when语句的逻辑运算符
(1)and,逻辑与,两个对象同真为真
(2)or,逻辑或,两个对象见真为真
(3)not,逻辑否,取反
(4)(),作为一个更大的表达式包含一组表达式
4.when语句的exists判断
(1)判断目录是否存在
(2)判断文件是否不存在,取反操作
5.when语句对于变量的判断
(1)defined,变量已被定义
(2)变量未被定义
(3)变量被定义为空
6.when语句对于结果的判断
(1)success/succeeded,failure/failed判断任务任性成功与否
(2)change/changed,skip/skipped判断任务执行状态
三.整体条件判断block
1.作用
2.block用法示例
3.block错误处理时用法演示
4.block固定执行用法演示
一.循环迭代(loop/with_items)
1.作用
主要是用于让管理节点在需要编写多个任务时的情况下仅用一个任务来进行循环迭代完成任务,使用loop关键字对目标进行迭代,在ansible相对比较旧的版本中使用的with_item平替,现在我的2.9.27仍然兼容,loop关键字内可以是列表、变量、字典等
2.案例演示
(1)遍历输出以列表形式定义的abc
[root@main playkongzhi]# cat loop1.yaml
---
- hosts: servera
tasks:
- name: test item
debug:
msg: "{{ item }}"
loop:
- 'a'
- 'b'
- 'c'
[root@main playkongzhi]# ansible-playbook loop1.yaml
ok: [servera] => (item=a) => {
"msg": "a"
}
ok: [servera] => (item=b) => {
"msg": "b"
}
ok: [servera] => (item=c) => {
"msg": "c"
}
(2)遍历输出以变量定义的webservers组内主机
[root@main playkongzhi]# cat loop1.yaml
---
- hosts: servera
tasks:
- name: test item
debug:
msg: "{{ item }}"
loop: "{{ groups.webservers }}"
[root@main playkongzhi]# ansible-playbook loop1.yaml
ok: [servera] => (item=servera) => {
"msg": "servera"
}
ok: [servera] => (item=serverb) => {
"msg": "serverb"
}
(3)遍历输出以字典定义的数据
循环输出hello和nihao
[root@main playkongzhi]# cat loop1.yaml
---
- hosts: servera
tasks:
- name: test item
debug:
msg: "{{ item }}"
loop:
- x1: 'hello'
- x2: 'nihao'
[root@main playkongzhi]# ansible-playbook loop1.yaml
ok: [servera] => (item={u'x1': u'hello'}) => {
"msg": {
"x1": "hello"
}
}
ok: [servera] => (item={u'x2': u'nihao'}) => {
"msg": {
"x2": "nihao"
}
}
(4)遍历嵌套定义的loop
循环创建user1和user2
[root@main playkongzhi]# cat loopuser.yaml
---
- hosts: servera
tasks:
- name: create user1 and user2
user:
name: "{{ item.name }}"
state: present
uid: "{{ item.uid }}"
loop:
- name: user1
uid: 1011
- name: user2
uid: 1012
[root@main playkongzhi]# ansible servera -a 'id user1'
servera | CHANGED | rc=0 >>
uid=1011(user1) gid=1011(user1) groups=1011(user1)
[root@main playkongzhi]# ansible servera -a 'id user2'
servera | CHANGED | rc=0 >>
uid=1012(user2) gid=1012(user2) groups=1012(user2)
二.条件判断(when)
1.作用
(1)条件判断用于此任务的结果依赖变量、fact或者是上一个任务的结果,用条件判断就可以决定如何去执行对应的任务。在节点上建立了限制,捕获那些命令的输出,结果不同,执行的任务要求不同。
(2)可以判断某服务的配置文件是否发生变动时考虑是否重启。
(3)可以根据cpu状况来定制合适的调优策略
2.when语句的比较运算符
(1)!=/==用于比较两个对象是否不等/相等,可用于字符串、数字类型
示例
[root@main playkongzhi]# cat bijiao.yaml
---
- hosts: servera
tasks:
- name: com them
debug:
msg: '等于'
when: name == owner
vars:
name: sulibao
owner: sulibao
ok: [servera] => {
"msg": "等于"
}
(2)>/<,>=/<=用于比较两个对象的大小
示例
[root@main playkongzhi]# cat bijiao.yaml
---
- hosts: servera
tasks:
- name: com them
debug:
msg: 'hello'
when: name >= owner
vars:
name: sul
owner: li
ok: [servera] => {
"msg": "hello"
}
3.when语句的逻辑运算符
(1)and,逻辑与,两个对象同真为真
[root@main playkongzhi]# cat when.yaml
---
- hosts: servera
tasks:
- name: dis info
debug:
msg: "yes"
when: 1 > 0 and 1 < 9
ok: [servera] => {
"msg": "yes"
}
(2)or,逻辑或,两个对象见真为真
[root@main playkongzhi]# cat when.yaml
---
- hosts: servera
tasks:
- name: dis info
debug:
msg: "yes"
when: 1 > 0 or 1 < 9
ok: [servera] => {
"msg": "yes"
}
(3)not,逻辑否,取反
[root@main playkongzhi]# cat when.yaml
---
- hosts: servera
tasks:
- name: dis info
debug:
msg: "yes"
when: not 1 > 0 and 1 < 9
skipping: [servera]
(4)(),作为一个更大的表达式包含一组表达式
[root@main playkongzhi]# cat when.yaml
---
- hosts: servera
tasks:
- name: dis info
debug:
msg: "yes"
when: (not 1 > 0 and 1 < 9) or 5 < 6
ok: [servera] => {
"msg": "yes"
}
4.when语句的exists判断
(1)判断目录是否存在
[root@main playkongzhi]# cat test.yaml
---
- hosts: servera
tasks:
- debug:
msg: "directory exist"
when: path is exists
vars:
path: /root
ok: [servera] => {
"msg": "directory exist"
}
(2)判断文件是否不存在,取反操作
[root@main playkongzhi]# cat test.yaml
---
- hosts: servera
tasks:
- debug:
msg: "file not exist"
when: not path is exists
vars:
path: /root/ansible.bak
ok: [servera] => {
"msg": "file not exist"
}
5.when语句对于变量的判断
(1)defined,变量已被定义
[root@main playkongzhi]# cat varswhen.yaml
---
- hosts: servera
tasks:
- name: test vars
debug:
msg: "var defined"
when: inventory_hostname is defined
ok: [servera] => {
"msg": "var defined"
}
(2)变量未被定义
[root@main playkongzhi]# cat varswhen.yaml
---
- hosts: servera
tasks:
- name: test vars
debug:
msg: "var undefined"
when: a is undefined
ok: [servera] => {
"msg": "var undefined"
}
(3)变量被定义为空
[root@main playkongzhi]# cat varswhen.yaml
---
- hosts: servera
vars:
a:
tasks:
- name: test vars
debug:
msg: "var none"
when: a is none
ok: [servera] => {
"msg": "var none"
}
6.when语句对于结果的判断
(1)success/succeeded,failure/failed判断任务任性成功与否
[root@main playkongzhi]# cat result.yaml
---
- hosts: servera
tasks:
- name: cd result
shell: "cd /cevd"
ignore_errors: true #为了测试结果完整,忽略错误
register: result
- name: test result
debug:
msg: "no directory /cevd"
when: not result is success
ok: [servera] => {
"msg": "no directory /cevd"
}
(2)change/changed,skip/skipped判断任务执行状态
[root@main playkongzhi]# cat result.yaml
---
- hosts: servera
tasks:
- name: cd result
shell: "touch /a.txt"
ignore_errors: true
register: result
- name: test result
debug:
msg: "touch success"
when: result is changed
ok: [servera] => {
"msg": "touch success"
}
三.整体条件判断block
1.作用
解决when语句多个判断需要书写多个when的情况,使用block将多个任务组合起来,对这个整体进行when条件判断,条件成立了才会去执行块中的所有任务。在playbook中可以给block定义name,也可以直接使用when,但不能直接对其使用loop循环。这里主要介绍block常规用法,rescue错误处理用法和always固定执行用法
2.block用法示例
[root@main playkongzhi]# cat block.yaml
---
- hosts: servera
tasks:
- name: carry block
block:
- name: free
shell: "free -m"
- name: echo
shell: "free -m > /a.txt"
when: 1 < 2
[root@main playkongzhi]# ansible servera -a 'cat /a.txt'
servera | CHANGED | rc=0 >>
total used free shared buff/cache available
Mem: 5848 306 5348 11 193 5313
Swap: 2047 0 2047
3.block错误处理时用法演示
没有/my目录,shell模块执行错误,执行rescue部分
注意:block模块中只要有一个任务执行失败都会跳转执行rescue部分
[root@main playkongzhi]# cat rescue.yaml
---
- hosts: servera
tasks:
- name: test rescue
block:
- shell: "ls /my"
rescue:
- debug:
msg: "no directory"
ok: [servera] => {
"msg": "no directory"
}
4.block固定执行用法演示
不管bloack块执行成功还是失败,都执行alway部分
[root@main playkongzhi]# cat always.yaml
---
- hosts: servera
tasks:
- name: test rescue
block:
- shell: "ls /my"
rescue:
- debug:
msg: "no directory"
always:
- debug:
msg: "there always"
ok: [servera] => {
"msg": "no directory"
}
ok: [servera] => {
"msg": "there always"
}