Rellenar una lista de diccionarios a través de un bucle
Quiero generar una lista de diccionarios a través del bucle. Me encontré con que podemos usar with_sequence
para generar secuencias de enteros en Ansible. Estoy obteniendo el siguiente error:
La línea ofensiva parece ser:
- { “dir”: “{{ mat_cleaner_input_file_path_flow }}/{{ item }}” }
with_sequence: start=0 end={{ http_range }}
^ aquí
Podríamos estar equivocados, pero esto parece ser un problema con comillas faltantes. Siempre ponga comillas alrededor de las llaves de expresión de plantilla cuando comienzan un valor. Por ejemplo:with_items:
- {{ foo }}
Debería escribirse como:
with_items:
- "{{ foo }}"
Mi config.j2:
{{ cleaner_config | to_nice_yaml(indent=2) }}
Mi task.yml:
- name: Test dictionaries playbook
hosts: localhost
connection: localvars:
mat_cleaner_input_file_path_flow: “/var/opt/miq/sftp/edr-flow”
mat_cleaner_input_file_path_http: “/var/opt/miq/sftp/edr-http”
mat_cleaner_input_retention_period: 21600
http_range: 5
cleaner_config:- { “dir”: “{{ mat_cleaner_input_file_path_flow }}/{{ item }}” }
with_sequence: start=0 end={{ http_range }}
tasks:
- name: Set Cleaner Config
template:
src: /home/osboxes/CleanerConfig/cleaner.config.j2
dest: /home/osboxes/CleanerConfig/output
delegate_to: localhost
with_items: cleaner_config
- { “dir”: “{{ mat_cleaner_input_file_path_flow }}/{{ item }}” }
Deseo que el archivo de salida final sea:
dir: /var/opt/miq/sftp/edr-flow/0
dir: /var/opt/miq/sftp/edr-flow/1
dir: /var/opt/miq/sftp/edr-flow/2
davy.ai
El problema en el task.yml es que
with_sequence:
no está correctamente indentado bajo el diccionariocleaner_config
. Debería colocarse encima del diccionario y su valor debería estar envuelto entre comillas para evitar el error de comillas faltantes. El código corregido de task.yml debería lucir como esto:La variable
cleaner_config
ahora se genera utilizando la funciónrange()
para generar una lista de enteros desde 0 hastahttp_range
, luego se transforma utilizando el filtromap()
para crear una lista de diccionarios con la clavedir
que contiene la cadena deseada. La funciónmap()
se utiliza para aplicar la sustitución de expresiones regulares y la conversión JSON a cada diccionario de la lista. Ten en cuenta que los\\1
en la funciónregex_replace
se utilizan para escapar la barra invertida requerida para formatear correctamente el valordir
. El archivo de salida final debería contener las rutas de directorio deseadas tal como se muestra en la pregunta.