it-swarm.com.de

Wie bekomme ich die installierten yum-Pakete mit Ansible?

Ich versuche, das gesamte installierte yum-Paket auf eine RHEL-Maschine zu bekommen. Ich kann es leicht durch die Verwendung von Shell-Befehlen, die nicht idempotent sind und stattdessen den Befehl yum verwenden möchten.

Shell-Befehl funktioniert gut:

- name: yum list packages
  Shell: yum list installed > build_server_info.config

Wenn ich jedoch versuche, den Befehl yum zu verwenden, wird er nur ausgeführt, führt jedoch zu keinen Ergebnissen:

- name: yum_command 
  action: yum list=${pkg} list=available
3
user_dev

Ich kann es leicht durch die Verwendung von Shell-Befehlen, die nicht idempotent ist

Sie können nicht wirklich über Idempotenz sprechen, wenn Sie den aktuellen Zustand einer Maschine abfragen .

"Idempontent" bedeutet, dass die Aufgabe sicherstellt, dass sich die Maschine in dem gewünschten Zustand befindet, unabhängig davon, wie oft Sie eine bestimmte Aufgabe ausführen.

Wenn Sie den aktuellen Status abfragen, beschreiben Sie den gewünschten Status nicht. Egal was Sie tun, welche Methode Sie verwenden, der Begriff "idempotent" ist einfach nicht anwendbar.


In Bezug auf Ihr Beispiel, das Ihnen keine Ergebnisse liefert, haben Sie das gleiche Argument list zweimal wiederholt, und die Aufgabe sollte fehlschlagen (dies ist nicht der Fall, was wie eine Ansible-Eigenheit aussieht).

Um eine Liste der installierten Pakete zu erhalten, sollten Sie Folgendes verwenden:

- name: yum_command 
  yum:
    list=installed
  register: yum_packages

- debug:
    var: yum_packages

Es speichert eine Liste von Wörterbüchern, die jedes Paket beschreiben, in einer Variablen yum_packages.

Sie können dann ein JSON-Abfragefilter verwenden, um ein einzelnes Paket zu erhalten (tar):

- debug: var=item
  with_items: "{{yum_packages|json_query(jsonquery)}}"
  vars:
    jsonquery: "results[?name=='tar']"

um ein Ergebnis wie dieses zu erhalten:

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

Oder nur seine Version:

- debug: var=item
  with_items: "{{yum_packages|json_query(jsonquery)}}"
  vars:
    jsonquery: "results[?name=='tar'].version"
"item": "1.26"
13
techraf

Seit Ansible 2.5 können Sie auch das Modul package_facts verwenden: Es sammelt die Liste der installierten Pakete als Ansible-Fakten.

Beispiel aus den Dokumenten:

- name: get the rpm package facts
  package_facts:
    manager: rpm

- name: show them
  debug: var=ansible_facts.packages
2
sduthil

Nun, die offizielle Ansible-Dokumentation für die yum module beschreibt die Liste als:

"Verschiedene (nicht idempotente) Befehle zur Verwendung mit/usr/bin/ansible und nicht mit Playbooks."

sie werden also Pech haben, wenn Sie einen idempotenten Aufruf von list finden.

Wenn Sie nur die Ausgabe von changed unterdrücken möchten, setzen Sie den Parameter changed_when auf False .

(Außerdem ist der doppelte Parameter list verdächtig.)

0
Kyle