环境
- 控制节点:Ubuntu 22.04
- Ansible 2.10.8
- 管理节点:CentOS 8
使用 when 语句做条件判断
创建文件 test1.yml 如下:
---
- hosts: all
tasks:
- name: task1
debug:
msg: "hello"
when: 1 > 0
- name: task2
debug:
msg: "OK"
when: 1 > 2
运行结果如下:
......
TASK [task1] ***************************************************************************************
ok: [192.168.1.55] => {
"msg": "hello"
}
TASK [task2] ***************************************************************************************
skipping: [192.168.1.55]
......
可见,task满足条件,所以运行了;task2不满足条件,所以没有运行。
多个条件之间可以做逻辑运算(与或非),比如:
when: ((1 > 0) and (1 < 2)) or (not (1 == 3))
多个 and 条件,也可以写成list的形式,比如:
when:
- 1 < 2
- 2 < 3
- 3 < 4
基于 ansible_facts 的条件判断
例如:
- name: task3
debug:
msg: "hello"
when: ansible_facts['os_family'] == "RedHat" #"Debian"
也可以先把ansible_facts先存为变量,再对变量做条件判断,比如:
- name: task5
block:
- name: part1
set_fact:
version: "{
{ ansible_facts['distribution_major_version'] }}"
- name: part2
debug:
msg: "Horse"
when: version | int >= 8
注:先用filter把变量转为int类型,再和整数8比较大小。
基于register变量的条件判断
这是一种常见的用法,上一个task把结果记录在变量里,下一个task根据该变量的值做条件判断。
---
- hosts: all
tasks:
- name: task1
shell: cat /tmp/a.txt | wc -l
register: result
- name: task2
debug:
msg: "More than 100 lines!"
when: result.stdout | int > 100
- 当文件超过100行时,结果如下:
......
TASK [task2] ***************************************************************************************
ok: [192.168.1.55] => {
"msg": "More than 100 lines!"
}
......
当文件不超过100行时,结果如下:
......
TASK [task2] ***************************************************************************************
skipping: [192.168.1.55]
......
对register变量,可作如下判断:
is failedis succeededis skippedis changed
例如:
---
- hosts: all
tasks:
- name: task1
ansible.builtin.command: /bin/false
register: result
ignore_errors: true
- name: task2
debug:
msg: "Task fails!"
when: result is failed
- name: task3
debug:
msg: "Task succeeds!"
when: result is succeeded
- name: task4
debug:
msg: "Task skipped!"
when: result is skipped
- name: task5
debug:
msg: "Task changed!"
when: result is changed
基于变量的条件判断
注意: when 语句里的变量,不需要加 {
{ }} 。
变量可转换成bool类型,例如:
---
- hosts: all
vars:
- var1: true
- var2: false
- var3: "yes"
- var4: "no"
tasks:
- name: task1
debug:
msg: "task1"
when: var1
- name: task2
debug:
msg: "task2"
when: not var2
- name: task3
debug:
msg: "task3"
when: var3 | bool
- name: task4
debug:
msg: "task4"
when: not (var4 | bool)
使用没有定义的变量会报错,所以,在使用变量前,可以先判断其是否定义:
is definedis undifined
例如:
---
- hosts: all
tasks:
- name: task1
debug:
msg: "OK"
when: var1 is defined and var1
这是一种非常常见的用法。
在循环里使用条件判断
loop 和 when 可以一起用,对每次循环做条件判断。例如,遍历文件每一行,若内容超过2个字符,则打印其内容:
---
- hosts: all
tasks:
- name: task1
shell: cat /tmp/a.txt
register: result
- name: task2
debug:
msg: "{
{ item }}"
loop: "{
{ result.stdout_lines }}"
when: item | length > 2
假设 a.txt 内容如下:
aaaaa
b
ccccc
则运行结果如下:
TASK [task2] ***************

本文详细介绍了如何在Ansible2.10.8环境下,利用when语句进行条件判断,包括基于变量、事实、文件内容、循环和import/include任务的条件控制,展示了多种情况下的任务执行和跳过策略。

1843

被折叠的 条评论
为什么被折叠?



