[PYTHON] [Ansible] Comment appeler des variables lors de la création de votre propre module

introduction

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.

environnement

・ CentOS 7.2 ・ Python 2.7.5

Préparation

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.

Créer les valeurs par défaut / main.yml

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"

Créer des tâches / main.yml

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éez votre propre module

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

Courir

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.

Épilogue

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

[Ansible] Comment appeler des variables lors de la création de votre propre module
(Note) Comment passer le chemin de votre propre module
Pour importer votre propre module avec jupyter
Comment installer votre propre autorité de certification (racine)
Comment définir votre propre cible dans Sage
[Ansible] Je souhaite appeler ma propre fonction à partir du module de modèle (macro)
Comment exécuter le module Ansible ajouté dans Ansible Tower
[Introduction à l'application Udemy Python3 +] 66. Création de votre propre exception
[Ansible] Comment utiliser l'authentification par mot de passe SSH lors de l'exécution d'ansible
Appelez votre propre module python à partir du package ROS
Comment appeler une fonction
Comment utiliser pyenv et pyenv-virtualenv à votre manière
Comment définir les variables Go
Comment générer des informations supplémentaires lors de la sortie de journaux avec le module de journalisation de python
Module Ansible Comment mettre la chaîne de caractères JSON passée en paramètre dans le dictionnaire lors de l'écriture
Créez le thème de Pythonista 3 comme Monokai (comment créer votre propre thème)
Comment créer votre propre site de domaine avec heroku (plan gratuit)
[Astuces] Comment étendre le modèle lors de la création de HTML avec django
Comment utiliser le module optparse
[Python] journalisation dans votre propre module
Comment utiliser le module de journalisation de Python
[Ansible] Comment éviter que les modifications ne se produisent
Comment ajouter sudo lors de l'exécution du débogage
Reliez ROS à votre propre protocole
Comment utiliser le module ConfigParser
Comment appeler PyTorch dans Julia
[python] Comment ajouter RDF triple à votre propre serveur Fuseki en utilisant rdflib
Comment créer mon propre serveur Linux
Ajoutez votre propre vue de contenu à mitmproxy
[Python] Utiliser et et ou lors de la création de variables
[Python] Comment afficher des nombres aléatoires (module aléatoire)
Comment définir dynamiquement des variables en Python
python3 Comment installer un module externe
Comment obtenir une adresse IP lorsque Tornado + nginx
Migrez vos propres données CMS vers WordPress
Comment ajouter un module python à l'environnement anaconda
Comment utiliser le module externe de TouchDesigner Python
[Pour l'enregistrement] Système d'image Keras Partie 1: Comment créer votre propre ensemble de données?
[Linux] [module noyau] Comment passer des paramètres comme arguments lors du chargement d'un module noyau chargeable