[PYTHON] Ansible Créez votre propre module - Partie 1: La vie que vous voulez recevoir des arguments -

Quand j'ai essayé d'utiliser Ansible, il n'y avait pas d'équivalent d'un tube nommé (`` makefifo ''), j'ai donc décidé de faire de mon mieux avec mon propre module.

Site de référence

environnement

$ cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)

$ ansible --version
ansible 2.9.7
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/home/ansi/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /bin/ansible
  python version = 2.7.5 (default, Aug  7 2019, 00:51:29) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]

Créer un modèle

En regardant le site de référence

makefifo.py


#!/usr/bin/python
# -*- coding: utf-8 -*-

from ansible.module_utils.basic import AnsibleModule
module = AnsibleModule(
    dict=(
        message=dict()
    )
)
print '{"message_key":"%s"}' % (module.params['message'])

Je me demande si ça devrait être comme ça. Lançons-le tout de suite.

$ ansible -i test_grp 192.168.56.104 -m makefifo -M library -u root -a message=test
192.168.56.104 | FAILED! => {
    "msg": "Unable to import makefifo due to invalid syntax"
}

OOPS !! Ça. .. Soudain, j'ai trébuché.

Y a-t-il une différence selon la version d'Ansible? J'ai donc changé de direction pour essayer de démonter le module existant et de le fabriquer.

$ find /usr/lib/python2.7/site-packages -type f -name ping.py
/usr/lib/python2.7/site-packages/ansible/modules/system/ping.py

Copiez ce type et renommez-le en `` pong.py '' et vérifiez d'abord le fonctionnement normal.

$ ansible -i test_grp 192.168.56.104 -m pong -M library -u root -a data=hoge
192.168.56.104 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "hoge"
}

Ouais, ça marche.

En grattant la partie inutile du contenu à partir d'ici, j'ai pu gratter ce qui suit.

pong.py


#!/usr/bin/python
# -*- coding: utf-8 -*-

from ansible.module_utils.basic import AnsibleModule

#Traitement principal
#-----------------------------------------------------------
def main():
    #Classe AnsibleModule:Créer un module
    module = AnsibleModule(

        #Réception des arguments
        argument_spec=dict(

            #argument: data(type de str,def:pong)
            data=dict(type='str', default='pong'),
        ),
        #Activer la vérification des arguments
        supports_check_mode=True
    )

    #Résultat dict:Créer un résultat
    result = dict(
        # key:La clé donnée comme argument pour ping:Stocker la valeur des données
        ping=module.params['data'],
    )

    #Le contenu du résultat est essentiel=value,Sortie sous forme de
    module.exit_json(**result)

if __name__ == '__main__':
    main()
$ ansible -i test_grp 192.168.56.104 -m pong -M library -u root -a data=hoge
192.168.56.104 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "hoge"
}

Utilisons ceci comme modèle.

Recevoir des arguments

Je pense que les paramètres requis pour `` makefifo '' sont les suivants.

Paramètres Nom de variable(nom de la clé) Moule Obligatoire
Chemin du fichier path str
propriétaire(Utilisateur) owner str
propriétaire(groupe) group str
autorisation mode str

Tout d'abord, créons un module qui reçoit simplement ces gars et les renvoie aux résultats.

makefifo.py


#!/usr/bin/python
# -*- coding: utf-8 -*-

from ansible.module_utils.basic import AnsibleModule

#Traitement principal
#-----------------------------------------------------------
def main():
    #Classe AnsibleModule:Créer un module
    module = AnsibleModule(

        #Réception des arguments
        argument_spec=dict(

            #argument: path(type de str,Obligatoire)
            path=dict(type='str', required=True),
            #argument: owner(type de str,Obligatoire)
            owner=dict(type='str', required=True),
            #argument: group(type de str,Obligatoire)
            group=dict(type='str', required=True),
            #argument: mode(type de str,Obligatoire)
            mode=dict(type='str', required=True),
        ),
        #Activer la vérification des arguments
        supports_check_mode=True
    )

    #Résultat dict:Créer un résultat
    result = dict(
        path=module.params['path'],
        owner=module.params['owner'],
        group=module.params['group'],
        mode=module.params['mode'],
    )

    #Le contenu du résultat est essentiel=value,Sortie sous forme de
    module.exit_json(**result)

if __name__ == '__main__':
    main()

Pour `` requis '' et son environnement, reportez-vous à Développement du module Ansible (implémentation Python).

Maintenant, vérifiez l'opération ... Comment donnez-vous plusieurs arguments? J'ai trouvé ce qui suit quand je l'ai recherché.

Merci merci.

$ ansible -i test_grp 192.168.56.104 -m makefifo -M library -u root -a "path=/tmp/hoge owner=root group=root mode=0644"
192.168.56.104 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "group": "root",
    "mode": "0644",
    "owner": "root",
    "path": "/tmp/hoge"
}

l'a fait! D'accord, tout ce que vous avez à faire est de l'implémenter en `` Python ''. Pour le moment, voici aujourd'hui.

Recommended Posts

Ansible Créez votre propre module - Partie 1: La vie que vous voulez recevoir des arguments -
Création d'un module personnalisé Ansible - Partie 2: La vie veut juste exécuter des commandes-
Fonctionnement de la vitesse de rotation du module personnalisé
Un référentiel essentiel à utiliser lorsque vous souhaitez l'essayer avec ansible
Résumons ce que vous voulez faire.
[Ansible] Je souhaite appeler ma propre fonction à partir du module de modèle (macro)
Que faire lorsque vous souhaitez recevoir des fichiers à distance depuis un client Windows