【问题标题】:Combining the output of multiple loops in Ansible在 Ansible 中组合多个循环的输出
【发布时间】:2020-04-22 16:30:48
【问题描述】:

我正在使用 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} 的列表吗?因为我不能像现在这样处理它!!!

【问题讨论】:

    标签: loops ansible


    【解决方案1】:

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

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

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

    答:使用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 是替换:组“vlan-member-interface”:“et-0/0/0.0*”和“vlan-tag”:1 个结果中的“4071”
    问题 2 是替换:创建一个仅包含 {4071, 4072} 的列表
    变量 resultstags_value.results 的替换

    【讨论】:

    • 我的剧本有一个带有 2 个循环的任务,我将结果注册到变量 tags_value 中。那么你为我指的 results.0 是什么?如果你看到我的结果,我有这个 item-msg。 @VladimirBotka
    • 我不知道如何处理返回值(这个 item-msg).. 我正在尝试将 tags_value 作为列表处理,但它不是..特别是,而不是 results.0我愿意:tags_value.vlan-member-interface 但不工作!!!
    • 回答您的问题“结果是什么。0?”。这是列表“结果”的第一个元素。在我的回答中,“结果”列表是注册结果“tags_value.results”的替换。
    • 谢谢@VladimirBotka,我的 xml 有点复杂,所以我必须先调试返回值并查看如何访问这些值,但感谢您告诉我如何处理问题! !!
    • 不客气!!! minimal, complete and verifiable example (mcve) 让生活更轻松。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多