Как прочитать и получить несколько значений из ответа xml в Ansible - PullRequest
0 голосов
/ 17 апреля 2020

Я работаю с Ansible и пытаюсь получить значения нескольких тегов из одного xml. Я нашел, как получить значение из 1 тега, но мне нужно получить значения из многих различных тегов. В частности, я знаю, что если вы хотите получить значение 1 тега, вы делаете это в своей книге игр вот так: Как разобрать ответ XML в ansible?

Так что я Можно использовать этот xml модуль, но что мне делать, если я хочу иметь более одного «xpath»?

Ответы [ 2 ]

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

Если я правильно понял и опираюсь на пример, приведенный в вашей ссылке. Я бы использовал Ansible l oop с подключами:

playbook.yml

---
- hosts: localhost
  gather_facts: no
  tasks:
    - name: Retrieve multiple xml tags value
      xml:
        xmlstring: "{{ item.string }}" 
        xpath: "{{ item.path }}"
        content: text 
      loop: 
        - { path: "/value", string: "<value>foo</value>" }
        - { path: "/tag/other-value", string: "<tag><other-value>bar</other-value></tag>" }
      register: tags_value 

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

результат

PLAY [localhost] *******************************************************************************************************************************************************************************************

TASK [Retrieve multiple xml tags value] ********************************************************************************************************************************************************************
ok: [localhost] => (item={u'path': u'/value', u'string': u'<value>foo</value>'})
ok: [localhost] => (item={u'path': u'/tag/other-value', u'string': u'<tag><other-value>bar</other-value></tag>'})

TASK [debug] ***********************************************************************************************************************************************************************************************
ok: [localhost] => (item=[{u'value': u'foo'}]) => {
    "msg": [
        {
            "value": "foo"
        }
    ]
}
ok: [localhost] => (item=[{u'other-value': u'bar'}]) => {
    "msg": [
        {
            "other-value": "bar"
        }
    ]
}

PLAY RECAP *************************************************************************************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0
0 голосов
/ 22 апреля 2020

Хорошо, скажем, что из 1 л oop я получаю это:

=> (item=[{vlan-member-interface': 'at-0/0/0.0*'}, {vlan-member-interface': 'at-0/0/1.0*'}]) => {
"msg": [
    {
        "vlan-member-interface": "at-0/0/0.0*"
    }, 
    {
        "vlan-member-interface": "at-0/0/1.0*"
    }
]

}

А со 2-го л oop что-то вроде этого:

(item=[{vlan-tag': '5071'}, {'vlan-tag': '5072'}]) => {
"msg": [
    {
        "vlan-tag": "5071"
    }, 
    {
        "vlan-tag": "5072"
    }
] 

Как я могу сгруппировать циклы, чтобы получить 0, 0, 0,0 и 5071 в 1 результате? И последний вопрос: могу ли я извлечь что-то в списке 5071, 5072? Я пытаюсь обработать этот ответ как словарь и проанализировать значения, но я делаю это неправильно @ SolalVall

...