iterations - Ansible-usando with_items y cuando está condicionado a
ansible with_list (2)
Tengo un montón de servidores que tienen cuatro unidades físicas en ellos (/ dev / sda, sdb, sdc y sdd). sda tiene el sistema operativo instalado en él.
Necesito formatear cada unidad excepto sda. Necesito comprobar si cada unidad tiene datos en él. Si lo hace, entonces no debería formatearlo.
# 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
Claramente hay más pasos involucrados en el formateo de estas unidades, pero falla en la última tarea al crear la tabla de particiones GPT.
Esto es lo que parece cuando se ejecuta. Verás que falla en la última tarea:
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
¿Alguna idea de cómo puedo verificar la base_secondary_partition_{{item}}.stat.exists
? Necesito asegurarme de que si hay datos en la unidad, no la formateará.
No es necesario que registre su resultado con el item
sal. Cuando registra el resultado de un bucle (por ejemplo, with_items
), el valor registrado contendrá results
clave que contienen una lista de todos los resultados del bucle. (Ver docs )
En lugar de repasar en su lista de dispositivos original, puede repasar los resultados registrados de la primera tarea y luego:
- 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
La condición not item | skipped
not item | skipped
se encarga de que los elementos que se han filtrado en el bucle original (sda) no se procesen.
Si bien eso podría ser una solución a su problema, su pregunta es muy interesante. Parece que no hay ninguna característica eval
en Jinja2. Si bien puede concatenar cadenas, no puede usar esa cadena como nombre de variable para obtener su valor ...
Tus tareas pueden ser tan simples como esto ...
- 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