Creați un modul personalizat cu Ansible-Python

Modulele Ansible

Ansible este livrat cu un număr de module (numite „biblioteca de module”) care pot fi executate direct pe gazde la distanță sau prin Playbooks.

Utilizatorii pot, de asemenea, să își scrie propriile module. Aceste module pot controla resurse de sistem, cum ar fi servicii, pachete sau fișiere (orice cu adevărat), sau se pot ocupa de executarea comenzilor de sistem.

De ce să vă creați propriul modul?

După cum am spus mai devreme, ansible are o mulțime de module pentru a îndeplini diverse sarcini. Dar medii diferite pot avea cerințe diferite în care ați prefera să aveți un modul personalizat pentru a gestiona sistemul, mediul sau proiectul în felul dumneavoastră.

Să înțelegem cum putem crea un modul personalizat într-un mod simplu.

Structura dosarelor

Este important să cunoaștem structura dosarelor și a fișierelor înainte de a începe să creăm un modul personalizat. Verificați imaginea de mai jos pentru referință. Ceea ce trebuie să lucrăm este main.yaml și testing.py sub folderul library.

root@ubuntu:~/ANSIBLEtesting# tree
.
└── playbooks
├─── library
│ └─── testing.py
└─── main.yaml

2 directoare, 2 fișiere

Scrieți primul dumneavoastră program python

Pentru a scrie ansible în mod pragmatic trebuie să înțelegem utilitățile modulelor. Ansible pune la dispoziție o serie de module utilities care oferă funcții de ajutor pe care le puteți utiliza atunci când vă dezvoltați propriile module. Utilitarul de module testing.py oferă punctul principal de intrare pentru accesarea bibliotecii Ansible, iar toate modulele Ansible trebuie, cel puțin, să importe din testing.py.

from ansible.module_utils.basic import *

Aceasta va importa toate fișierele module_utils pentru a crea un modul personalizat. Formatul de ieșire al fișierului python este doar JSON. Deci, atunci când imprimați ieșirea unui fișier python, aceasta va trebui să fie în JSON.

Părți cheie includ întotdeauna importul codului boilerplate din ansible.module_utils.basic, astfel:

from ansible.module_utils.basic import AnsibleModule
if __name__ == '__main__':
main()

Acum instanțiați clasa principală sau puteți scrie direct în clasa principală.

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)

Modulul Ansible oferă o mulțime de coduri comune pentru gestionarea returnărilor, analizează argumentele pentru dvs. și vă permite să verificați intrările. Aici yourName este intrarea dată în fișierul python. Această intrare va fi preluată din ansible playbook.

Răspunsurile reușite se fac astfel:

module.exit_json(changed=True, something_else=12345)

Și eșecurile sunt la fel de simple (unde msg este un parametru necesar pentru a explica eroarea):

module.fail_json(msg="Something fatal happened")

Programul python final arată astfel

#!/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)

Pregătiți-vă playbook-ul

Știți că vom folosi numele modulului personalizat la fel ca și numele fișierului 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

Aici vars_prompt vă va cere un nume, iar modulul de testare sub sarcină va transmite acest nume scriptului python. Puteți ghici care va fi rezultatul ? Să verificăm.

ansible-playbook main.yaml

Concluzii

Puteți verifica mai multe detalii despre modulele personalizate în documentația Ansible. Există mult mai multe lucruri care se pot face cu modulele personalizate.

Acest articol a fost preluat direct de pe www.9tocloud.com

.