[PYTHON] Fonctionnement de la vitesse de rotation du module personnalisé

Contexte et notes

```Ansiblen'a pas de module rpm``.

C'est vrai, car il y a `` miam ''.

Puisqu'il s'agit d'un outil de gestion de configuration, rpm '' qui peut être appelé --force '' n'est pas recommandé dans `` Ansible ''.

Cependant, certains sites ont développé des systèmes antérieurs en les assemblant, et il y a des moments où vous voulez vraiment mettre un rpm '' 32 bits dans une machine 64 bits. Quand cela est implémenté avec yum``, cela peut être "Je ne le mettrai pas car il y a un paquet 64 bits".

La forme idéale est le développement en vue de la gestion de la configuration, Il s'agit d'un module obsolète. </ font>

Ce que vous voulez réaliser

Je ne vais pas le faire si difficile

  • Le fichier rpm '' a déjà été placé sur le nœud avec copie '' etc. --Je veux pouvoir placer un jour des fichiers avec un équivalent intégré à copier ''. --Recevoir l'option de la commande rpm '' et l'utiliser tel quel ――Je veux gérer les drapeaux un jour --Confirmez que le fichier rpm '' spécifié existe --Confirmez que le rpm '' spécifié n'est pas installé --Installez le `` rpm '' spécifié avec les options spécifiées

Est-ce à propos de ça?

Créer un modèle

Voir les articles précédents.

rpm.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(

            #Écrivez le processus de réception des arguments ici

        ),
        #Activer la vérification des arguments
        supports_check_mode=True
    )

    #Vérifier l'existence du fichier spécifié

    #Jugement de la nécessité du changement
    changed = False

    #installation rpm

    #Terminer le traitement

if __name__ == '__main__':
    main()

Je me demande si c'est l'endroit

Recevoir des arguments

Les arguments acceptés cette fois sont les suivants

Nom de l'argument Obligatoire Valeur par défaut Signification des arguments
pkgs - Liste des packages
opts -Uvh Options données à la commande rpm
chdir / Répertoire de stockage des packages

Au fait, je ne savais pas comment recevoir la `` liste '', alors je l'ai postée dans un certain nombre de questions et réponses, mais le lendemain, je l'ai résolue moi-même. Référence: Pour utiliser le tableau passé dans Ansible with_list pour une boucle dans un module

rpm.py


:#(réduction)

#Réception des arguments
argument_spec=dict(
    #Liste des paquets(Obligatoire,type de liste)
    pkgs = dict(required = True, type = list),
    #option(type de str,[-Uvh])
    opts = dict(required = False, type = str, default = '-Uvh'),
    #Répertoire de stockage des packages(type de str)
    chdir = dict(required = False, type = str, default = '/'),
),
#Activer la vérification des arguments
supports_check_mode=True

:#(réduction)

De plus, dans le cas d'un extrait partiel comme ci-dessus, le retrait au début de la ligne est supprimé. Parce que ce sera long sur le côté.

Vérifier l'existence du fichier spécifié

La dernière fois, quand j'ai créé un module vers mkfifo, j'ai utilisé la commande stat et la commande test sans penser à rien, mais je pensais qu'il y aurait tellement de modules.

Référence: Vérifier l'existence du fichier avec python

rpm.py


:#(réduction)

from ansible.module_utils.basic import AnsibleModule
import os

:#(réduction)

#Puisqu'il devient redondant, ressaisissez les variables
pkgs = module.params['pkgs']
chdir = module.params['chdir']

#Boucle pour chaque liste de paquets
for pkg in pkgs:
    #Vérifier l'existence du fichier spécifié
    if (os.path.isfile(chdir + '/' + pkg)):
        #Le fichier n'est pas placé
        module.fail_json(msg = chdir + '/' + pkg + ' is not found.')

:#(réduction)

Je suis inquiet, alors vérifions le fonctionnement ici. Je n'ai pas encore placé rpm '' dans / tmp / ''.

test.yml


- name: ntp install
  rpm:
    pkgs: '{{ item }}'
    opts: '-ivh'
    chdir: '/tmp'
  with_list:
    - [ 'ntp-4.2.6p5-15.el6.centos.x86_64.rpm','ntpdate-4.2.6p5-15.el6.centos.x86_64.rpm' ]

Contrôle de fonctionnement


$ ansible-playbook -i test_grp -l test_srv -u root test.yml -vvv
:#(réduction)

ok: [192.168.56.104] => (item=[u'ntp-4.2.6p5-15.el6.centos.x86_64.rpm', u'ntpdate-4.2.6p5-15.el6.centos.x86_64.rpm']) => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "ansible_loop_var": "item",
    "changed": false,
    "invocation": {
        "module_args": {
            "chdir": "/tmp",
            "opts": "-ivh",
            "pkgs": [
                "ntp-4.2.6p5-15.el6.centos.x86_64.rpm",
                "ntpdate-4.2.6p5-15.el6.centos.x86_64.rpm"
            ]
        }
    },
    "item": [
        "ntp-4.2.6p5-15.el6.centos.x86_64.rpm",
        "ntpdate-4.2.6p5-15.el6.centos.x86_64.rpm"
    ]
}

C'est ... un petit débogage.

rpm.py


#Puisqu'il devient redondant, ressaisissez les variables
pkgs = module.params['pkgs']
chdir = module.params['chdir']
num = 0
hog = 0
#Boucle pour chaque liste de paquets
for pkg in pkgs:
    num += 1
    #Vérifier l'existence du fichier spécifié
    if (os.path.isfile(chdir + '/' + pkg)):
        hog += 1
        #Le fichier n'est pas placé
        module.fail_json(msg = chdir + '/' + pkg + ' is not found.')

:#(réduction)

module.exit_json(num = num, hog = hog)

Résultat d'exécution


ok: [192.168.56.104] => (item=[u'ntp-4.2.6p5-15.el6.centos.x86_64.rpm', u'ntpdate-4.2.6p5-15.el6.centos.x86_64.rpm']) => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "ansible_loop_var": "item",
    "changed": false,
    "hog": 0,  ★
    "invocation": {
        "module_args": {
            "chdir": "/tmp",
            "opts": "-ivh",
            "pkgs": [
                "ntp-4.2.6p5-15.el6.centos.x86_64.rpm",
                "ntpdate-4.2.6p5-15.el6.centos.x86_64.rpm"
            ]
        }
    },
    "item": [
        "ntp-4.2.6p5-15.el6.centos.x86_64.rpm",
        "ntpdate-4.2.6p5-15.el6.centos.x86_64.rpm"
    ],
    "num": 2  ★
}

Hmmm ʻif (os.path.isfile (chdir + '/' + pkg)): Je me demande si est faux. À la suite de divers essais, cela fonctionnait comme ʻif os.path.isfile (chdir + '/' + pkg) == False: `. Hmm .. Pour quoi?

