Ansible Findall erfasst Gruppen und listet

Ansible Findall erfasst Gruppen und listet

Ich glaube, ich verwechsle Python und Ansible findall. Kann ich Erfassungsgruppen in Ansible verwenden? Wie kann ich beispielsweise Gruppe 1 und Gruppe 2 erfassen und dann die Position in der resultierenden Liste umkehren?

Ich ziehe beispielsweise einige Blockgeräteinformationen einer VM von einem KVM-Host. Der Teil in der XML sieht so aus. Ich versuche, den Gerätenamen vdaund die zugrunde liegende Datei abzurufenwin01.qcow2

<disk type='file' device='disk'>\n
<driver name='qemu' type='qcow2'/>\n
<source file='/var/lib/libvirt/images/win01.qcow2' index='2'/>\n
<backingStore/>\n      <target dev='vda' bus='virtio'/>\n
<alias name='virtio-disk0'/>\n
<address type='pci' domain='0x0000' bus='0x05' slot='0x00' function='0x0'/>\n

Ich verwende das virtModul, um das XML abzurufen und dann die Zeilenumbrüche zu entfernen, weil ich denke, dass es einfacher ist, mit regulären Ausdrücken umzugehen. Das Ergebnis wird in einer Tatsache festgelegt, sagen wircleanxml

Ich habe Folgendes getan und eine Liste erhalten.

- name: Get list of block device
  set_fact:
    listblockdev: "{{ cleanxml | regex_findall(_q) }}"
  vars:
    _q: "<disk type='file' device='disk'>.*?source file='(.+?)'.*?<target dev='(\\w+)'"

Das Ergebnis ist

ok: [testhost] => {
    "msg": [
        [
            "/var/lib/libvirt/images/win01.qcow2",
            "vda"
        ],
        [
            "/var/lib/libvirt/images/win01-1.qcow2",
            "vdb"
        ]
    ]
}

Gibt es eine Möglichkeit, „vda“ in der Liste vor die qcow2-Datei zu setzen? Oder ist die Reihenfolge der Liste nicht festgelegt?

Im Idealfall kann ich versuchen, Dinge zu tun wie

cleanxml | regex_findall(_q, '\\2', '\\1')und haben das Ergebnis ähnlich wie [['vda','/var/lib/libvirt/images/win01.qcow2'], ['vdb','/var/lib/libvirt/images/win01-1.qcow2', 'vdb']]

Antwort1

XML ist ein Ärgernis und es ist falsch, mit Regex auf XML zu beginnen. Die Antwort ist nicht wirklich regex_findall. Es geht eher darum, wie man mit libvirt XML umgeht.

  1. Ich habe den falschen Weg eingeschlagen, um alle \n aus dem XML zu entfernen. In den eigentlichen Daten können zwischen einigen XML-Tags \n stehen

  2. ich habe das gefundenFragewo das libvirt-XML an ansible.utils.from_xml weitergeleitet wird. Ich kann die Geräte- und Dateiinformationen aus der libvirt-Ausgabe abrufen.

z.B

  - name: Get XML
    set_fact:
      xmldict: "{{ lookup('file','./test.xml') | ansible.utils.from_xml }}"

  - name: debug
    debug:
      msg: "{{ item['target']['@dev'] }} {{ item['source']['@file'] }}"
    with_items: "{{ xmldict.domain.devices.disk }}"
    when: item['@device'] == "disk"

verwandte Informationen