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