rpm.py


:#(réduction)

from ansible.module_utils.basic import AnsibleModule
import os

:#(réduction)

#Puisqu'il devient redondant, ressaisissez les variables
pkgs = module.params['pkgs']
chdir = module.params['chdir']

#Boucle pour chaque liste de paquets
for pkg in pkgs:
    #Vérifier l'existence du fichier spécifié
    if os.path.isfile(chdir + '/' + pkg) == False:
        #Le fichier n'est pas placé
        module.fail_json(msg = chdir + '/' + pkg + ' is not found.')

:#(réduction)

Jugement de la nécessité du changement

Pas besoin de changer, c'est-à-dire si tous les pkg '' sont déjà installés. Vous pouvez savoir si le package rpm '' est installé avec la commande suivante.

$ rpm -q ntp-4.2.6p5-15.el6.centos.x86_64
ntp-4.2.6p5-15.el6.centos.x86_64
$ echo $?
0

$ rpm -q hoge
Le package hoge n'est pas installé.
$ echo $?
1

Cependant, le fichier rpm n'est pas toujours le nom du package sans le .rpm à la fin du nom de fichier.

$ ls -1 jdk-8u192-linux-x64.rpm
jdk-8u192-linux-x64.rpm

$ rpm -q jdk-8u192-linux-x64
Paquet jdk-8u192-linux-x64 n'est pas installé.

