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