Templates Jinja2 18 min de lecture

Boucles et conditions dans les templates

Boucles dans les templates

# templates/hosts.j2
# Fichier genere par Ansible - ne pas modifier manuellement
{% for host in groups['webservers'] %}
{{ hostvars[host]['ansible_default_ipv4']['address'] }} {{ host }}
{% endfor %}

# templates/vhosts.conf.j2
{% for vhost in virtual_hosts %}
server {
    listen {{ vhost.port | default(80) }};
    server_name {{ vhost.name }};
    root {{ vhost.root }};

    {% for location in vhost.locations | default([]) %}
    location {{ location.path }} {
        proxy_pass {{ location.backend }};
    }
    {% endfor %}
}
{% endfor %}

Conditions dans les templates

# templates/app.conf.j2
[application]
name = {{ app_name }}
port = {{ app_port }}

{% if env == "production" %}
debug = false
log_level = warning
{% elif env == "staging" %}
debug = true
log_level = info
{% else %}
debug = true
log_level = debug
{% endif %}

{% if ssl_enabled | default(false) %}
ssl_certificate = {{ ssl_cert_path }}
ssl_key = {{ ssl_key_path }}
{% endif %}

Boucles avec conditions

# templates/firewall.conf.j2
{% for rule in firewall_rules %}
{% if rule.state == "enabled" %}
-A INPUT -p {{ rule.protocol }} --dport {{ rule.port }} -j ACCEPT
{% endif %}
{% endfor %}

# templates/sudoers.j2
{% for user in sudo_users %}
{% if user.nopasswd | default(false) %}
{{ user.name }} ALL=(ALL) NOPASSWD: ALL
{% else %}
{{ user.name }} ALL=(ALL) ALL
{% endif %}
{% endfor %}

Controle des espaces blancs

# Le tiret (-) supprime les espaces/lignes vides
{% for item in liste -%}
{{ item }}
{%- endfor %}

# Utile pour generer des fichiers propres sans lignes vides

Playbook complet avec templates

---
- name: Deployer la configuration
  hosts: webservers
  vars:
    app_name: myapp
    http_port: 80
    env: production
    virtual_hosts:
      - name: app.example.com
        port: 80
        root: /var/www/app
      - name: api.example.com
        port: 8080
        root: /var/www/api

  tasks:
    - name: Deployer la config Nginx
      template:
        src: templates/vhosts.conf.j2
        dest: /etc/nginx/sites-available/{{ app_name }}
      notify: Recharger Nginx

    - name: Deployer la config applicative
      template:
        src: templates/app.conf.j2
        dest: /etc/myapp/app.conf
      notify: Redemarrer l'application
Debug : Utilisez ansible -m template -a "src=template.j2 dest=/tmp/test" pour tester un template localement.