如何在Ansible的set_fact中循环调用item变量合并字典?
解决Ansible遍历列表合并字典的语法问题
你的核心问题是在set_fact的Jinja2表达式中错误嵌套了双大括号,Ansible不允许这种写法。以下是两种可行的解决方案:
方法一:循环逐个合并(直观易读)
修正字典键的写法,直接在Jinja2表达式中使用item作为字典键,同时用方括号语法获取动态属性值:
- name: 初始化param_list字典 set_fact: param_list: "{{ param_list | default({ 'full_page_writes': 'off', 'autovacuum': 'off', 'wal_buffers': -1 }) }}" - name: 向param_list追加配置项 set_fact: param_list: "{{ param_list | combine({ item: config.settings[item].setting }) }}" loop: - work_mem - shared_buffers - maintenance_work_mem - wal_buffers
关键修正点:
- 移除字典内部的嵌套
{{ }},直接写item作为键 - 用
config.settings[item].setting替代点语法config.settings.{{ item }}.setting,动态属性取值时方括号语法更可靠 - 用Ansible推荐的
loop替代with_items
方法二:一次性合并(更高效)
先批量生成待合并的字典,再一次性合并到原字典,避免多次调用set_fact:
- name: 初始化param_list字典 set_fact: param_list: "{{ param_list | default({ 'full_page_writes': 'off', 'autovacuum': 'off', 'wal_buffers': -1 }) }}" - name: 批量生成配置项并合并 set_fact: param_list: "{{ param_list | combine(new_params) }}" vars: target_items: - work_mem - shared_buffers - maintenance_work_mem - wal_buffers new_params: "{{ dict( target_items | zip( target_items | map('extract', config.settings, 'setting') ) ) }}"
原理说明:
map('extract', config.settings, 'setting'):从config.settings中批量提取每个目标项的setting值zip:将目标项列表和对应的值列表配对dict():把配对后的列表转换为字典- 最后用
combine一次性合并到原字典
内容的提问来源于stack exchange,提问作者Mohamed BOUAKKAZ
相关产品推荐
相关产品推荐

