Ansible如何遍历字典指定键 生成team为key、org为值的新字典
Ansible 遍历字典生成team-org映射字典解决方案
你可以通过subelements展开teams列表后,逐次合并单键字典得到目标结构,完整可运行代码如下:
--- - name: main playbook hosts: localhost vars: tower_objects_organizations: security: org: ORG_I-SSO-ES-ADM-SSMM teams: - I-SSO-ES-ADM-SSMM - I-SSO-ES-ADM-SSMM2 monit: org: ORG_I-SSO-ES-TS-MONIT teams: - I-SSO-ES-TS-MONIT tasks: # 初始化空结果字典 - name: Initialize empty team org mapping set_fact: team_org_map: {} # 遍历生成映射关系 - name: Generate team to organization map set_fact: team_org_map: "{{ team_org_map | combine({item[1]: item[0].value.org}) }}" loop: "{{ tower_objects_organizations | dict2items | subelements('value.teams') }}" # 输出字典格式结果 - name: Print team org mapping debug: var: team_org_map # 可选:转成你示例要求的逗号分隔字符串 - name: Convert mapping to comma separated string set_fact: team_org_str: "{{ team_org_map | dictsort | map('join', ': ') | join(', ') }}" - name: Print string format result debug: var: team_org_str
运行后得到的team_org_map就是你要的键值对结构:
{ "I-SSO-ES-ADM-SSMM": "ORG_I-SSO-ES-ADM-SSMM", "I-SSO-ES-ADM-SSMM2": "ORG_I-SSO-ES-ADM-SSMM", "I-SSO-ES-TS-MONIT": "ORG_I-SSO-ES-TS-MONIT" }
生成的team_org_str和你给出的预期输出完全一致:
I-SSO-ES-ADM-SSMM: ORG_I-SSO-ES-ADM-SSMM, I-SSO-ES-ADM-SSMM2: ORG_I-SSO-ES-ADM-SSMM, I-SSO-ES-TS-MONIT: ORG_I-SSO-ES-TS-MONIT
注:如果存在重名team,默认后面的org会覆盖前面的,需要保留多个org的话可以调整
combine参数增加递归合并逻辑。
内容的提问来源于stack exchange,提问作者Hector Esteban
相关产品推荐
相关产品推荐

