wake-up-neo.com

Bester Weg, um nach installierter yum package/rpm-Version in Ansible zu suchen und diese zu verwenden

Ich habe mit Ansible (2.0.0.2) auf CentOS 7 meine Füße nass gemacht. Ich versuche, eine Version eines installierten rpm/yum-Pakets zu erhalten, aber beim Ausführen des Skripts ist eine Warnmeldung aufgetreten.

Ansible-Skript:

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

Wenn Sie dies ausführen, funktioniert es gut und tut, was es soll, aber es gibt eine Warnung zurück, nachdem es ausgeführt wurde:

ok: [default] => {"geändert": false, "cmd": "yum-Liste installiert custom-rpm | grep custom-rpm | 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": ["Erwägen Sie, ein Yum-Modul zu verwenden, anstatt Yum auszuführen"]}

[WARNUNG]: Erwägen Sie die Verwendung eines Yum-Moduls, anstatt Yum auszuführen

Ich habe nach Informationen für das Yum-Modul auf der Ansible-Site gesucht , aber ich möchte nicht wirklich etwas installieren/aktualisieren/löschen.

Ich könnte es einfach ignorieren oder unterdrücken, aber ich war neugierig, ob es einen besseren Weg gibt?

4
Derek Elder

Die Art, wie Sie es tun, ist vollkommen in Ordnung. Die Prüfung, die die Warnung verursacht, ist sehr einfach und prüft nur das erste Word gegen eine vordefinierte Liste. Es ignoriert weitere Optionen und führt häufig zu Warnungen, die mit dem entsprechenden Modul nicht gelöst werden können, wie im Fall yum.

Um die Warnung loszuwerden, können Sie einfach eine which ausführen:

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

which sucht nach dem vollständigen Pfad von yum, der dann ausgeführt wird. Es ist genau das Gleiche, aber aus Sicht von Ansible ruft es which und nicht yum auf, wodurch die Warnung vermieden wird.

Wenn Sie diese Art von Warnungen global deaktivieren möchten, können Sie command_warnings = False in Ihrem ansible.cfg einstellen. (Siehe docs )

Laut den Dokumenten können Sie auch warn=no am Ende Ihres Befehls hinzufügen. Dies erscheint mir jedoch merkwürdig, da es als Teil des Befehls erscheint.

0
udondan

Ich denke mehr einheimische ansible Weise wäre:

- 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

verwenden Sie das YUM-Modul wie vorgeschlagen. Das hilft wirklich. Sie müssen keine Installation/Aktualisierung/Löschung durchführen. Darüber hinaus erhalten Sie mehr Optionen, als wäre das Paket bereits installiert, würde es es einfach ignorieren. 

2
Aprameya NDS

Es ist in Ordnung, diese Warnung in Ihrem Fall zu unterdrücken. Verwenden Sie args wie:

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

Entspricht warn=no in der Shell:-Zeile, jedoch aufgeräumter.

2
Steve Kehlet

Variante der Friedensantwort, die eine Tatsache mit der installierten Paketversionsnummer für weitere Tests festlegt


- 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

Ich mochte keine dieser Antworten.

  - 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

Ich möchte nur diese alte Diskussion aktualisieren, um darauf hinzuweisen, dass es jetzt ein Paketmodul gibt, das dies einfacher macht

- 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

Wie von anderen erwähnt, können Sie den Shell-Befehl verwenden. Ich fand diese Antwort nützlich, wenn Sie das ansible yum-Modul anstelle des Shell-Befehls verwenden, wie von der ansible-Warnung empfohlen: So erhalten Sie die installierten yum-Pakete mit Ansible?

Fassen Sie es hier für eine einfache Referenz zusammen: Sie können die Yum-Liste aus dem nativen Yum-Modul in Ansible verwenden.

- hosts: localhost tasks: - name: Get installed packages Sudo: yes yum: list=installed register: yum_packages changed_when: False

So zeigen Sie den Inhalt von yum_packages an: - debug: var: yum_packages Yum_packages enthält eine Liste aller installierten Pakete.

Sie können dann die Version des Pakets von Interesse erhalten: - debug: var=item with_items: "{{yum_packages|json_query(jsonquery)}}" vars: jsonquery: "results[?name=='tar'].version"

Bitte beachten Sie, dass Jsonquery erst ab ansible 2.2 verfügbar ist.

1
peaxol

Wie wäre es, wenn Sie RPM verwenden, um die Version direkt abzurufen, anstatt durch verschiedene Pipes zu gehen: 

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

Fügen Sie die Option ignore_errors Hinzu, um dieses Problem zu beheben. Einzelheiten und Beispiele finden Sie auf der Seite Error Handling

0
dan_linder