Ansible 2.9:如何用set_fact根据stdout_lines设置布尔变量?
解决方法
正确设置布尔变量的写法
你可以直接用Ansible的测试器或成员判断生成布尔值,替换原有代码:
方法1:使用is search测试器
- name: Set server running status set_fact: server_running: "{{ confluent_status.stdout_lines | join('') is search('active (running)') }}"
方法2:使用in成员判断
- name: Set server running status set_fact: server_running: "{{ 'active (running)' in confluent_status.stdout_lines | join('') }}"
这两种写法都会直接返回布尔值True或False,满足需求。
原代码不生效的原因
你之前用的search过滤器,在Ansible中匹配成功时返回匹配到的字符串对象,失败时返回None,二者都不是标准布尔值。而is search是专门用于返回布尔值的测试器,in操作符则直接判断子串是否存在,二者都能输出你需要的布尔结果。
定义布尔变量的常见方式
除了上述直接表达式赋值,还有几种常用实现方式:
1. 分任务用when条件赋值
如果逻辑更复杂,可拆分为两个任务分别设置:
- name: Mark server as running set_fact: server_running: true when: "'active (running)' in confluent_status.stdout_lines | join('')" - name: Mark server as not running set_fact: server_running: false when: "'active (running)' not in confluent_status.stdout_lines | join('')"
2. 使用ternary过滤器(适用于复杂条件映射)
若需根据条件在两个值间切换,ternary过滤器也可生成布尔值:
- name: Set server running status set_fact: server_running: "{{ ('active (running)' in confluent_status.stdout_lines | join('')) | ternary(true, false) }}"
不过对于简单的存在性判断,直接用is search或in的写法最简洁。
内容的提问来源于stack exchange,提问作者adbdkb
相关产品推荐
相关产品推荐

