Maak een aangepaste module met Ansible-Python
Ansible-modules
Ansible wordt geleverd met een aantal modules (de ‘modulebibliotheek’ genoemd) die direct kunnen worden uitgevoerd op hosts op afstand of via Playbooks.
Gebruikers kunnen ook hun eigen modules schrijven. Deze modules kunnen systeembronnen besturen, zoals services, packages of bestanden (eigenlijk alles), of systeemcommando’s uitvoeren.
Waarom een eigen module maken?
Zoals eerder gezegd, beschikt ansible over een groot aantal modules om verschillende taken uit te voeren. Maar verschillende omgevingen kunnen verschillende vereisten hebben, waarbij u de voorkeur geeft aan een aangepaste module om het systeem, de omgeving of het project op uw eigen manier te beheren.
Laten we eens begrijpen hoe we op een eenvoudige manier een aangepaste module kunnen maken.
Mapstructuur
Het is belangrijk om de map- en bestandsstructuur te kennen voordat we beginnen met het maken van een aangepaste module. Controleer de onderstaande afbeelding voor referentie. Waar we aan moeten werken is main.yaml en testing.py onder library folder.
root@ubuntu:~/ANSIBLEtesting# tree
.
└── playbooks
├── library
│ └── testing.py
└── main.yaml
2 directories, 2 files
Schrijf je eerste python programma
Om ansible pragmatisch te schrijven moeten we module utilities begrijpen. Ansible biedt een aantal module utilities die helper functies bieden die u kunt gebruiken bij het ontwikkelen van uw eigen modules. Het modulehulpprogramma testing.py is het belangrijkste toegangspunt tot de Ansible bibliotheek, en alle Ansible modules moeten op zijn minst testing.py importeren.
from ansible.module_utils.basic import *
Dit zal alle module_utils bestanden importeren om een aangepaste module te maken. Het uitvoer formaat van het python bestand is alleen JSON. Dus als je de uitvoer van een python bestand afdrukt, zal het in JSON moeten zijn.
De belangrijkste onderdelen zijn altijd het importeren van de boilerplate code van ansible.module_utils.basic zoals dit:
from ansible.module_utils.basic import AnsibleModule
if __name__ == '__main__':
main()
Nu installeer je de hoofdklasse of je kunt direct naar de hoofdklasse schrijven.
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)
De AnsibleModule biedt veel gemeenschappelijke code voor het afhandelen van returns, parseert je argumenten voor je, en stelt je in staat om inputs te controleren. Hier is yourName de input die aan het python bestand wordt gegeven. Deze input zal uit het ansible playbook worden gehaald.
Succesvolle returns worden zo gemaakt:
module.exit_json(changed=True, something_else=12345)
En failures zijn net zo eenvoudig (waarbij msg een verplichte parameter is om de fout uit te leggen):
module.fail_json(msg="Something fatal happened")
Het uiteindelijke python programma ziet er zo uit
#!/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)
Get your playbook ready
Weetje dat we de naam van de custom module hetzelfde zullen gebruiken als de python bestandsnaam.
- 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
Hier zal vars_prompt om een naam vragen en de testmodule onder task zal die naam aan het python script doorgeven. Kun je raden wat de uitvoer zal zijn? Laten we eens kijken.
ansible-playbook main.yaml
Conclusies
U kunt meer in detail over de aangepaste modules in Ansible Documentatie. Er is veel meer dat kan worden gedaan met aangepaste modules.
Dit artikel is rechtstreeks overgenomen van www.9tocloud.com