Объединение вывода нескольких циклов в Ansible - PullRequest
2 голосов
/ 22 апреля 2020

Я работаю с Ansible, и в своей книге игр я выполняю следующую задачу, в которой у меня есть несколько циклов, чтобы извлечь различные теги из указанного c 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}? Потому что я не могу справиться с этим, как сейчас !!!

1 Ответ

1 голос
/ 23 апреля 2020

Вопрос можно упростить. Давайте получим данные

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

Q1: " Группа" A: a1 "и" B: b1 "в 1 результате"

A: Используйте функцию 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]"

A: Используйте функции dict2items и json_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 ":" 4071 "в 1 результате
Вопрос 2 - подстановка: Создать список только с {4071, 4072}
Переменная Результаты - подстановка tags_value.results
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...