Ansible循环列表生成动态字典:键未正确替换变量问题
问题原因分析
你的Playbook存在两个核心问题:
- 循环变量未被解析:直接写
{'SUB..item': true}时,item会被当作字符串字面量,而非循环中的变量值,导致键名固定为SUB..item。 - 字典被重复覆盖:每次循环执行
set_fact时,都是直接给FACTS_VAR赋值新字典,而非往已有字典中追加键值对,最终只会保留最后一次循环的结果。
修正后的Playbook
hosts: all gather_facts: true vars: Argument: - value1 - value2 tasks: - name: 构建FACTS_VAR字典 set_fact: FACTS_VAR: "{{ FACTS_VAR | default({}) | combine({ 'SUB.' ~ item: true }) }}" loop: "{{ Argument }}" - debug: var: FACTS_VAR
关键说明
default({}):确保第一次循环时FACTS_VAR初始化为空字典,避免变量未定义报错。combine({ 'SUB.' ~ item: true }):用~拼接字符串生成动态键名(SUB.value1、SUB.value2),再通过combine过滤器将新键值对合并到已有字典中,实现累加效果。- 遍历
Argument列表时,每次迭代都会把新键值对添加到FACTS_VAR,最终得到预期的完整字典。
执行结果验证
修正后执行Playbook,debug模块会输出:
FACTS_VAR: SUB.value1: true SUB.value2: true
内容的提问来源于stack exchange,提问作者medisamm
相关产品推荐
相关产品推荐

