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.

Bucle for en archivo de inventario de jinja2.

Estoy buscando una forma de hacer un bucle dentro de un archivo de inventario (ni siquiera sé si es posible…?)
Me explico:
Tengo un archivo var en group_vars/All que contiene una lista de direcciones IP, así:

doca_dns_server:
– x.x.x.1
– x.x.x.2

En un segundo archivo de inventario, almacenado en la sección host_vars, quiero hacer un bucle en esta variable para construir algunas reglas de firewall.
He intentado esto:

226 output ntp udp aceptado:
{% for srv in ip_address%}
– udp dport ntp ip daddr {{ srv }} ct state new accept
{% endfor %}

Pero esto no funciona, espero que sea un problema de sintaxis, pero no encuentro ningún ejemplo.

PLAY [all] *************************************************************************************************************************************************************************************************
ERROR! No pudimos leerlo como JSON ni YAML, estos son los errores que obtuvimos de cada uno:
JSON: Se esperaba un valor: línea 1 columna 1 (carácter 0)

Error de sintaxis al cargar YAML.
se encontró un carácter que no puede iniciar ningún token

El error parece estar en ‘/home/mpileyre/ansible/inventories/hds/pprod/host_vars/tibrin2-ppd/firewall.yml’: línea 68, columna 2, pero puede estar en otro lugar del archivo dependiendo del problema exacto de sintaxis.

La línea problemática parece ser:

225 output dns tcp udp aceptado:
{% for ip in doca_dns_servers %}
^ aquí

Como pude usar algunas funciones de jinja2 (como reemplazar) en mis archivos var, me preguntaba si podría hacer un bucle 🙂 pero tal vez me equivoque…

El resultado esperado es:

226 output ntp udp aceptado:
– udp dport ntp ip daddr x.x.x.1 ct state new accept
– udp dport ntp ip daddr x.x.x.2 ct state new accept

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, no se puede hacer un bucle dentro de un archivo de inventario ya que está destinado a contener datos de inventario como nombres de host, direcciones IP e información de grupos.

    Sin embargo, se pueden utilizar plantillas de Jinja2 para generar archivos de configuración basados ​​en la información de su archivo de inventario. En su caso, puede crear un archivo de plantilla firewall.j2 que utilice la variable doca_dns_server para generar las reglas de firewall necesarias.

    Por ejemplo, puede crear un archivo de plantilla firewall.j2 con el siguiente contenido:

    {% for srv in doca_dns_server %}    
    226 output ntp udp accepted:
    - udp dport ntp ip daddr {{ srv }} ct state new accept
    {% endfor %}
    

    Luego, en su playbook, puede usar el módulo template para generar el archivo de configuración del firewall:

    - name: Generar archivo de configuración del firewall
      template:
        src: firewall.j2
        dest: /etc/firewall.conf
    

    Esto creará un archivo de configuración del firewall con el siguiente contenido:

    226 output ntp udp accepted:
    - udp dport ntp ip daddr x.x.x.1 ct state new accept
    226 output ntp udp accepted:
    - udp dport ntp ip daddr x.x.x.2 ct state new accept
    

    Tenga en cuenta que la variable doca_dns_server contiene una lista, por lo que debe recorrerla para generar múltiples reglas de firewall. Además, asegúrese de que la sintaxis de su plantilla Jinja2 sea correcta, ya que cualquier error en la plantilla puede hacer que el playbook falle.

Comments are closed.