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.