En Ansible 2.2, quiero recorrer una gran lista de archivos leídos de S3.
Aquí está mi role/tasks/main.yml
- nombre: Simular lectura de variables desde S3
establecer_hecho:
lista_de_archivos_a_importar: [
"a.tar.gz",
"b.tar.gz",
"c.tar.gz",
"d.tar.gz",
"e.tar.gz",
"f.tar.gz",
"g.tar.gz",
"h.tar.gz",
...
"zz.tar.gz"
]
- nombre: Procesar cada archivo de S3
incluir: submodule.yml
with_items: lista_de_archivos_a_importar
Aquí está role/tasks/submodule.yml
---
- nombre: Restaurar TABLA {{ elemento }}
depuración: var={{ elemento }}
Esto falla porque hay demasiados archivos.
Descubrí que puedo dividir la matriz y enviar secciones a la vez:
- nombre: Procesar cada archivo de S3
incluir: submodule.yml
with_items: "{{ lista_de_archivos_a_importar[0:5] }}"
- nombre: Procesar cada archivo de S3
incluir: submodule.yml
with_items: "{{ lista_de_archivos_a_importar[5:10] }}"
- nombre: Procesar cada archivo de S3
incluir: submodule.yml
with_items: "{{ lista_de_archivos_a_importar[10:15] }}"
- nombre: Procesar cada archivo de S3
incluir: submodule.yml
with_items: "{{ lista_de_archivos_a_importar[15:20] }}"
En lugar de codificar todos estos pequeños bloques, quería probar algo como
- nombre: Procesar cada archivo de S3
incluir: submodule.yml
with_items: "{{ lista_de_archivos_a_importar[{{inicio}}:{{fin}}] }}"
Pero no podemos obtener nombres de variables definidas por variables.
¿Cómo puedo procesar una gran lista de elementos en Ansible 2.2?
Terminé resolviéndolo con un script de shell, llamando repetidamente al libro de jugadas con algunos --extra-vars para especificar qué archivos procesar.
Esto solo funciona porque la lista de archivos en S3 tiene nombres de archivo similares. Básicamente, recorre los nombres de archivo y procesa cada uno a la vez.
#!/usr/bin/env bash
# devuelve 0 (verdadero) si la combinación año/mes es válida
válido() {
año=$1
millón = $ 2
# no ejecutar en meses posteriores a este mes
if [ "$año" -eq "2017" -a "$mn" -gt "$(fecha +%m)" ]
después
volver 1
fi
volver 0
}
# Por cada año desde 2002 hasta este año
para el año en `seq 2002 $(fecha +%Y)`
hacer
# por cada mes con ceros, 01-12
por mes en `seq -f "%02g" 01 12`
hacer
# para cada tipo de artículo en el inventario
para objeto en widgets doodads
hacer
si es válido $año $mes;
después
ansible-playbook playbook_name.yml --extra-vars "objeto=$objeto año=$año mes=$mes"
más
echo omitiendo combo no válido $objeto $año $mes
fi
hecho
hecho
hecho