Crea un modulo personalizzato con Ansible-Python
Moduli Ansible
Ansible viene fornito con una serie di moduli (chiamati “libreria di moduli”) che possono essere eseguiti direttamente su host remoti o attraverso i Playbook.
Gli utenti possono anche scrivere i propri moduli. Questi moduli possono controllare le risorse di sistema, come servizi, pacchetti o file (qualsiasi cosa in realtà), o gestire l’esecuzione di comandi di sistema.
Perché creare il proprio modulo?
Come detto prima, ansible ha molti moduli per eseguire vari compiti. Ma diversi ambienti possono avere diversi requisiti per i quali preferiresti avere un modulo personalizzato per gestire il sistema o l’ambiente o il progetto a modo tuo.
Comprendiamo come possiamo creare un modulo personalizzato in modo semplice.
Struttura delle cartelle
E’ importante conoscere la struttura delle cartelle e dei file prima di iniziare a creare un modulo personalizzato. Controlla l’immagine qui sotto come riferimento. Quello su cui dobbiamo lavorare è main.yaml e testing.py sotto la cartella library.
root@ubuntu:~/ANSIBLEtesting# tree
.
└─── playbooks
├── library
│ └── testing.py
└── main.yaml
2 directory, 2 file
Scrivi il tuo primo programma python
Per scrivere ansible in modo pragmatico dobbiamo capire le utility dei moduli. Ansible fornisce un certo numero di utility di modulo che forniscono funzioni di aiuto che si possono usare quando si sviluppano i propri moduli. L’utilità modulo testing.py fornisce il principale punto di ingresso per accedere alla libreria Ansible, e tutti i moduli Ansible devono, come minimo, importare da testing.py.
from ansible.module_utils.basic import *
Questo importerà tutti i file module_utils per creare un modulo personalizzato. Il formato di output del file python è solo JSON. Quindi quando stampi l’output di un file python, dovrà essere in JSON.
Le parti chiave includono sempre l’importazione del codice boilerplate da ansible.module_utils.basic come questo:
from ansible.module_utils.basic import AnsibleModule
if __name__ == '__main__':
main()
Ora istanzia la classe principale o puoi scrivere direttamente alla classe principale.
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)
L’AnsibleModule fornisce molto codice comune per gestire i ritorni, analizza i tuoi argomenti per te, e ti permette di controllare gli input. Qui yourName è l’input dato al file python. Questo input sarà preso dal playbook di ansible.
I ritorni con successo sono fatti così:
module.exit_json(changed=True, something_else=12345)
E i fallimenti sono altrettanto semplici (dove msg è un parametro richiesto per spiegare l’errore):
module.fail_json(msg="Something fatal happened")
Il programma python finale assomiglia a questo
#!/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)
Prendi il tuo playbook
Sappiamo che useremo il nome del modulo personalizzato come il nome del file python.
- 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
Qui vars_prompt vi chiederà un nome e il modulo di test sotto task passerà quel nome allo script python. Puoi indovinare quale sarà l’output? Controlliamo.
ansible-playbook main.yaml
Conclusioni
Puoi controllare più in dettaglio i moduli personalizzati nella documentazione di Ansible. C’è molto di più che può essere fatto con i moduli personalizzati.
Questo articolo è stato preso direttamente da www.9tocloud.com