Playbook 中用 when 实现条件判断,支持单个条件、组合逻辑(and/or/not)、事实与注册变量动态判断、模糊匹配及正则。变量不加 {{}},字符串除外;常用如主机名、系统类型、内存大小、变量存在性、命令结果等判断。

在 Playbook 中使用 when 实现条件判断是最常用、最直接的方式。它让某个 task 只在满足指定条件时才执行,否则跳过,不报错也不中断流程。
基础用法:单个条件判断
直接在 task 下添加 when 字段,后接布尔表达式。注意:变量名直接写,不加 {{ }},也不加引号(除非是字符串字面量)。
- 判断主机名是否为
nfs:when: ansible_fqdn == "nfs" - 判断系统类型:
when: ansible_distribution == "CentOS"或更推荐的when: ansible_facts['os_family'] == "RedHat" - 判断数字大小:
when: ansible_memtotal_mb > 2048 - 判断变量是否存在:
when: my_package is defined - 判断命令执行结果是否失败(配合 register):
when: check_result.rc != 0
组合条件:and / or / not
多个条件可用逻辑运算符连接,支持括号分组,提高可读性和优先级控制。
- 满足任一条件就执行:
when: (ansible_fqdn == "web01") or (ansible_fqdn == "web02") - 必须同时满足:
when: ansible_facts['distribution'] == "Ubuntu" and ansible_facts['distribution_major_version'] | int >= 22 - 否定条件:
when: my_service is not defined或when: not service_installed
结合事实和注册变量做动态判断
Ansible 自动收集的 facts(如系统信息、网络配置)和手动 register 的命令结果,是条件判断的核心数据源。
- 检查软件是否已安装:
- name: Check if nginx is installed<br> command: nginx -v<br> register: nginx_check<br> ignore_errors: yes
- name: Install nginx if missing<br> yum: name=nginx state=present<br> when: nginx_check.rc != 0
- 根据磁盘空间决定分区大小:
when: ansible_facts['devices']['vdb']['size'] | float > 2.0
进阶技巧:模糊匹配与正则
对字符串内容做灵活判断,常用于解析命令输出或服务状态。
- 匹配主机名前缀:
when: ansible_fqdn is match "^web.*" - 检查命令输出是否含关键词:
when: result.stdout is search "active"或when: result.stderr_lines is match ".*successful.*" - 判断路径是否存在(用 stat 模块):
- stat: path=/etc/myapp.conf<br> register: conf_stat
- copy: src=templates/app.conf dest=/etc/myapp.conf<br> when: not conf_stat.stat.exists











