Ansible无需register任务用set_fact带条件判断列表是否含指定值
Ansible 单任务判断列表包含指定元素的实现方法
你可以直接通过Jinja2过滤器实现需求,无需循环、无需多任务,代码更简洁高效:
- set_fact: containB: "{{ val_list | map(attribute='val') | select('equalto', 'B') | list | length > 0 }}"
过滤器逻辑说明:
map(attribute='val'):提取val_list所有元素的val字段,生成字符串列表["D", "A", "B", "C"]select('equalto', 'B'):过滤出列表中等于B的元素- 转为列表后判断长度是否大于0,结果直接为布尔值,匹配到
B时返回true,否则返回false
如果你需要用循环实现的场景,也可以用以下写法,避免非匹配元素覆盖变量值:
- set_fact: containB: "{{ containB | default(false) or (item.val == 'B') }}" loop: "{{ val_list }}"
你原尝试写法的问题说明:
- Jinja2三元表达式
X if Y else Z必须补全else分支,你写的语法缺少该部分 - 过滤器优先级错误:
item.val=='B' | default(false)会先对字符串'B'调用default,而非作用在整个判断表达式上 with_items后缺少冒号,Ansible 2.5及以上版本更推荐使用loop替代with_items
内容的提问来源于stack exchange,提问作者Kucharsky
相关产品推荐
相关产品推荐

