J'essaie d'obtenir tout le package yum installé sur une machine RHEL. Je peux facilement le faire en utilisant des commandes Shell qui ne sont pas idempotentes et qui voudraient utiliser la commande yum à la place.
La commande shell fonctionne bien:
- name: yum list packages
Shell: yum list installed > build_server_info.config
Mais lorsque j'essaie d'utiliser la commande yum, elle s'exécute mais ne donne aucun résultat:
- name: yum_command
action: yum list=${pkg} list=available
Je peux facilement le faire en utilisant des commandes Shell qui ne sont pas idempotentes
Vous ne pouvez pas vraiment parler d’idempotence, quand vous êtes interrogez l’état actuel d’une machine.
"Idempontent" signifie que la tâche s'assurera que la machine est dans l'état désiré / peu importe le nombre de fois que vous exécutez une tâche donnée.
Lorsque vous interrogez l'état actuel, vous ne décrivez pas l'état souhaité. Peu importe ce que vous faites, quelle méthode vous utilisez, le terme "idempotent" n'est tout simplement pas applicable.
En ce qui concerne votre exemple, qui ne vous donne pas de résultats - vous avez répété deux fois le même argument list
et la tâche doit échouer (ce n'est pas le cas, ce qui ressemble à un caprice Ansible).
Pour obtenir la liste des packages installés, vous devez utiliser:
- name: yum_command
yum:
list=installed
register: yum_packages
- debug:
var: yum_packages
Il enregistre une liste de dictionnaires décrivant chaque paquet dans une variable yum_packages
.
Vous pouvez ensuite utiliser un filtre de requête JSON pour obtenir un seul package (tar
):
- debug: var=item
with_items: "{{yum_packages|json_query(jsonquery)}}"
vars:
jsonquery: "results[?name=='tar']"
pour obtenir un résultat comme celui-ci:
"item": {
"Arch": "x86_64",
"Epoch": "2",
"name": "tar",
"nevra": "2:tar-1.26-31.el7.x86_64",
"release": "31.el7",
"repo": "installed",
"version": "1.26",
"yumstate": "installed"
}
Ou seulement sa version:
- debug: var=item
with_items: "{{yum_packages|json_query(jsonquery)}}"
vars:
jsonquery: "results[?name=='tar'].version"
"item": "1.26"
Depuis Ansible 2.5, vous pouvez également utiliser le module package_facts
: il rassemblera la liste des paquets installés sous forme de faits Ansible.
Exemple tiré de la documentation:
- name: get the rpm package facts
package_facts:
manager: rpm
- name: show them
debug: var=ansible_facts.packages
Eh bien, la documentation officielle Ansible pour la liste miam module
est décrite comme suit:
"Diverses commandes (non idempotentes) à utiliser avec/usr/bin/ansible et non pas des playbooks."
vous n'aurez donc aucune chance de trouver une invocation idempotente list
.
Si vous souhaitez simplement supprimer la sortie changed
, définissez le paramètre changed_when
sur False
.
(En outre, le paramètre duplicate list
est suspect.)