$ rpm -qa | grep jdk
jdk1.8-1.8.0_192-fcs.x86_64

Dans l'exemple ci-dessus, le nom du fichier est jdk-8u192-linux-x64.rpm '', mais le nom du package est jdk1.8-1.8.0_192-fcs.x86_64 ''.

Pour le déterminer, vous devez rechercher le nom du package avec `` rpm -qp rpm file name ''.

$ rpm -qp jdk-8u192-linux-x64.rpm
avertissement: jdk-8u192-linux-x64.rpm:En-tête V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
jdk1.8-1.8.0_192-fcs.x86_64

Le nom du package est obtenu à partir de la sortie standard ci-dessus.

Incorporer ce processus dans le module

rpm.py


:#(réduction)

#Puisqu'il devient redondant, ressaisissez les variables
pkgs = module.params['pkgs']
chdir = module.params['chdir']

#Jugement de la nécessité du changement
changed = False

#Liste des fichiers rpm à installer
rpms = []

#Boucle pour chaque liste de paquets
for pkg in pkgs:

    #Créer le chemin complet du fichier
    fpath = chdir + '/' + pkg

    #Vérifier l'existence du fichier spécifié
    if os.path.exists(fpath) == False:
        #Le fichier n'est pas placé
        module.fail_json(msg = fpath + ' is not found.')

    #Récupérez le nom du package à partir du fichier rpm
    rc, pkg_name, stderr = module.run_command('rpm -qp ' + fpath)

    #Vérifiez l'état d'installation du package
    rc, stdout, stderr = module.run_command('rpm -q ' + pkg_name)

    #Est-il installé
    if rc != 0:
        #Non installé, donc changement requis
        changed = True
        #Ajouter à la cible d'installation
        rpms.append(fpath)

:#(réduction)

installation rpm

Si la liste de rpm cible d'installation rpms '' est vide, elle se terminera ... Elle sera laissée à chagned! = True``.

rpm.py


:#(réduction)

#Jugement de la nécessité de l'installation de rpm
if changed != True:
    #Ne pas être installé
    module.exit_json()

#création de liste rpm
rpm_line = ' '.join(rpms)

#installation rpm
rc, stdout, stderr = module.run_command('rpm ' + module.params['opts'] + ' ' + rpm_line)

#rpm Évaluation du résultat de l'installation
if rc != 0:
    #L'installation a échoué
    module.fail_json(stdout = stdout, stderr = stderr)

#Terminer le traitement
module.exit_json(changed = changed)

:#(réduction)

Tour d'essai

test.yml


- name: ntp install
  rpm:
    pkgs: '{{ item }}'
    opts: '-ivh'
    chdir: '/tmp'
  with_list:
    - [ 'ntp-4.2.6p5-15.el6.centos.x86_64.rpm','ntpdate-4.2.6p5-15.el6.centos.x86_64.rpm' ]
#Assurez-vous que le fichier de package est en place
$ ssh [email protected] "ls -l /tmp/*rpm"
-rw-rw-r--.1 racine racine 614364 11 mai 17:01 2020 /tmp/ntp-4.2.6p5-15.el6.centos.x86_64.rpm
-rw-rw-r--.1 racine racine 80836 11 mai 17:00 2020 /tmp/ntpdate-4.2.6p5-15.el6.centos.x86_64.rpm

#Assurez-vous que le fichier de package n'est pas installé
$ ssh [email protected] "rpm -qa | grep ntp"
$

