Ansible的when语句做条件判断

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

环境

  • 控制节点: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 failed
  • is succeeded
  • is skipped
  • is 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 defined
  • is undifined

例如:

---
- hosts: all
  tasks:
    - name: task1
      debug:
        msg: "OK"
      when: var1 is defined and var1

这是一种非常常见的用法。

在循环里使用条件判断

loopwhen 可以一起用,对每次循环做条件判断。例如,遍历文件每一行,若内容超过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] ***************
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值