[PYTHON] J'ai essayé d'exécuter l'exemple de code du module Ansible

J'ai essayé de découvrir comment créer un module qui fonctionne avec ansible. J'ai fait référence aux Developing Modules sur docs.ansible.com. J'ai en fait exécuté l'exemple de code python posté et vérifié le comportement du module. L'environnement d'exécution est CentOS 7 + ansible 1.9.1.

Définition du chemin de placement du module

Décrivez le chemin où le module est placé dans /etc/ansible/ansible.cfg. Ajoutez une ligne pour "bibliothèque = répertoire de destination".

[Exemple de description]

[defaults]
inventory               = /etc/ansible/hosts

library = / root / ansible / modules / # Ajouter

Créer un exemple de code

Créez l'exemple de code (time.py) répertorié dans Developing Modules à l'emplacement du module décrit dans ansible.cfg.

$ vi /root/ansible/modules/time.py

Le contenu de l'exemple de code est le suivant. Vous pouvez appeler le module datetime pour définir ou obtenir l'heure actuelle. Les procédures de base telles que l'importation des classes requises, l'analyse des paramètres transmis aux modules et la sortie des résultats du traitement sont décrites avec des commentaires.

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

Exécution du module exemple par commande ansible

Le module est transféré vers le serveur pour être traité, puis exécuté, et le résultat est renvoyé au format json.

・ Acquisition de l'heure actuelle

Si vous exécutez le module sans spécifier de paramètres, l'heure actuelle est sortie au format json.

[Exemple d'exécution]

$ ansible localhost -m time -k
SSH password: 
localhost | success >> {
    "time": "2015-05-23 21:50:50.921787"
}

· Actuellement ensemble de

Si vous spécifiez l'heure avec l'option -a comme paramètre et que vous l'exécutez, la commande "date -s" est exécutée dans le module, puis le module datetime obtient l'heure modifiée et le résultat est sorti au format json. ..

[Exemple d'exécution]

$ ansible localhost -m time -k -a "time=21:50:50"
SSH password: 
localhost | success >> {
    "changed": true, 
    "time": "2015-05-23 21:50:50.006286"
}

Dans ce cas, "changé": vrai est affiché dans le résultat de l'exécution, ce qui indique que l'heure a été modifiée.

・ Fonctionnement lorsqu'une erreur se produit

Si vous exécutez le paramètre avec une valeur non valide (chaîne de caractères autre que l'heure) avec l'option -a, l'exécution de la commande "date -s" dans le module échouera et les informations d'erreur suivantes seront affichées comme résultat de l'exécution. Je vais.

[Exemple d'exécution]

# ansible localhost -m time -k -a "time=hoge"
SSH password: 
localhost | FAILED >> {
    "failed": true, 
    "msg": "failed setting the time"
}

Dans ce cas, "failed": true s'affiche dans le résultat de l'exécution, ce qui indique que le processus a échoué. De plus, la raison pour laquelle le processus a échoué est sortie dans "msg":.

Exécution de modules d'exemple avec playbook

Lors de l'exécution de l'exemple de module à partir du playbook, écrivez le playbook comme suit.

[Exemple de description]

---
- hosts: "{{ target }}"
  tasks:
  - name: set time
    time: time="{{ time }}"

Dans la section tâches:, décrivez le nom du module "time" à exécuter et le paramètre "time =" {{time}} "à passer au module.

Lors de l'exécution du playbook, utilisez l'option -e pour spécifier le nœud (cible) pour exécuter le module et l'heure à définir (heure).

[Exemple d'exécution]

$ 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   

Un résumé des résultats d'exécution du module est affiché dans les résultats d'exécution du playbook.

prime

Après avoir testé le module d'exemple, il est fortement recommandé de remettre l'heure à la valeur correcte avec NTP: sweat_smile:

$ ntpdate time.asia.apple.com

Recommended Posts

J'ai essayé d'exécuter l'exemple de code du module Ansible
J'ai essayé le serveur asynchrone de Django 3.0
J'ai essayé d'exécuter la partie DNN d'OpenPose avec le processeur Chainer
J'ai essayé d'obtenir le code d'authentification de l'API Qiita avec Python.
J'ai essayé de toucher des méthodes liées au toucher dans le module de scène de pythonista
J'ai essayé la fonction de tableau croisé dynamique des pandas
J'ai essayé l'analyse par grappes de la carte météo
J'ai essayé Flask avec des conteneurs distants de VS Code
J'ai essayé de corriger la forme trapézoïdale de l'image
J'ai essayé d'utiliser le module Datetime de Python
J'ai essayé d'utiliser le filtre d'image d'OpenCV
J'ai essayé de vectoriser les paroles de Hinatazaka 46!
J'ai essayé d'exécuter TensorFlow
J'ai couru le tutoriel TensorFlow avec des commentaires (classification du texte des critiques de films)
J'ai essayé de refactoriser le code de Python débutant (lycéen)
J'ai essayé de créer un modèle avec l'exemple d'Amazon SageMaker Autopilot
J'ai essayé d'exécuter l'application sur la plateforme IoT "Rimotte"
J'ai essayé de résumer la forme de base de GPLVM
J'ai essayé de visualiser les informations spacha de VTuber
J'ai essayé d'effacer la partie négative de Meros
J'ai essayé de gratter la publicité du site de dessin animé piraté
J'ai essayé la méthode la plus simple de classification de documents multi-étiquettes
J'ai essayé de classer les voix des acteurs de la voix
J'ai essayé de résumer les opérations de chaîne de Python
J'ai essayé de visualiser les données de course du jeu de course (Assetto Corsa) avec Plotly
Expliquez le code de Tensorflow_in_ROS
J'ai essayé la bibliothèque changefinder!
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé de porter le code écrit pour TensorFlow sur Theano
[Courses de chevaux] J'ai essayé de quantifier la force du cheval de course
J'ai essayé la "correction gamma" de l'image avec Python + OpenCV
J'ai essayé d'obtenir les informations de localisation du bus Odakyu
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
J'ai essayé de refactoriser le modèle CNN de TensorFlow en utilisant TF-Slim
J'ai essayé d'exécuter PIFuHD sur Windows pour le moment
J'ai essayé d'exécuter Movidius NCS avec python de Raspberry Pi3
J'ai essayé la reconnaissance faciale du problème du rire en utilisant Keras.
J'ai essayé l'analyse morphologique du commentaire général du putain de jeu de l'année
J'ai essayé de résumer le code souvent utilisé dans Pandas
[Python] J'ai essayé de visualiser la relation de suivi de Twitter
Je viens d'écrire le matériel original pour l'exemple de code python
J'ai essayé un peu le comportement de la fonction zip
[Apprentissage automatique] J'ai essayé de résumer la théorie d'Adaboost
[Python] J'ai essayé de collecter des données en utilisant l'API de wikipedia
J'ai affiché le chat de YouTube Live et essayé de jouer
J'ai essayé de gratter le classement du calendrier de l'avent Qiita avec Python
Tester la version du module argparse
J'ai essayé de remodeler le code de Python débutant (lycéen) en crunchy orienté objet
J'ai essayé le tutoriel TensorFlow 1er
J'ai essayé d'exécuter le référentiel de packages Python (entrepôt) qui prend en charge PyPI
J'ai essayé le roman Naro API 2
J'ai essayé d'obtenir l'index de la liste en utilisant la fonction énumérer
J'ai essayé d'utiliser Kwant, un module python pour le calcul du transport quantique
J'ai essayé d'automatiser l'arrosage du pot avec Raspberry Pi
J'ai étudié le mécanisme de connexion flask!
J'ai essayé de créer l'image de démarrage SD de LicheePi Nano
J'ai essayé d'utiliser GrabCut d'OpenCV
J'ai essayé le tutoriel TensorFlow 2ème