Erstellen Sie ein benutzerdefiniertes Modul mit Ansible-Python

Ansible-Module

Ansible wird mit einer Reihe von Modulen (der sogenannten „Modulbibliothek“) ausgeliefert, die direkt auf entfernten Hosts oder über Playbooks ausgeführt werden können.

Benutzer können auch ihre eigenen Module schreiben. Diese Module können Systemressourcen wie Dienste, Pakete oder Dateien (eigentlich alles) steuern oder die Ausführung von Systembefehlen übernehmen.

Warum ein eigenes Modul erstellen?

Wie bereits erwähnt, verfügt Ansible über eine Vielzahl von Modulen zur Ausführung verschiedener Aufgaben. Aber verschiedene Umgebungen können unterschiedliche Anforderungen haben, in denen man lieber ein eigenes Modul haben möchte, um das System, die Umgebung oder das Projekt auf seine eigene Weise zu handhaben.

Lassen Sie uns verstehen, wie wir ein eigenes Modul auf einfache Weise erstellen können.

Ordnerstruktur

Es ist wichtig, die Ordner- und Dateistruktur zu kennen, bevor wir mit der Erstellung eines eigenen Moduls beginnen. Schauen Sie sich das folgende Bild als Referenz an. Was wir bearbeiten müssen, ist main.yaml und testing.py im Ordner library.

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

2 Verzeichnisse, 2 Dateien

Schreiben Sie Ihr erstes Python-Programm

Um Ansible pragmatisch zu schreiben, müssen wir Modul-Utilities verstehen. Ansible bietet eine Reihe von Modul-Utilities, die Hilfsfunktionen bereitstellen, die man bei der Entwicklung eigener Module verwenden kann. Das Moduldienstprogramm testing.py stellt den Haupteinstiegspunkt für den Zugriff auf die Ansible-Bibliothek dar, und alle Ansible-Module müssen mindestens von testing.py importieren.

from ansible.module_utils.basic import *

Dadurch werden alle module_utils-Dateien importiert, um ein benutzerdefiniertes Modul zu erstellen. Das Ausgabeformat der Python-Datei ist nur JSON. Wenn du also die Ausgabe einer Python-Datei druckst, muss sie in JSON sein.

Zu den wichtigsten Teilen gehört, dass du immer den Boilerplate-Code aus ansible.module_utils.basic importierst, etwa so:

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

Nun instanziere die Hauptklasse oder du kannst direkt in die Hauptklasse schreiben.

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)

Das AnsibleModule bietet viel allgemeinen Code für die Behandlung von Rückgaben, analysiert deine Argumente für dich und erlaubt dir, Eingaben zu überprüfen. Hier ist yourName die Eingabe, die in die Python-Datei eingegeben wird. Diese Eingabe wird dem Ansible-Playbook entnommen.

Erfolgreiche Rückgaben sehen so aus:

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

Und Fehlschläge sind genauso einfach (wobei msg ein erforderlicher Parameter ist, um den Fehler zu erklären):

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

Das endgültige Python-Programm sieht so aus

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

Bereiten Sie Ihr Playbook vor

Wissen Sie, dass wir den Namen des benutzerdefinierten Moduls genauso verwenden werden wie den Namen der Python-Datei.

- 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 wird vars_prompt Sie nach einem Namen fragen und das Testmodul unter task wird diesen Namen an das Python-Skript weitergeben. Können Sie erraten, wie die Ausgabe aussehen wird? Lasst uns nachsehen.

ansible-playbook main.yaml

Schlussfolgerungen

Sie können mehr Details über die benutzerdefinierten Module in der Ansible Dokumentation nachlesen. Es gibt noch viel mehr, was man mit benutzerdefinierten Modulen machen kann.

Dieser Artikel wurde direkt von www.9tocloud.com

übernommen.