```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>
Je ne vais pas le faire si difficile
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éesEst-ce à propos de ça?
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
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é.
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)
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)
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)
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?
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()