web-dev-qa-db-fra.com

Meilleure façon de vérifier la version du paquet/rpm installé dans Ansible et de l’utiliser

Ansible (2.0.0.2) sur CentOS 7 me mouille les pieds. J'essaie d'obtenir une version à partir d'un paquetage rpm/yum installé, mais j'ai reçu un message d'avertissement lors de l'exécution du script.

Script Ansible:

---
- name: Get version of RPM
  Shell: yum list installed custom-rpm | grep custom-rpm | awk '{print $2}' | cut -d'-' -f1
  register: version
  changed_when: False

- name: Update some file with version
  lineinfile:
    dest: /opt/version.xml
    regexp: "<version>"
    line: "  <version>{{ version.stdout }}</version>"

Cela fonctionne bien et fait ce qu'il est censé faire, mais il renvoie un avertissement après son exécution:

ok: [défaut] => {"changé": false, "cmd": "yum list installé rpm personnalisé | grep rpm personnalisé | awk '{print $ 2}' | cut -d'- '-f1", " delta ":" 0: 00: 00.255406 "," end ":" 2016-05-17 23: 11: 54.998838 "," rc ": 0," start ":" 2016-05-17 23: 11: 54.743432 " , "stderr": "", "stdout": "3.10.2", "stdout_lines": ["3.10.2"], "warnings": ["Envisagez d'utiliser le module yum plutôt que d'exécuter yum"]}

[AVERTISSEMENT]: envisagez d'utiliser le module yum plutôt que d'exécuter yum

J'ai cherché des informations sur le module yum sur le site Ansible , mais je ne souhaite pas vraiment installer/mettre à jour/supprimer quoi que ce soit.

Je pouvais simplement l'ignorer ou le supprimer, mais j'étais curieux de savoir s'il y avait un meilleur moyen?

4
Derek Elder

La façon dont vous le faites est parfaitement bien. La vérification à l'origine de l'avertissement est très simple et ne fait que vérifier le premier Word par rapport à une liste prédéfinie. Il ignore d'autres options et entraîne souvent des avertissements qui ne peuvent pas être résolus avec le module correspondant, comme dans le cas yum.

Pour vous débarrasser de cet avertissement, vous pouvez simplement faire une which:

Shell: `which yum` list installed custom-rpm | grep custom-rpm | awk '{print $2}' | cut -d'-' -f1

which recherche le chemin complet de yum, qui est ensuite exécuté. C'est exactement la même chose, mais du point de vue de Ansible, il appelle which et non pas yum, ce qui évite l'avertissement.

Si vous souhaitez désactiver ce type d'avertissements de manière globale, vous pouvez définir command_warnings = False dans votre ansible.cfg. (Voir docs )

Selon la documentation, vous pouvez également ajouter warn=no à la fin de votre commande, mais cela me semble vraiment étrange, car cela semble faire partie de la commande.

0
udondan

Je pense qu'une façon plus indigène serait:

- name: get package version
  yum:
    list: package_name
  register: package_name_version

- name: set package version
  set_fact:
    package_name_version: "{{ package_name_version.results|selectattr('yumstate','equalto','installed')|map(attribute='version')|list|first }}"
4
Sergey GRIZZLY

utilisez le module YUM comme suggéré. Cela aide vraiment. Vous n'avez besoin de faire aucune installation/mise à jour/suppression. De plus, cela vous donne plus d'options, comme si le paquet est déjà installé, il l'ignorerait simplement. 

2
Aprameya NDS

Vous pouvez supprimer cet avertissement dans votre cas. Utilisez args comme:

---
- name: Get version of RPM
  Shell: yum list installed custom-rpm | grep custom-rpm | awk '{print $2}' | cut -d'-' -f1
  register: version
  changed_when: False
  args:
    warn: no

Équivalent à warn=no sur la ligne Shell: mais plus ordonnée.

2
Steve Kehlet

Variante of peace answer établissant un fait avec le numéro de version du paquet installé pour d'autres tests


- name: Find if custom_rpm is installed
  yum:
    list: custom_rpm
  register: custom_rpm_yum_packages
  when: ansible_os_family == "RedHat"

- name: Extract custom_rpm actual installed version
  set_fact:
     actual_custom_rpm_version:  "{{custom_rpm_yum_packages|json_query(jsonquery)}}"
  vars:
     jsonquery: "results[?yumstate=='installed'].version"
  when: ansible_os_family == "RedHat"

- debug:
    var: actual_custom_rpm_version
2
Sylvain

Je n'ai aimé aucune de ces réponses.

  - name: use command to pull version
    command: '/usr/bin/rpm -qa custom-rpm --queryformat %{VERSION}'
    register: version
    ignore_warnings: True
    changed_when: False
1
Jacob Evans

Je veux juste mettre à jour cette vieille discussion pour souligner qu’il existe maintenant un module de paquetage qui facilite la tâche

- name: get the rpm or apt package facts
  package_facts:
    manager: "auto"

- name: show Apache2 version
  debug: var=ansible_facts.packages.Apache2[0].version
1
fred

Que diriez-vous d’utiliser RPM pour récupérer directement la version au lieu de passer par différents canaux: 

rpm -q --qf "%{VERSION}" custom-rpm
1
Johan Godfried

Essayez d’ajouter l’option ignore_errors Pour y remédier. Voir la page Traitement des erreurs pour des détails et des exemples.

0
dan_linder