Ich habe versucht herauszufinden, wie man ein Modul erstellt, das mit ansible funktioniert. Ich habe auf die Entwicklungsmodule auf docs.ansible.com verwiesen. Ich habe tatsächlich den veröffentlichten Python-Beispielcode ausgeführt und das Verhalten des Moduls überprüft. Die Ausführungsumgebung ist CentOS 7 + ansible 1.9.1.
Beschreiben Sie den Pfad, in dem sich das Modul befindet, in /etc/ansible/ansible.cfg. Fügen Sie eine Zeile für "library = Zielverzeichnis" hinzu.
[Beschreibungsbeispiel]
[defaults]
inventory = /etc/ansible/hosts
library = / root / ansible / modules / # Hinzufügen
Erstellen Sie den unter Entwickeln von Modulen aufgeführten Beispielcode (time.py) an der in ansible.cfg beschriebenen Modulposition.
$ vi /root/ansible/modules/time.py
Der Inhalt des Beispielcodes lautet wie folgt. Sie können das Datum / Uhrzeit-Modul aufrufen, um die aktuelle Uhrzeit einzustellen oder abzurufen. Grundlegende Verfahren wie das Importieren erforderlicher Klassen, das Analysieren von an Module übergebenen Parametern und das Ausgeben von Verarbeitungsergebnissen werden mit Kommentaren beschrieben.
#!/usr/bin/python
# import some python modules that we'll use. These are all
# available in Python's core
import datetime
import sys
import son
import os
import shlex
# read the argument string from the arguments file
args_file = sys.argv[1]
args_data = file(args_file).read()
# for this module, we're going to do key=value style arguments
# this is up to each module to decide what it wants, but all
# core modules besides 'command' and 'shell' take key=value
# so this is highly recommended
arguments = shlex.split(args_data)
for arg in arguments:
# ignore any arguments without an equals in it
if "=" in arg:
(key, value) = arg.split("=")
# if setting the time, the key 'time'
# will contain the value we want to set the time to
if key == "time":
# now we'll affect the change. Many modules
# will strive to be 'idempotent', meaning they
# will only make changes when the desired state
# expressed to the module does not match
# the current state. Look at 'service'
# or 'yum' in the main git tree for an example
# of how that might look.
rc = os.system("date -s \"%s\"" % value)
# always handle all possible errors
#
# when returning a failure, include 'failed'
# in the return data, and explain the failure
# in 'msg'. Both of these conventions are
# required however additional keys and values
# can be added.
if rc != 0:
print json.dumps({
"failed" : True,
"msg" : "failed setting the time"
})
sys.exit(1)
# when things do not fail, we do not
# have any restrictions on what kinds of
# data are returned, but it's always a
# good idea to include whether or not
# a change was made, as that will allow
# notifiers to be used in playbooks.
date = str(datetime.datetime.now())
print json.dumps({
"time" : date,
"changed" : True
})
sys.exit(0)
# if no parameters are sent, the module may or
# may not error out, this one will just
# return the time
date = str(datetime.datetime.now())
print json.dumps({
"time" : date
})
Das Modul wird auf den zu verarbeitenden Server übertragen, dann ausgeführt und das Ergebnis im JSON-Format zurückgegeben.
・ Erfassung der aktuellen Zeit
Wenn Sie das Modul ausführen, ohne Parameter anzugeben, wird die aktuelle Zeit im JSON-Format ausgegeben.
[Ausführungsbeispiel]
$ ansible localhost -m time -k
SSH password:
localhost | success >> {
"time": "2015-05-23 21:50:50.921787"
}
· Derzeit eingestellt von
Wenn Sie die Zeit mit der Option -a als Parameter angeben und ausführen, wird der Befehl "date -s" im Modul ausgeführt, das Datum / Uhrzeit-Modul erhält die geänderte Zeit und das Ergebnis wird im JSON-Format ausgegeben. ..
[Ausführungsbeispiel]
$ ansible localhost -m time -k -a "time=21:50:50"
SSH password:
localhost | success >> {
"changed": true,
"time": "2015-05-23 21:50:50.006286"
}
In diesem Fall wird "geändert": true im Ausführungsergebnis angezeigt, was anzeigt, dass die Zeit geändert wurde.
・ Betrieb bei Auftreten eines Fehlers
Wenn Sie den Parameter mit einem ungültigen Wert (eine Zeichenfolge, die nicht die Uhrzeit ist) mit der Option -a ausführen, schlägt die Ausführung des Befehls "date -s" im Modul fehl und die folgenden Fehlerinformationen werden als Ausführungsergebnis ausgegeben. Ich werde.
[Ausführungsbeispiel]
# ansible localhost -m time -k -a "time=hoge"
SSH password:
localhost | FAILED >> {
"failed": true,
"msg": "failed setting the time"
}
In diesem Fall wird "fehlgeschlagen": true im Ausführungsergebnis angezeigt, was darauf hinweist, dass der Prozess fehlgeschlagen ist. Außerdem wird der Grund, warum der Prozess fehlgeschlagen ist, in "msg" ausgegeben :.
Wenn Sie das Beispielmodul aus dem Playbook ausführen, schreiben Sie das Playbook wie folgt.
[Beschreibungsbeispiel]
---
- hosts: "{{ target }}"
tasks:
- name: set time
time: time="{{ time }}"
Beschreiben Sie im Abschnitt Aufgaben: den Modulnamen "Zeit", der ausgeführt werden soll, und den Parameter "Zeit =" {{Zeit}} ", der an das Modul übergeben werden soll.
Verwenden Sie beim Ausführen des Playbooks die Option -e, um den Knoten (Ziel) anzugeben, auf dem das Modul ausgeführt werden soll, und die einzustellende Zeit (Zeit).
[Ausführungsbeispiel]
$ ansible-playbook time.yml -k -e "target=localhost time=23:27:00"
SSH password:
PLAY [localhost] **************************************************************
GATHERING FACTS ***************************************************************
ok: [localhost]
TASK: [set time] **************************************************************
changed: [localhost]
PLAY RECAP ********************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0
Eine Zusammenfassung der Modulausführungsergebnisse wird in den Playbook-Ausführungsergebnissen ausgegeben.
Nach dem Testen des Beispielmoduls wird dringend empfohlen, die Zeit mit NTP auf den richtigen Wert zurückzusetzen: heat_smile:
$ ntpdate time.asia.apple.com
Recommended Posts