[PYTHON] Ich habe versucht, den Beispielcode des Ansible-Moduls auszuführen

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.

Festlegen des Modulplatzierungspfads

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

Beispielcode erstellen

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
})

Ausführung des Beispielmoduls durch ansible Befehl

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 :.

Ausführen von Beispielmodulen mit Playbook

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.

Bonus

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

Ich habe versucht, den Beispielcode des Ansible-Moduls auszuführen
Ich habe den asynchronen Server von Django 3.0 ausprobiert
Ich habe versucht, den DNN-Teil von OpenPose mit Chainer-CPU auszuführen
Ich habe versucht, den Authentifizierungscode der Qiita-API mit Python abzurufen.
Ich habe versucht, berührungsbezogene Methoden im Szenenmodul von Pythonista zu berühren
Ich habe die Pivot-Table-Funktion von Pandas ausprobiert
Ich habe versucht, die Wetterkarte einer Clusteranalyse zu unterziehen
Ich habe Flask mit Remote-Containern von VS Code ausprobiert
Ich habe versucht, die Trapezform des Bildes zu korrigieren
Ich habe versucht, das Datetime-Modul von Python zu verwenden
Ich habe versucht, den Bildfilter von OpenCV zu verwenden
Ich habe versucht, die Texte von Hinatazaka 46 zu vektorisieren!
Ich habe versucht, TensorFlow auszuführen
Ich habe das TensorFlow-Tutorial mit Kommentaren ausgeführt (Textklassifizierung von Filmkritiken).
Ich habe versucht, den Code des Python-Anfängers (Schüler der Mittelstufe) zu überarbeiten.
Ich habe versucht, ein Modell mit dem Beispiel von Amazon SageMaker Autopilot zu erstellen
Ich habe versucht, die App auf der IoT-Plattform "Rimotte" auszuführen.
Ich habe versucht, die Grundform von GPLVM zusammenzufassen
Ich habe versucht, die Spacha-Informationen von VTuber zu visualisieren
Ich habe versucht, den negativen Teil von Meros zu löschen
Ich habe versucht, die Werbung für die Raubkopien-Website zu kratzen
Ich habe die einfachste Methode zur Klassifizierung von Dokumenten mit mehreren Etiketten ausprobiert
Ich habe versucht, die Stimmen der Sprecher zu klassifizieren
Ich habe versucht, die String-Operationen von Python zusammenzufassen
Ich habe versucht, die Laufdaten des Rennspiels (Assetto Corsa) mit Plotly zu visualisieren
Erläutern Sie den Code von Tensorflow_in_ROS
Ich habe die Changefinder-Bibliothek ausprobiert!
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich habe versucht, den für TensorFlow geschriebenen Code nach Theano zu portieren
[Pferderennen] Ich habe versucht, die Stärke des Rennpferdes zu quantifizieren
Ich habe versucht, das Bild mit Python + OpenCV "gammakorrektur" zu machen
Ich habe versucht, die Standortinformationen des Odakyu-Busses zu erhalten
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
Ich habe versucht, das CNN-Modell von TensorFlow mit TF-Slim umzugestalten
Ich habe vorerst versucht, PIFuHD unter Windows auszuführen
Ich habe versucht, Movidius NCS mit Python von Raspberry Pi3 auszuführen
Ich habe versucht, das Lachproblem mit Keras zu erkennen.
Ich habe versucht, den allgemeinen Kommentar des verdammten Spiels des Jahres morphologisch zu analysieren
Ich habe versucht, den in Pandas häufig verwendeten Code zusammenzufassen
[Python] Ich habe versucht, die folgende Beziehung von Twitter zu visualisieren
Ich habe gerade das Originalmaterial für den Python-Beispielcode geschrieben
Ich habe ein wenig versucht, das Verhalten der Zip-Funktion
[Maschinelles Lernen] Ich habe versucht, die Theorie von Adaboost zusammenzufassen
[Python] Ich habe versucht, Daten mit der API von Wikipedia zu sammeln
Ich habe den Chat von YouTube Live angezeigt und versucht zu spielen
Ich habe versucht, das Ranking des Qiita-Adventskalenders mit Python zu kratzen
Testen Sie die Version des Argparse-Moduls
Ich habe versucht, den Code des Python-Anfängers (Schüler der Mittelstufe) in objektorientiertes Knuspriges umzuwandeln
Ich habe das TensorFlow-Tutorial als erstes ausprobiert
Ich habe versucht, das Python Package Repository (Warehouse) auszuführen, das PyPI unterstützt
Ich habe die Naro-Roman-API 2 ausprobiert
Ich habe versucht, den Index der Liste mithilfe der Aufzählungsfunktion abzurufen
Ich habe versucht, Kwant zu verwenden, ein Python-Modul für die Quantentransportberechnung
Ich habe versucht, die Bewässerung des Pflanzgefäßes mit Raspberry Pi zu automatisieren
Ich habe den Mechanismus der Flaschenanmeldung untersucht!
Ich habe versucht, das SD-Boot-Image von LicheePi Nano zu erstellen
Ich habe versucht, GrabCut von OpenCV zu verwenden
Ich habe das 2. TensorFlow-Tutorial ausprobiert