如何向嵌套字典的关联列表项添加键值对(Ansible场景)
Ansible 实现嵌套字典映射方案
输入变量示例
假设现有变量结构如下:
db_dict: {} container_db: "CORCL" seed_latest_success_list: - pdb: "PDB01" latest_success: "2024-05-20T12:30:00" - pdb: "PDB02" latest_success: "2024-05-19T09:15:00"
方案1:PDB直接映射latest_success值
如果需要将pdb作为键,latest_success作为对应值(非嵌套字典),用items2dict过滤器直接转换即可:
- name: 生成PDB与latest_success的键值对字典 set_fact: pdb_latest_map: "{{ seed_latest_success_list | items2dict(key_name='pdb', value_name='latest_success') }}" - name: 更新主字典db_dict的目标结构 set_fact: db_dict: "{{ db_dict | combine({ container_db: pdb_latest_map }, recursive=True) }}"
最终生成的db_dict结构
db_dict: CORCL: PDB01: "2024-05-20T12:30:00" PDB02: "2024-05-19T09:15:00"
方案2:PDB映射嵌套子字典
如果需要将pdb作为键,对应值为包含latest_success的子字典,用循环合并的方式更可靠(避免复杂过滤器链出错):
- name: 循环构建嵌套结构的PDB字典 set_fact: pdb_latest_map: "{{ pdb_latest_map | default({}) | combine({ item.pdb: {'latest_success': item.latest_success} }) }}" loop: "{{ seed_latest_success_list }}" - name: 更新主字典db_dict的目标结构 set_fact: db_dict: "{{ db_dict | combine({ container_db: pdb_latest_map }, recursive=True) }}"
最终生成的db_dict结构
db_dict: CORCL: PDB01: latest_success: "2024-05-20T12:30:00" PDB02: latest_success: "2024-05-19T09:15:00"
常见问题说明
之前用combine+map失败,大概率是因为map返回的是列表而非键值对字典,或者没有正确指定映射规则。items2dict是Ansible专门用于将列表元素转换为键值对字典的过滤器,而循环合并的方式更直观,适合复杂嵌套结构的构建。
内容的提问来源于stack exchange,提问作者uncag3d
相关产品推荐
相关产品推荐

