web-dev-qa-db-fra.com

Comment obtenir les paquets yum installés avec Ansible?

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
3
user_dev

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"
13
techraf

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
2
sduthil

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.)

0
Kyle