首页 > 解决方案 > 在 Ansible 中组合多个循环的输出

问题描述

我正在使用 Ansible,在我的剧本中我正在运行以下任务,其中我有多个循环以便从特定的 xml 中检索不同的标签:

- name: Retrieve multiple xml tags valuei
  xml:
    xmlstring: "{{ item.string }}"
    xpath: "{{ item.path }}"
    content: text
  loop:
    - { path: "/rpc-reply/vlan-instance-information/vlan-instance-group/vlan-member/vlan-tag", string: "{{topology.xml}}" }
    - { path: "/rpc-reply/vlan-instance-information/vlan-instance-group/vlan-member/vlan-member-interface", string: "{{topology.xml}}" }
  register: tags_value

- debug:
    msg: "{{ item.matches }}"
  loop: "{{ tags_value.results }}"
  loop_control:
    label: "{{ item.matches }}"

所以我得到以下信息:

ok: [sss-sd1-02] => (item=[{u'vlan-member-interface': u'et-0/0/0.0*'}, {u'vlan-member-interface': u'et-0/0/1.0*'}]) => {
"msg": [
    {
        "vlan-member-interface": "et-0/0/0.0*"
    }, 
    {
        "vlan-member-interface": "et-0/0/1.0*"
    }
]

}

和这个

ok: [sss-sd1-02] => (item=[{u'vlan-tag': u'4071'}, {u'vlan-tag': u'4072'}]) => {
"msg": [
    {
        "vlan-tag": "4071"
    }, 
    {
        "vlan-tag": "4072"
    }
]

}

有没有办法将 "vlan-member-interface": "et-0/0/0.0*" 和 "vlan-tag": "4071" 分组到 1 个结果中,无论是在这个任务中还是在另一个结果中?还有一种方法可以创建一个只有 {4071, 4072} 的列表吗?因为我现在无法处理它!

标签: loopsansible

解决方案


这个问题可以简化。让我们有数据

    results:
      - [A: a1, A: a2]
      - [B: b1, B: b2]

Q1:“组“A:a1”和“B:b1”在1个结果中”

- 答:使用zip功能。例如

    - set_fact:
        my_groups: "{{ results.0|zip(results.1)|list }}"
    - debug:
        var: my_groups

    "my_groups": [
        [
            {
                "A": "a1"
            }, 
            {
                "B": "b1"
            }
        ], 
        [
            {
                "A": "a2"
            }, 
            {
                "B": "b2"
            }
        ]
    ]
}

Q2:“创建一个只有 [b1, b2] 的列表”

- 答:用途dict2itemsjson_query功能。例如

   - set_fact:
        my_values: "{{ results.1|map('dict2items')|list|json_query('[].value') }}"
    - debug:
        var: my_values

    "my_values": [
        "b1", 
        "b2"
    ]


问题 1 是替换: Group "vlan-member-interface": "et-0/0/0.0*" and "vlan-tag": "4071" in 1 result
问题 2 是替换:创建一个只有 { 4071, 4072}
变量结果tags_value.results的替换


推荐阅读