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....
- 427 megtekintés
Hozzászólások
{{ facts['virtual_machines']['%s'| format(item)]['uuid'] }}"
ebben ha az elejét valahogy így írod? :
{{ facts.virtual_machines...}}"
- A hozzászóláshoz be kell jelentkezni
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 hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
a machines egy valtozo, amit egy vars.yml file-ban hatarozok meg. Az erteke: inventory_hosts (tehat az adott inventoryra felvett hostok nevei)
https://github.com/justai-net/ansible_vmware_snapshot/blob/master/vars/vars_file.yml
- A hozzászóláshoz be kell jelentkezni
Ha debug-al facts.virtual_machines -t iratod ki (vagy akar csak facts -t) "Gather Facts of all VMs in variable machines." task utan akkor arra a HUN401-02V host-ra vannak begyujtott adatok, tartalmazza uuid-t? ha igen milyen strukturaban tarolta le az adatait?
- A hozzászóláshoz be kell jelentkezni
{
"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)
- A hozzászóláshoz be kell jelentkezni
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'
- A hozzászóláshoz be kell jelentkezni
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"
]
}
},
- A hozzászóláshoz be kell jelentkezni
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)
- A hozzászóláshoz be kell jelentkezni
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 hozzászóláshoz be kell jelentkezni
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)
- A hozzászóláshoz be kell jelentkezni
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 :)
- A hozzászóláshoz be kell jelentkezni
Koszi megnezem mit tudok kihozni :)
Mint irtam, meg most ismerkedem az Ansible-vel, szoval minden segitseget elfogadok :)
- A hozzászóláshoz be kell jelentkezni
Sikerült megoldani?
Ha kell segítség szólj :)
- A hozzászóláshoz be kell jelentkezni