如何在Ansible vars文件中按工作流条件定义字典项
Ansible 按Workflow类型动态生成字典键值对的正确实现
你需要在同一个Ansible vars文件中根据workflow类型,动态修改my_vars.my_dict里的一组键值对,之前用combine+omit的方式没达到预期效果,这里给你两种可行的实现方法:
方法一:使用ternary过滤器结合combine
直接根据workflow的值判断要合并的字典片段,精准控制要包含的键值对:
my_vars: my_dict: "{{ {'key1': 'value1'} | combine(workflow == 'foo' | ternary({'fookey2': 'foovalue2'}, {'key2': 'value2'})) }}"
效果验证
- 当
workflow: 'foo'时,my_dict会合并{'fookey2': 'foovalue2'},最终结果:my_vars: my_dict: key1: value1 fookey2: foovalue2 - 当
workflow为其他值时,合并{'key2': 'value2'},最终结果:my_vars: my_dict: key1: value1 key2: value2
方法二:使用Jinja2条件模板
如果觉得过滤器写法不够直观,也可以直接在vars文件里用Jinja2的if-else逻辑:
my_vars: my_dict: key1: value1 {% if workflow == 'foo' %} fookey2: foovalue2 {% else %} key2: value2 {% endif %}
这种方式逻辑更直白,适合简单的条件判断场景。
为什么之前的方法失效?
你之前的写法依赖value2或foovalue2变量是否存在来触发omit,但如果这些变量实际有定义(哪怕是空值),omit就不会生效,导致不需要的键被保留。而上面两种方法直接根据workflow的条件生成对应的键值对,完全避免了这个问题。
内容的提问来源于stack exchange,提问作者Marisol
相关产品推荐
相关产品推荐

