Je suis une personne qui travaille quotidiennement en tant qu'ingénieur d'infrastructure dans une certaine entreprise pour créer des rôles et des playbooks. Je ne suis ansible que depuis six mois, mais aujourd'hui je m'habitue enfin au développement et à l'exploitation. Il a dit qu'il voulait que le travail réalisé pendant cette période crée un «module original».
De nombreux modules sont implémentés dans ansible. (Reportez-vous au site officiel: http://docs.ansible.com/ansible/list_of_all_modules.html) Cependant, cette demande est une exigence que les modules existants tels que décrits ci-dessus ne prennent pas en charge. L'expérience de programmation est un nouveau venu qui vient de démarrer python il y a un mois. Au début, je me demandais si je pouvais vraiment faire un travail sympa en créant mon propre module.
J'étais inquiet, mais!
Les modules Ansible étaient étonnamment faciles à créer. L'obstacle n'est pas élevé si vous le faites simplement. Cependant, comme le module d'origine est séparé d'ansible Si vous ne savez pas comment appeler les variables définies du côté ansible, Vous pouvez souffrir d'un stress insurmontable.
Cela fait longtemps, mais le sujet principal est d'ici.
Sur cette page, pour contrer un tel stress Voici comment appeler des variables sur lesquelles les débutants tomberont.
・ CentOS 7.2 ・ Python 2.7.5
Commencez par préparer votre propre zone de stockage de modules. Créez un répertoire "bibliothèque" dans votre playbook.
ansible-test-playbook
|_test-server.yml
|_group_vars
|_host_vars
|_vars
|_inventory
|_roles
|_role_test
|_defaults
|_main.yml
|_tasks
|_main.yml
|_templates
|_library ⬅︎new!
|_test.py ⬅︎new!
Maintenant que nous sommes prêts, créons notre propre module. Un simple script shell fonctionnera, mais Cette fois, j'écrirai principalement la méthode de "lecture et exécution de la variable déclarée côté ansible côté module".
Dans ansible, vous pouvez utiliser librement les variables une fois décrites en les appelant. Cependant, si vous essayez de l'appeler tel quel du côté du module d'origine, cela ne fonctionnera pas. Par conséquent, il est nécessaire de spécifier la variable que vous souhaitez appeler avec task et de l'apporter à votre propre module. Dans ce qui suit, nous décrirons comment amener la variable dans le module d'origine et renvoyer le résultat de l'exécution du côté ansible.
Déclarez la variable que vous souhaitez appeler cette fois avec les valeurs par défaut comme suit. (Comment écrire des variables est omis sur cette page)
main.yml
un: "Hello"
deux: "World"
Ensuite, préparez la tâche. Dans la tâche, écrivez comme suit.
main.yml
- name: get hello world
test: # .Nom du module d'origine à exécuter à l'exclusion de py
un: "{{ un }}" #Variables que vous souhaitez utiliser dans votre propre module
deux: "{{ deux }}"
register: cinq #Nom de variable pour stocker le résultat d'exécution du module d'origine
Créons maintenant un module. Créez un fichier appelé "test.py" dans le répertoire de la bibliothèque.
test.py
#!/usr/bin/env python
# coding: utf-8
#Importez ce dont vous avez besoin
import json, urllib2
from ansible.module_utils.basic import *
def main():
#C'est comme un tour de magie pour obtenir des informations de vars
#À ce stade, écrivez le nom de la variable afin qu'il corresponde à celui déclaré dans la tâche.
module = AnsibleModule(
argument_spec=dict(
un=dict(required=True, type='str'),
deux=dict(required=True, type='str')
),
# no skip
supports_check_mode=True,
)
#Stocker les informations obtenues ci-dessus et les rendre disponibles dans le module
un = module.params['un']
deux = module.params['deux']
#Que faire avec ce module
trois = un + deux
#Stocker les résultats d'exécution dans le type de dictionnaire
#Ansible décrit plus tard_Ce formulaire est obligatoire car les faits sont réalisés dans un format de dictionnaire
quatre = {"quatre": trois}
#Passer le résultat de l'exécution du côté ansible
module.exit_json(changed=True, ansible_facts=quatre)
if __name__ == '__main__':
main()
Maintenant que vous êtes prêt, faisons ce qui précède.
PLAYBOOK: test-server.yml ********************************************************
1 plays in test-server.yml
PLAY [all] *********************************************************************
TASK [setup] *******************************************************************
ok: [localhost]
TASK [role-test : get hello world] *******************************************
changed: [localhost] => {
"ansible_facts": {
"quatre": "HelloWorld"⬅︎ Résultat de l'exécution
},
"changed": true,
"invocation": {
"module_args": {
"deux": "World",
"un": "Hello"
},
"module_name": "test"
}
}
Vous pouvez voir que le résultat de l'exécution du module d'origine est stocké dans ansible_facts. Alors, comment dois-je écrire pour appeler le résultat de l'exécution du côté ansible cette fois?
"{{ cinq.ansible_facts.quatre }}"
"Nom de variable spécifié par le registre dans task.ansible_facts. Clé de type de dictionnaire déclarée dans le module d'origine" Si vous écrivez de cette façon, vous pouvez utiliser le résultat de l'exécution dans ansible.
C'est la fin du travail.
Comment était-ce? Nous espérons qu'il sera utile à ceux qui sont tombés dans de tels problèmes.
Je continuerai à toucher ansible et python à l'avenir, donc Je voudrais poster s'il y a de nouveaux apprentissages.
Merci pour votre visite.
Recommended Posts