2015-08-25 13 views
19

konditioniert Ich habe eine Reihe von Servern, die vier physische Laufwerke haben (/ dev/sda, sdb, sdc und sdd). sda hat das Betriebssystem installiert.Ansible - Verwenden von with_items und wenn an

Ich muss jedes Laufwerk außer SDA formatieren. Ich muss prüfen, ob auf jedem Laufwerk Daten vorhanden sind. Wenn es das tut, sollte ich es nicht formatieren.

Es gibt deutlich mehr Schritte beim Formatieren dieser Laufwerke, aber es schlägt bei der letzten Aufgabe beim Erstellen der GPT-Partitionstabelle fehl.

Hier ist, wie es aussieht, wenn es läuft. Sie werden sehen, dass es bei der letzten Aufgabe versagt:

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 

Jede Idee, wie ich die bedingte überprüfen? Ich muss sicherstellen, dass wenn es Daten auf dem Laufwerk gibt, wird es nicht formatieren.

Antwort

35

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

Statt über Ihrer ursprünglichen Geräteliste Looping, können Sie Schleife über die registrierten Ergebnisse der ersten Aufgabe dann:

- 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, dass Elemente, die gefiltert wurden in Die Originalschleife (sda) wird nicht verarbeitet.

Während das eine Lösung für Ihr Problem sein könnte, ist Ihre Frage sehr interessant. Es scheint keine eval Funktion in Jinja2 zu geben. Während Sie Strings verketten können Sie nicht diese Zeichenfolge als Variablennamen verwenden, um seinen Wert zu erhalten ...

+2

sollten Sie verwenden '{{ item.item}} 'für die zweite Aufgabe. – yaegashi

+0

Richtig, danke für das Spotting! :) – udondan

+0

Ausgezeichnet! Dies sollte in einigen Beispielen geschehen. – onnimonni

4

Ihre Aufgaben wie diese kann so einfach 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 
Verwandte Themen