es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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: local

    vars:
    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

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

Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema en el task.yml es que with_sequence: no está correctamente indentado bajo el diccionario cleaner_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:

    ---
    - name: Test dictionaries playbook
      hosts: localhost
      connection: local
    
      vars:
        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: "{{ range(0, http_range) | list | map('regex_replace', '^(.*)$', '{\"dir\": \"' + mat_cleaner_input_file_path_flow + '/\\\\1\"}') | map('from_json') | list }}"
    
      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
    

    La variable cleaner_config ahora se genera utilizando la función range() para generar una lista de enteros desde 0 hasta http_range, luego se transforma utilizando el filtro map() para crear una lista de diccionarios con la clave dir que contiene la cadena deseada. La función map() 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ón regex_replace se utilizan para escapar la barra invertida requerida para formatear correctamente el valor dir. El archivo de salida final debería contener las rutas de directorio deseadas tal como se muestra en la pregunta.

Comments are closed.