[PYTHON] Ansible Erstellen Sie Ihr eigenes Modul - Teil 1: Leben, das Sie Argumente erhalten möchten -

Als ich versuchte, Ansible zu verwenden, gab es kein Äquivalent zu einer Named Pipe ( makefifo), also beschloss ich, mein Bestes mit meinem eigenen Modul zu geben.

Referenzseite

Umgebung

$ cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)

$ ansible --version
ansible 2.9.7
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/home/ansi/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /bin/ansible
  python version = 2.7.5 (default, Aug  7 2019, 00:51:29) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]

Erstellen Sie eine Vorlage

Beim Betrachten der Referenzseite

makefifo.py


#!/usr/bin/python
# -*- coding: utf-8 -*-

from ansible.module_utils.basic import AnsibleModule
module = AnsibleModule(
    dict=(
        message=dict()
    )
)
print '{"message_key":"%s"}' % (module.params['message'])

Ich frage mich, ob es so in Ordnung ist. Lassen Sie es uns gleich laufen.

$ ansible -i test_grp 192.168.56.104 -m makefifo -M library -u root -a message=test
192.168.56.104 | FAILED! => {
    "msg": "Unable to import makefifo due to invalid syntax"
}

OOPS !! Das. .. Plötzlich stolperte ich.

Gibt es je nach Version von Ansible einen Unterschied? Also habe ich die Richtung geändert, um zu versuchen, das vorhandene Modul zu zerlegen und es zu machen.

$ find /usr/lib/python2.7/site-packages -type f -name ping.py
/usr/lib/python2.7/site-packages/ansible/modules/system/ping.py

Kopieren Sie diesen Typ und benennen Sie ihn in "pong.py" um und überprüfen Sie zuerst den normalen Betrieb.

$ ansible -i test_grp 192.168.56.104 -m pong -M library -u root -a data=hoge
192.168.56.104 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "hoge"
}

Ja, es funktioniert.

Durch das Abkratzen des unnötigen Teils des Inhalts von hier aus konnte ich Folgendes erreichen.

pong.py


#!/usr/bin/python
# -*- coding: utf-8 -*-

from ansible.module_utils.basic import AnsibleModule

#Hauptverarbeitung
#-----------------------------------------------------------
def main():
    #AnsibleModule-Klasse:Modul erstellen
    module = AnsibleModule(

        #Argumentempfang
        argument_spec=dict(

            #Streit: data(str Typ,def:pong)
            data=dict(type='str', default='pong'),
        ),
        #Aktivieren Sie die Argumentprüfung
        supports_check_mode=True
    )

    #Ergebnis diktieren:Ergebnis erstellen
    result = dict(
        # key:Der als Argument für Ping angegebene Schlüssel:Speichern Sie den Wert der Daten
        ping=module.params['data'],
    )

    #Der Inhalt des Ergebnisses ist der Schlüssel=value,Ausgabe in Form von
    module.exit_json(**result)

if __name__ == '__main__':
    main()
$ ansible -i test_grp 192.168.56.104 -m pong -M library -u root -a data=hoge
192.168.56.104 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "hoge"
}

Verwenden wir dies als Vorlage.

Argumente erhalten

Ich denke, die für makefifo erforderlichen Parameter sind wie folgt.

Parameter Variablennamen(Schlüsselname) Schimmel Verpflichtend
Dateipfad path str
Inhaber(Nutzer) owner str
Inhaber(Gruppe) group str
Genehmigung mode str

Lassen Sie uns zunächst ein Modul erstellen, das diese Typen nur empfängt und zu den Ergebnissen zurückführt.

makefifo.py


#!/usr/bin/python
# -*- coding: utf-8 -*-

from ansible.module_utils.basic import AnsibleModule

#Hauptverarbeitung
#-----------------------------------------------------------
def main():
    #AnsibleModule-Klasse:Modul erstellen
    module = AnsibleModule(

        #Argumentempfang
        argument_spec=dict(

            #Streit: path(str Typ,Verpflichtend)
            path=dict(type='str', required=True),
            #Streit: owner(str Typ,Verpflichtend)
            owner=dict(type='str', required=True),
            #Streit: group(str Typ,Verpflichtend)
            group=dict(type='str', required=True),
            #Streit: mode(str Typ,Verpflichtend)
            mode=dict(type='str', required=True),
        ),
        #Aktivieren Sie die Argumentprüfung
        supports_check_mode=True
    )

    #Ergebnis diktieren:Ergebnis erstellen
    result = dict(
        path=module.params['path'],
        owner=module.params['owner'],
        group=module.params['group'],
        mode=module.params['mode'],
    )

    #Der Inhalt des Ergebnisses ist der Schlüssel=value,Ausgabe in Form von
    module.exit_json(**result)

if __name__ == '__main__':
    main()

Informationen zu "erforderlich" und seiner Umgebung finden Sie unter Ansible-Modulentwicklung (Python-Implementierung).

Überprüfen Sie nun die Operation ... Wie geben Sie mehrere Argumente an? Ich fand Folgendes, als ich es nachschlug.

Danke Danke.

$ ansible -i test_grp 192.168.56.104 -m makefifo -M library -u root -a "path=/tmp/hoge owner=root group=root mode=0644"
192.168.56.104 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "group": "root",
    "mode": "0644",
    "owner": "root",
    "path": "/tmp/hoge"
}

erledigt! Okay, alles was Sie tun müssen, ist es in Python zu implementieren. Vorerst ist hier heute.

Recommended Posts

Ansible Erstellen Sie Ihr eigenes Modul - Teil 1: Leben, das Sie Argumente erhalten möchten -
Ansible selbst erstellte Modulerstellung - Teil 2: Das Leben will nur Befehle ausführen -
Ansible selbstgemachte Modul U / min Betrieb
Ein Gist-Repository, das Sie verwenden können, wenn Sie es mit ansible ausprobieren möchten
Lassen Sie uns zusammenfassen, was Sie tun möchten.
[Ansible] Ich möchte meine eigene Funktion über das Vorlagenmodul (Makro) aufrufen.
Was tun, wenn Sie Dateien remote von einem Windows-Client empfangen möchten?