Ansible help

Fórumok

Sziasztok!

 

Ismerkedem az Ansible-el, par pelda playbook segitsegevel.

 

Jelenleg egy VM infoit szeretnem lekerni vShere-en keresztul.

itt a playbook:

 

https://github.com/justai-net/ansible_vmware_snapshot/blob/master/guestfacts.yml

 

Redben csatlakozik a vsphere-hez, lekeri az osszes vm adatat, viszont amikor a tomb segitsegevel probalja az uuid-t megszerezni (a tomb az inventory-ban felvett hostokat tartalmazza) akkor az alabbi hibaval elhasal:

 

{
    "msg": "The task includes an option with an undefined variable. The error was: 'list object' has no attribute 'HUN401-02V'\n\nThe error appears to be in '/tmp/awx_53_5aw2215g/project/VMware /guestfacts.yml': line 19, column 5, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n    register: facts\n  - name: Verbose Virtual Machine and it's UUID.\n    ^ here\n",
    "_ansible_no_log": false
}

 

Gondolom a megoldas trivialis, de meg uj nekem ez a dolog....

Hozzászólások

{{ facts['virtual_machines']['%s'| format(item)]['uuid'] }}"

ebben ha az elejét valahogy így írod? :

{{ facts.virtual_machines...}}"

Igy probaltam:

 

 debug:
        msg: "{{ item }}: {{ facts.virtual_machines['%s'| format(item)]['uuid'] }}"

Ugyanaz:

 

fatal: [HUN401-02V]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'list object' has no attribute 'HUN401-02V'\n\nThe error appears to be in '/tmp/awx_66_38wq7zr5/project/VMware /guestfacts.yml': line 19, column 5, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n    register: facts\n  - name: Verbose Virtual Machine and it's UUID.\n    ^ here\n"}

A példádban 
 

with_items:
 

- "{{ machines }}

Ez a rész honnan jött? Én ezt úgy értelmezem, hogy itt mondjuk a facts.virtual_machines listán kellene végig menni. A msg részbe pedig mehetne mondjuk az item.guest_name  vagy amelyik attribútumot meg akarod jeleníteni. De lehet én értem rosszul. Ezt a modult sajnos nem tudom tesztelni. 

 {
            "guest_name": "HUN11-05V",
            "guest_fullname": "Microsoft Windows Server 2016 or later (64-bit)",
            "power_state": "poweredOn",
            "ip_address": "10.51.38.12",
            "mac_address": [
                "00:50:56:a8:7d:4c"
            ],
            "uuid": "***********************************************",
            "vm_network": {
                "00:50:56:a8:7d:4c": {
                    "ipv4": [
                        "10.51.38.12"
                    ],
                    "ipv6": [
                        "fe80::54a3:b028:459a:4fd4"
                    ]
                }
            },

Ez masik VM, de az mind1. Igy nez ki a struktura. Az adat onnnan van, amikor alozo task osszegyujti azt osszes VM adatat (ez lefut rendben)

Attol hogy ez nem az a vm, az a vm adata is benne van az elozo task altal osszegyujtott listaban?

Mert en ugy ertelmezem a hibauzentet hogy azt a host-ot nem talaja es mivel direktben probalja a hostok adatait kikerni a listabol igy ha az nincs benne (vagy annak uuid nincs) akkor hiba fog futni.

'list object' has no attribute 'HUN401-02V'

Igen, benne van:

 

  {
            "guest_name": "HUN401-02V",
            "guest_fullname": "Microsoft Windows Server 2008 R2 (64-bit)",
            "power_state": "poweredOn",
            "ip_address": "10.51.159.12",
            "mac_address": [
                "00:50:56:a8:5a:2e"
            ],
            "uuid": "4228fae0-*******************",
            "vm_network": {
                "00:50:56:a8:5a:2e": {
                    "ipv4": [
                        "10.51.159.12"
                    ],
                    "ipv6": [
                        "fe80::fc0f:248:7024:28a3"
                    ]
                }
            },

Ez attól van, hogy a virtual_machines egy lista, nem egy dict, nincs neki attributuma. A lista egy eleme egy dict.

Ezen úgy tudnál végigmenni, hogy pl.

 
debug:
  msg: "{{ item.uuid }}"

with_items: szulo_item.virtual_machines
when: item.guest_name == "HUN11-05V"

 

(Uhh ettől WYSIWYG szerkesztőtől hülyét kaptam)

Jep, és ezt a doksi le is írja. ;)

Mondjuk az más kérdés, hogy nem tiszta egészen pontosan, hogy mi is a célja annak a " Get facts of virtual machines with UUID" tasknak. Egyrészt már egyszer le lett kérdezve az egész, tök fölöslegesnek látszik, ha csak be nem nézek valamit, másrészt meg a with_items és a register együtt nem tudom hirtelen mit csinál, de szerintem bele lapátolja az egészet még egyszer egy listába.

A VMware nem tudja azonositani a VM-et csak ha uuid-t is megadsz. (Pontosabban akkor nem tudja csak nev alapjan, ha nincs konyvtarba rendezve) Annyi a lenyege, hogy az inventoryban folvett hostnevet osszehasonlitja a gepnevvel, ha egyezest talal, akkor az uuid-t is parositja az adott nevvel, igy kesobb (ha mar konkret parancsot adsz, pl csinalj snapshotot) mar megvan az uuid meg a nev is, igy nem kell konyvtarazni, ha nem akarsz.

Igy nez ki egy konkret snapshot playbook

 

https://github.com/justai-net/ansible_vmware_snapshot/blob/master/takesnapshotuuid.yml

 

de szerintem bele lapátolja az egészet még egyszer egy listába.

En is igy ertelmezem ezt a pelda scriptet: lekeri a teljes VM listat, majd ebbol keszit egy masik, szurt listat, ami tartalmazza azoknak a gepeknek a neveit es uuid-jat, amiket felveszel az inventory host listajara. A "key value" nyilvan a nev, ennek egyezni kell a VMware-ben es az Ansible inventory-jaban.

Az egesz pedig a fontiek miatt van (a VMwarenek kell az uuid is az azonositashoz)

Szerkesztve: 2019. 11. 30., szo – 06:30

Szia!

Javasolnék pár dolgot első olvasás után, így korán reggel, de még a reggeli kávé előtt :)

  • az inventory_hostname használható a kódban is közvetlenül
  • ha egyszer lekértél egy teljes listát, akkot már utána nem kell egyesével is ismét lekérni, hanem abból a érdemes kiválasztani az adatokat.
  • ha dinamikusan szeretnéd a teljes listából kiítatni a neked szükséges információkat, akkor nem kell külön listát definiálni, egyszerűen csak végig kell iterálni az eredményen a with_items -szel.
  • ha a listából csak bizonyos nodeokat szeretnél, akkor a machines változó legyen egy lista, amelynek az egyes elemei dict típusúak. Az alábbi példa jól mutatja, hogy lehet ezt alkalmazni. Ha további elemeket tennél hozzá, akkor csak másolni kell az utolsó két sort és nyilván aktualizálni az értékeket.
machines:
  - host: "machine1" 
    uuid: "machine uuid" 

Ilyenkor a machines egy lista lesz és végig lehet rajta menni a with_items segítségével. Hivatkozni pedig úgy tudsz rá, hogy item.host és item.uuid

A fenti sorok segítő szándékkal születtek. A task részéhez szükséges lesz a kávé es a boot :)

Sikerült megoldani?
Ha kell segítség szólj :)