Egyéni modul létrehozása az Ansible-Python segítségével
Ansible modulok
Az Ansible számos modult (úgynevezett “modulkönyvtárat”) tartalmaz, amelyek közvetlenül a távoli hosztokon vagy Playbookokon keresztül futtathatók.
A felhasználók saját modulokat is írhatnak. Ezek a modulok vezérelhetik a rendszer erőforrásait, például szolgáltatásokat, csomagokat vagy fájlokat (igazából bármit), vagy kezelhetik a rendszerparancsok végrehajtását.
Miért hozzon létre saját modult?
Mint korábban említettük, az ansible rengeteg modult tartalmaz különböző feladatok elvégzésére. De a különböző környezetek eltérő követelményeket támaszthatnak, ahol inkább egy saját modulra lenne szükségünk, hogy a rendszert, a környezetet vagy a projektet a saját módszereink szerint kezeljük.
Magyarázzuk el, hogyan tudunk könnyen létrehozni egy saját modult.
Mappaszerkezet
Nagyon fontos, hogy ismerjük a mappák és a fájlok szerkezetét, mielőtt elkezdenénk egy saját modul létrehozását. Nézze meg az alábbi képet referenciaként. Amivel dolgoznunk kell, az a main.yaml és a testing.py a library mappa alatt.
root@ubuntu:~/ANSIBLEtesting# tree
.
└── playbooks
├── library
│ └── testing.py
└── main.yaml
2 könyvtár, 2 fájl
Az első python program megírása
Az ansible pragmatikus megírásához meg kell értenünk a modul segédprogramokat. Az Ansible számos modul segédprogramot biztosít, amelyek olyan segédfunkciókat biztosítanak, amelyeket saját moduljaink fejlesztése során használhatunk. A testing.py modul segédprogram biztosítja a fő belépési pontot az Ansible könyvtár eléréséhez, és minden Ansible modulnak legalább importálnia kell a testing.py.
from ansible.module_utils.basic import *
Ez importálja az összes module_utils fájlt egy saját modul létrehozásához. A python fájl kimeneti formátuma csak JSON. Tehát amikor kinyomtatod a python fájl kimenetét, annak JSON-ban kell lennie.
A legfontosabb részek közé tartozik, hogy mindig importáld a boilerplate kódot az ansible.module_utils.basic-ből, így:
from ansible.module_utils.basic import AnsibleModule
if __name__ == '__main__':
main()
Most instanciáld a fő osztályt, vagy írhatsz közvetlenül a fő osztályba.
if __name__ == '__main__':
fields = {
"yourName": {"required": True, "type": "str"}
}
module = AnsibleModule(argument_spec=fields)
yourName = os.path.expanduser(module.params)
newName = firstProg(yourName)
module.exit_json(msg=newName)
Az AnsibleModul sok közös kódot biztosít a visszatérések kezeléséhez, elemzi helyetted az argumentumokat, és lehetővé teszi a bemenetek ellenőrzését. Itt a yourName a python fájlban megadott bemenet. Ezt a bemenetet az ansible playbookból vesszük át.
A sikeres visszatérések így történnek:
module.exit_json(changed=True, something_else=12345)
A hibák pedig ugyanilyen egyszerűek (ahol az msg egy szükséges paraméter a hiba magyarázatára):
module.fail_json(msg="Something fatal happened")
A végleges python program így néz ki
#!/bin/env python
from ansible.module_utils.basic import *
import os, json
import re, sysdef firstProg(text):
text1 = "Hello " + text
return text1if __name__ == '__main__':
fields = {
"yourName": {"required": True, "type": "str"}
}
module = AnsibleModule(argument_spec=fields)
yourName = os.path.expanduser(module.params)
newName = firstProg(yourName)
module.exit_json(msg=newName)
Készítsd elő a playbookodat
Tudd, hogy az egyéni modul nevét a python fájl nevével megegyezően fogjuk használni.
- hosts: all
remote_user: root
gather_facts: yes vars_prompt:
- name: giveName
prompt: "Please provide your name"
private: no
failed_when: giveName is undefined tasks:
- name: Python Execution
testing: yourName={{ giveName }}
register: result
- debug: var=result
Itt a vars_prompt kérni fog egy nevet, és a task alatti tesztelési modul ezt a nevet fogja átadni a python szkriptnek. Ki tudja találni, hogy mi lesz a kimenet ? Ellenőrizzük.
ansible-playbook main.yaml
Következtetések
Az egyéni modulokról részletesebben az Ansible dokumentációban olvashat. Az egyéni modulokkal sokkal több mindent lehet csinálni.
Ez a cikk közvetlenül a www.9tocloud.com
oldalról származik.