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?
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.
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 }}"
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.
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.
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
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
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
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.
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
Fügen Sie die Option ignore_errors
Hinzu, um dieses Problem zu beheben. Einzelheiten und Beispiele finden Sie auf der Seite Error Handling