web-dev-qa-db-de.com

Ansible - mit with_items und wenn abhängig von

Ich habe eine Reihe von Servern mit vier physischen Laufwerken (/ dev/sda, sdb, sdc und sdd). Auf sda ist das Betriebssystem installiert.

Ich muss jedes Laufwerk außer sda formatieren. Ich muss überprüfen, ob auf jedem Laufwerk Daten gespeichert sind. Wenn ja, sollte ich es nicht formatieren.

# This will get all physical disks (sda, sdb, sdc, etc) and assign them to disk_var
- name: Get disks
  set_fact: disk_var="{{hostvars[inventory_hostname]["ansible_devices"].keys()|list}}"

- name: Check if the disk is partitioned and also ignore sda
  stat: path=/dev/{{item}}1
  with_items: disk_var
  when: item != 'sda'
  register: base_secondary_partition_{{item}}

- name: Create GPT partition table
  command: /sbin/parted -s /dev/{{item}} mklabel gpt
  with_items: disk_var
  when: item != 'sda' and base_secondary_partition_{{item}}.stat.exists == false

Die Formatierung dieser Laufwerke erfordert deutlich mehr Schritte, schlägt jedoch beim Erstellen der GPT-Partitionstabelle bei der letzten Aufgabe fehl.

So sieht es aus, wenn es ausgeführt wird. Sie werden sehen, dass es bei der letzten Aufgabe fehlschlägt:

TASK: [role | Get disks] ******************************************************
ok: [server1.com]

TASK: [role | Check if the disk is partitioned] *******************************
skipping: [server1.com] => (item=sda)
ok: [server1.com] => (item=sdd)
ok: [server1.com] => (item=sdb)
ok: [server1.com] => (item=sdc)

TASK: [role | Create GPT partition table] *************************************
fatal: [server1.com] => error while evaluating conditional: base_secondary_partition_sdd.stat.exists == false

FATAL: all hosts have already failed -- aborting

Irgendeine Idee, wie ich die Bedingung base_secondary_partition_{{item}}.stat.exists Überprüfen kann? Ich muss sicherstellen, dass Daten auf dem Laufwerk nicht formatiert werden.

32
hfranco

Sie müssen Ihr Ergebnis nicht beim item salt registrieren. Wenn Sie das Ergebnis einer Schleife registrieren (z. B. with_items) Der registrierte Wert enthält einen Schlüssel results, der eine Liste aller Ergebnisse der Schleife enthält. (Siehe docs )

Anstatt Ihre ursprüngliche Geräteliste zu durchlaufen, können Sie die registrierten Ergebnisse der ersten Aufgabe durchlaufen.

- name: Check if the disk is partitioned and also ignore sda
  stat: path=/dev/{{item}}1
  with_items: disk_var
  when: item != 'sda'
  register: device_stat

- name: Create GPT partition table
  command: /sbin/parted -s /dev/{{ item.item }} mklabel gpt
  with_items: "{{ device_stat.results }}"
  when:
    - not item | skipped
    - item.stat.exists == false

Die Bedingung not item | skipped kümmert sich darum, dass Elemente, die in der Originalschleife (sda) gefiltert wurden, nicht verarbeitet werden.

Das könnte eine Lösung für Ihr Problem sein, aber Ihre Frage ist sehr interessant. Es scheint kein eval Feature in Jinja2 zu geben. Während Sie Zeichenfolgen verketten können, können Sie diese Zeichenfolge nicht als Variablennamen verwenden, um zu ihrem Wert zu gelangen ...

51
udondan

So einfach können Ihre Aufgaben sein ...

- stat:
    path: /dev/{{item}}1
  with_items: ansible_devices.keys()
  when: item != 'sda'
  register: stats
- command: /sbin/parted -s /dev/{{item.item}} mklabel gpt
  with_items: stats.results
  when: item.stat | default(false) and item.stat.exists
6
yaegashi