with_list with iterations item array ansible ansible-playbook

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