Outils pour utilisateurs

Outils du site


tech:notes_ansible_jinja2

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
tech:notes_ansible_jinja2 [2025/03/24 15:06] – créée - modification externe 127.0.0.1tech:notes_ansible_jinja2 [2025/09/22 22:52] (Version actuelle) Jean-Baptiste
Ligne 1: Ligne 1:
 +<!DOCTYPE markdown>
 {{tag>Ansible YAML Jinja}} {{tag>Ansible YAML Jinja}}
  
-Notes Ansible Jinja2+Notes Ansible Jinja2
  
  
Ligne 11: Ligne 12:
   * https://blog.stephane-robert.info/post/ansible-template-jinja/   * https://blog.stephane-robert.info/post/ansible-template-jinja/
   * j2cli   * j2cli
 +  * [Mastering loops with Jinja templates in Ansible](https://www.redhat.com/en/blog/ansible-jinja)
 +  * https://blog.stephane-robert.info/docs/developper/programmation/python/jinja/
 +
 +
 +
  
 A la place du module **template** il est possible d'utiliser le module **copy** : A la place du module **template** il est possible d'utiliser le module **copy** :
 Ansible M(template) M(copy) Ansible M(template) M(copy)
-<code yaml>+~~~yaml
      - name: Generate new resolv.conf      - name: Generate new resolv.conf
        ansible.builtin.copy:        ansible.builtin.copy:
Ligne 23: Ligne 29:
            {% endfor %}            {% endfor %}
          dest: resolv.conf.test          dest: resolv.conf.test
-</code>+~~~
  
 +### Ansible jinja version
  
 +~~~
 +$ ansible --version |grep jinja
 +  jinja version = 3.1.6
 +~~~
  
-=== Jinja2 en ligne de commande j2cli j2 
  
-==== Install+### Jinja2 en ligne de commande j2cli j2
  
-<code bash>+#### Install 
 + 
 +~~~bash
 apt-get install j2cli apt-get install j2cli
-</code>+~~~
  
 ou ou
-<code bash>+~~~bash
 pip3 install jinja2-cli[yaml,toml,xml,hjson,json5]==0.8.2 # --break-system-packages pip3 install jinja2-cli[yaml,toml,xml,hjson,json5]==0.8.2 # --break-system-packages
-</code>+~~~
  
-==== Exemples+#### Exemples
  
 Exemple 1 Exemple 1
  
-<code c nginx.conf.j2>+''nginx.conf.j2'' 
 +~~~nginx
 server { server {
   listen 80;   listen 80;
Ligne 52: Ligne 65:
   index index.htm;   index index.htm;
 } }
-</code>+~~~
  
-<code yaml nginx.yaml>+''nginx.yaml'' 
 +~~~yaml
 --- ---
  
Ligne 61: Ligne 75:
   webroot: "/var/html/projet1"   webroot: "/var/html/projet1"
  
-</code>+~~~
  
-<code bash>+~~~bash
 # j2 -f json nginx.conf.j2 nginx.json > nginx.conf # j2 -f json nginx.conf.j2 nginx.json > nginx.conf
 j2 nginx.conf.j2 nginx.yaml > nginx.conf j2 nginx.conf.j2 nginx.yaml > nginx.conf
-</code>+~~~
  
 Exemple 2 Exemple 2
  
-<file - timezone.j2>+''timezone.j2'' 
 +~~~
 {{ TIMEZONE }} {{ TIMEZONE }}
-</file>+~~~
  
-<file bash ENV>+''ENV'' 
 +~~~bash
 TIMEZONE=Europe/Paris TIMEZONE=Europe/Paris
-</file>+~~~
  
-<code bash>+~~~bash
 j2 -f env timezone.j2 ENV > timezone j2 -f env timezone.j2 ENV > timezone
-</code>+~~~
  
  
  
-=== Regex+### Regex
  
-<code ->+~~~
 {{ requete_conteneur.stdout | regex_replace('\\s', '') }} {{ requete_conteneur.stdout | regex_replace('\\s', '') }}
-</code>+~~~
  
 Exclure un élément d'une liste / enlever un élément d'une liste. Exclure un élément d'une liste / enlever un élément d'une liste.
  
-<code yaml>+~~~yaml
     - name: DEBUG     - name: DEBUG
       debug: msg='{{ item }}'       debug: msg='{{ item }}'
       with_items: '{{ ansible_interfaces |difference(["lo"]) }}'       with_items: '{{ ansible_interfaces |difference(["lo"]) }}'
-</code>+~~~
  
-=== Condition IF+### Condition IF
  
-<code - /etc/yum.repos.d/plop.repo>+''/etc/yum.repos.d/plop.repo'' 
 +~~~
 {% if ansible_distribution_version == '7.2' %} {% if ansible_distribution_version == '7.2' %}
 [mirorlinux-rh7.2-x86_64] [mirorlinux-rh7.2-x86_64]
Ligne 108: Ligne 125:
 enabled=1 enabled=1
 {% endif %} {% endif %}
-</code>+~~~
  
-<code ->+~~~
 {% for user in users if not user.hidden %} {% for user in users if not user.hidden %}
     <li>{{ user.username|e }}</li>     <li>{{ user.username|e }}</li>
 {% endfor %} {% endfor %}
-</code>+~~~
  
  
-=== Valeur par défaut - variable undef+### Valeur par défaut - variable undef
  
 Erreur Erreur
-<code ->+~~~
 fatal: [vmware-local]: FAILED! => {"failed": true, "msg": "'servers' is undefined"} fatal: [vmware-local]: FAILED! => {"failed": true, "msg": "'servers' is undefined"}
-</code>+~~~
  
 Code Ansible Code Ansible
-<code yaml>+~~~yaml
 - name: conf /etc/chrony.conf - add servers - name: conf /etc/chrony.conf - add servers
   lineinfile: dest=/etc/chrony.conf line='server {{ item }} iburst'   lineinfile: dest=/etc/chrony.conf line='server {{ item }} iburst'
Ligne 131: Ligne 148:
     - "{{ servers }}"     - "{{ servers }}"
     - 172.18.32.3     - 172.18.32.3
-</code>+~~~
  
 Code Ansible corrigé  Code Ansible corrigé 
-<code yaml>+~~~yaml
 - name: conf /etc/chrony.conf - add servers - name: conf /etc/chrony.conf - add servers
   lineinfile: dest=/etc/chrony.conf line='server {{ item }} iburst'   lineinfile: dest=/etc/chrony.conf line='server {{ item }} iburst'
Ligne 141: Ligne 158:
     - "{{ servers |default([]) }}"     - "{{ servers |default([]) }}"
     - 172.18.32.3     - 172.18.32.3
-</code>+~~~
  
 Liste vide avec item undef - with_item undef / empty :  Liste vide avec item undef - with_item undef / empty : 
-<code>+~~~
 {{ item |default([]) }}'' {{ item |default([]) }}''
-</code>+~~~ 
 + 
 + 
 +### Affichage - Alignement 
 + 
 +Avec la méthode ''ljust'' ou ''rjust'' 
 + 
 +~~~jinja 
 +{% for HOST in hosts %} 
 +define host { 
 +{% for k, v in HOST.items() %} 
 +        {{ k.ljust(20) }}                       {{ v }} 
 +{% endfor %} 
 +
 + 
 +{% endfor %} 
 +~~~
  
  
-=== Lever une exeption+### Lever une exeption
  
  
Ligne 155: Ligne 188:
  
 Avec Ansibe  Avec Ansibe 
-<code ->+~~~
 {{ ('OK text' if condition_ok) | mandatory('Text of error message') }} {{ ('OK text' if condition_ok) | mandatory('Text of error message') }}
  
 {{ ('' if false) | mandatory('ERROR: KIND must be A, B or C') }} {{ ('' if false) | mandatory('ERROR: KIND must be A, B or C') }}
-</code>+~~~
  
 Ou sinon plus simple : Ou sinon plus simple :
-<code ->+~~~
 {{ 0/0 }} {{ 0/0 }}
-</code>+~~~
  
  
  
  
-== Linter+## Linter
  
 Voir : Voir :
   * https://pypi.org/project/djlint/   * https://pypi.org/project/djlint/
  
-<code bash>+~~~bash
 sudo apt-get install python3-pip sudo apt-get install python3-pip
-</code>+~~~
  
-<code bash>+~~~bash
 python3 -m venv djlint python3 -m venv djlint
 source bin/activate source bin/activate
 pip install djlint pip install djlint
-</code>+~~~
  
-<code ->+~~~
 $ ./bin/djlint ~/code/template-dockerfile/ --extension=j2 --lint $ ./bin/djlint ~/code/template-dockerfile/ --extension=j2 --lint
  
Ligne 196: Ligne 229:
  
 Linted 1 file, found 2 errors. Linted 1 file, found 2 errors.
-</code>+~~~
  
-<code bash>+~~~bash
 djlint . --extension=html.j2 --lint djlint . --extension=html.j2 --lint
  
Ligne 204: Ligne 237:
  
 djlint . --extension=html.j2 --reformat djlint . --extension=html.j2 --reformat
-</code>+~~~
  
-== Exemples+## Exemples
  
-=== Variables - Whitespace Control - Exemple de contrôles de sauts de ligne et d'espaces+### Variables - Whitespace Control - Exemple de contrôles de sauts de ligne et d'espaces
  
 Voir : https://jinja.palletsprojects.com/en/stable/templates/#variables Voir : https://jinja.palletsprojects.com/en/stable/templates/#variables
  
  
-==== Méthode 1 +#### Méthode 1 
  
 * Utilisation de ''+'' dans la boucle * Utilisation de ''+'' dans la boucle
Ligne 219: Ligne 252:
 * A la fin de la dernière condition (''endif'') utiliser un ''+'' à la place d'un ''-'' * A la fin de la dernière condition (''endif'') utiliser un ''+'' à la place d'un ''-''
  
-<code ->+~~~
 {%+ for KEY in CONF.SYS_GROUPS +%} {%+ for KEY in CONF.SYS_GROUPS +%}
     {%- if CONF.SYS_GROUPS[KEY].GID is defined -%}     {%- if CONF.SYS_GROUPS[KEY].GID is defined -%}
Ligne 227: Ligne 260:
     {%- endif +%}     {%- endif +%}
 {%+ endfor +%} {%+ endfor +%}
-</code>+~~~
  
  
  
-==== Méthode 2+#### Méthode 2
  
 * Mettre des ''-'' systématiquement sauf aux extrémités de la boucle * Mettre des ''-'' systématiquement sauf aux extrémités de la boucle
 * A chaque fin de ligne utiliser :  * A chaque fin de ligne utiliser : 
-<code ->{{ '\n' }}</code> +~~~ 
 +{{ '\n' }} 
 +~~~ 
  
-<code ->+~~~
 {% for KEY in CONF.SYS_GROUPS -%} {% for KEY in CONF.SYS_GROUPS -%}
     {%- if CONF.SYS_GROUPS[KEY].GID is defined -%}     {%- if CONF.SYS_GROUPS[KEY].GID is defined -%}
Ligne 245: Ligne 280:
     {%- endif -%}     {%- endif -%}
 {%- endfor %} {%- endfor %}
-</code>+~~~
  
  
-== Ansible Templating all j2 files+## Ansible Templating all j2 files
  
-<code yaml>+~~~yaml
 - name: Templating all j2 files with config.yaml - name: Templating all j2 files with config.yaml
   gather_facts: false   gather_facts: false
Ligne 281: Ligne 316:
       vars:       vars:
         dest: "{{ item | regex_replace('\\.j2$', '') }}"         dest: "{{ item | regex_replace('\\.j2$', '') }}"
-</code>+~~~
  
  
  
  
-== Pb+## Pb
  
-=== Err template error while templating string: no filter named 'split'+### Err template error while templating string: no filter named 'split'
  
-<code ->+~~~
 fatal: [localhost]: FAILED! => {"msg": "template error while templating string: no filter named 'split'. String: {{ fic_resolv.content | b64decode | split('\n') | select('match', '^nameserver\\\\s' ) | replace('\\\\t', ' ') | regex_replace('nameserver\\\\s+') }}"} fatal: [localhost]: FAILED! => {"msg": "template error while templating string: no filter named 'split'. String: {{ fic_resolv.content | b64decode | split('\n') | select('match', '^nameserver\\\\s' ) | replace('\\\\t', ' ') | regex_replace('nameserver\\\\s+') }}"}
-</code>+~~~
  
 La version d'Ansible est trop ancienne La version d'Ansible est trop ancienne
Ligne 298: Ligne 333:
 A la place du filtre ''split'' il est possible d'utiliser la méthode ''split'' ou ''splitlines'' A la place du filtre ''split'' il est possible d'utiliser la méthode ''split'' ou ''splitlines''
  
-<code yaml>+~~~yaml
 - name: Set facts - get values - resolv.conf - name: Set facts - get values - resolv.conf
   ansible.builtin.set_fact:   ansible.builtin.set_fact:
     # resolv_lines_domains: "{{ fic_slurp_resolv.content | b64decode | split('\n') | select('match', '^domain\\s' )     | replace('\\t', ' ') | regex_replace('domain\\s+'    }}"     # resolv_lines_domains: "{{ fic_slurp_resolv.content | b64decode | split('\n') | select('match', '^domain\\s' )     | replace('\\t', ' ') | regex_replace('domain\\s+'    }}"
     resolv_lines_domains: "{{ (fic_slurp_resolv.content | b64decode).split('\n') | select('match', '^domain\\s' ) | list | replace('\\t', ' ') | regex_replace('domain\\s+') }}"     resolv_lines_domains: "{{ (fic_slurp_resolv.content | b64decode).split('\n') | select('match', '^domain\\s' ) | list | replace('\\t', ' ') | regex_replace('domain\\s+') }}"
-</code>+~~~
  
  
tech/notes_ansible_jinja2.1742825205.txt.gz · Dernière modification : de 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki