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é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é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
})
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":.
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.
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