为某些键迭代字典 Ansible

Iterate dictionary Ansible for certain keys

对某个字典如何迭代的疑惑

---
- name: main playbook
  hosts: localhost
  tasks:
    - name: Set fact
      var:
        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

    - name: "[{{ productname }}][parallel set organization] Set organizations fact"
      debug:
        msg: "XXXXX"
      with_items: "{{ tower_objects_organizations| dict2items | subelements('value.teams') }}"

有谁知道我如何遍历每个子目录(安全、监控...)中的团队,并以团队为键并以其组织为值来填充字典,即 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 使用子元素我能够到达团队列表,但输出不是预期的

带和不带自定义过滤器的解决方案:

当我必须对字典执行一些复杂的操作时,我更喜欢使用自定义过滤器:

您在剧本文件夹中创建了一个文件夹 filter_plugins(我已将文件命名为 myfilters.py 并且过滤器 customfilter)

#!/usr/bin/python
class FilterModule(object):
    def filters(self):
        return {
            'customfilter': self.customfilter
        }

    def customfilter(self, obj):
        result = {}

        for k in obj:
            org = obj[k]['org']
            for l in obj[k]['teams']:
                result[l] = org

        return result

剧本示例:

  tasks:
    - name: Set fact
      set_fact:
        result: "{{ tower_objects_organizations | customfilter}}"
      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
          others:
            org: ORG_I-SSO-ES-TS-OTHER
            teams:
              - I-SSO-ES-TS-OTHER0
              - I-SSO-ES-TS-OTHER1            

    - name: display result
      debug:
        var: result 

结果:

ok: [localhost] => 
  result:
    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
    I-SSO-ES-TS-OTHER0: ORG_I-SSO-ES-TS-OTHER
    I-SSO-ES-TS-OTHER1: ORG_I-SSO-ES-TS-OTHER

编辑

另一种没有自定义过滤器但我认为可读性较差的解决方案:

- set_fact:
    result: "{{ result | d({}) | combine(dict(item.value.teams|product([item.value.org]))) }}"
  loop: "{{ tower_objects_organizations|dict2items }}"               

- name: debug result
  debug:      
    var: result