Ansible如何通过循环使用set_fact动态为变量赋值?
报错原因
你遇到的Implicit map keys need to be followed by map values报错由两个语法问题导致:
- YAML语法要求键值对的冒号分隔符后必须加半角空格,你写的
"{{ item.item }}":"{{ item.alpha.beta.content }}"冒号后无空格,解析器无法识别为合法键值映射 - 循环参数
loop: get_result.results未加Jinja2模板包裹,Ansible会将其识别为普通字符串,不会遍历结果列表
独立变量生成正确写法
不需要创建额外字典对象,修正后的任务执行后会直接生成foo、bar两个顶层独立变量,可直接在后续任务中调用:
- name: Assign values set_fact: "{{ item.item }}": "{{ item.alpha.beta.content }}" loop: "{{ get_result.results }}"
执行后变量对应关系:
foo→someFooValuebar→someBarValue
循环迭代阶段直接赋值方案
可以在最开始的模块循环执行过程中同步完成变量赋值,不需要等所有模块调用完成后再遍历注册结果,通过块循环实现即可:
- name: 获取数据并同步赋值变量 block: - name: 调用模块获取单条数据 someModule: input_from_loop: "{{ item }}" register: single_res - name: 绑定对应变量 set_fact: "{{ item }}": "{{ single_res.alpha.beta.content }}" loop: - "foo" - "bar"
这种写法每轮循环执行完模块拿到结果后,会立刻完成对应变量的绑定,不需要额外遍历完整的注册结果对象。
注意事项
- 动态生成的变量名必须用双引号包裹,避免YAML解析异常
- 所有需要Ansible渲染的变量引用,在loop参数位置必须用
{{ }}包裹,否则会被识别为普通字符串 - 键值对分隔冒号后必须保留半角空格,符合YAML基础语法规范
内容的提问来源于stack exchange,提问作者user2142239
相关产品推荐
相关产品推荐