#Courir!
$ ansible-playbook -i test_grp -l test_srv -u root test.yml -vvv
:#(réduction)
changed: [192.168.56.104] => (item=[u'ntp-4.2.6p5-15.el6.centos.x86_64.rpm', u'ntpdate-4.2.6p5-15.el6.centos.x86_64.rpm']) => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "ansible_loop_var": "item",
    "changed": true,
    "invocation": {
        "module_args": {
            "chdir": "/tmp",
            "opts": "-ivh",
            "pkgs": [
                "ntp-4.2.6p5-15.el6.centos.x86_64.rpm",
                "ntpdate-4.2.6p5-15.el6.centos.x86_64.rpm"
            ]
        }
    },
    "item": [
        "ntp-4.2.6p5-15.el6.centos.x86_64.rpm",
        "ntpdate-4.2.6p5-15.el6.centos.x86_64.rpm"
    ],
    "msg": "/tmp/ntp-4.2.6p5-15.el6.centos.x86_64.rpm /tmp/ntpdate-4.2.6p5-15.el6.centos.x86_64.rpm"
}

#Exécutez à nouveau pour vérifier l'égalité!
$ ansible-playbook -i test_grp -l test_srv -u root test.yml -vvv
ok: [192.168.56.104] => (item=[u'ntp-4.2.6p5-15.el6.centos.x86_64.rpm', u'ntpdate-4.2.6p5-15.el6.centos.x86_64.rpm']) => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "ansible_loop_var": "item",
    "changed": false,
    "invocation": {
        "module_args": {
            "chdir": "/tmp",
            "opts": "-ivh",
            "pkgs": [
                "ntp-4.2.6p5-15.el6.centos.x86_64.rpm",
                "ntpdate-4.2.6p5-15.el6.centos.x86_64.rpm"
            ]
        }
    },
    "item": [
        "ntp-4.2.6p5-15.el6.centos.x86_64.rpm",
        "ntpdate-4.2.6p5-15.el6.centos.x86_64.rpm"
    ]
}

N'est-ce pas correct?

Module créé

rpm.py


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

from ansible.module_utils.basic import AnsibleModule
import os

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

        #Réception des arguments
        argument_spec=dict(
            #Liste des paquets(Obligatoire,type de liste)
            pkgs = dict(required = True, type = list),
            #option(type de str,[-Uvh])
            opts = dict(required = False, type = str, default = '-Uvh'),
            #Répertoire de stockage des packages(type de str)
            chdir = dict(required = False, type = str, default = '/'),
        ),
        #Activer la vérification des arguments
        supports_check_mode=True
    )

    #Puisqu'il devient redondant, ressaisissez les variables
    pkgs = module.params['pkgs']
    chdir = module.params['chdir']

    #Jugement de la nécessité du changement
    changed = False

    #Liste des fichiers rpm à installer
    rpms = []

    #Boucle pour chaque liste de paquets
    for pkg in pkgs:

        #Créer le chemin complet du fichier
        fpath = chdir + '/' + pkg

        #Vérifier l'existence du fichier spécifié
        if os.path.exists(fpath) == False:
            #Le fichier n'est pas placé
            module.fail_json(msg = fpath + ' is not found.')

        #Récupérez le nom du package à partir du fichier rpm
        rc, pkg_name, stderr = module.run_command('rpm -qp ' + fpath)

        #Vérifiez l'état d'installation du package
        rc, stdout, stderr = module.run_command('rpm -q ' + pkg_name)

        #Est-il installé
        if rc != 0:
            #Non installé, donc changement requis
            changed = True
            #Ajouter à la cible d'installation
            rpms.append(fpath)

    #Jugement de la nécessité de l'installation de rpm
    if changed != True:
        #Ne pas être installé
        module.exit_json()

    #création de liste rpm
    rpm_line = ' '.join(rpms)

    #installation rpm
    rc, stdout, stderr = module.run_command('rpm ' + module.params['opts'] + ' ' + rpm_line)

    #rpm Évaluation du résultat de l'installation
    if rc != 0:
        #L'installation a échoué
        module.fail_json(stdout = stdout, stderr = stderr)

    #Terminer le traitement
    module.exit_json(changed = changed)

if __name__ == '__main__':
    main()

Recommended Posts

Fonctionnement de la vitesse de rotation du module personnalisé
Création d'un module personnalisé Ansible - Partie 2: La vie veut juste exécuter des commandes-
Ansible Créez votre propre module - Partie 1: La vie que vous voulez recevoir des arguments -