Outils pour utilisateurs

Outils du site


tech:notes_ansible_jinja2

Ceci est une ancienne révision du document !


Notes Ansible Jinja2

Voir :

A la place du module template il est possible d'utiliser le module copy : Ansible M(template) M(copy)

     - name: Generate new resolv.conf
       ansible.builtin.copy:
         mode: "{{ stat_resolv_conf.stat.mode }}"
         content: |
           {% for nameserver in nameservers %}
           nameserver {{ nameserver }}
           {% endfor %}
         dest: resolv.conf.test

Jinja2 en ligne de commande j2cli j2

Install

apt-get install j2cli

ou

pip3 install jinja2-cli[yaml,toml,xml,hjson,json5]==0.8.2 # --break-system-packages

Exemples

Exemple 1

nginx.conf.j2
server {
  listen 80;
  server_name {{ nginx.hostname }};
 
  root {{ nginx.webroot }};
  index index.htm;
}
nginx.yaml
---

nginx:
  hostname: localhost
  webroot: "/var/html/projet1"
# j2 -f json nginx.conf.j2 nginx.json > nginx.conf
j2 nginx.conf.j2 nginx.yaml > nginx.conf

Exemple 2

timezone.j2
{{ TIMEZONE }}
ENV
TIMEZONE=Europe/Paris
j2 -f env timezone.j2 ENV > timezone

Regex

{{ requete_conteneur.stdout | regex_replace('\\s', '') }}

Exclure un élément d'une liste / enlever un élément d'une liste.

    - name: DEBUG
      debug: msg='{{ item }}'
      with_items: '{{ ansible_interfaces |difference(["lo"]) }}'

Condition IF

/etc/yum.repos.d/plop.repo
{% if ansible_distribution_version == '7.2' %}
[mirorlinux-rh7.2-x86_64]
name=Plop RH 7.2
baseurl=http://172.16.12.42/redhat/rh7.2/x86_64/
gpgcheck=0
enabled=1
{% endif %}
{% for user in users if not user.hidden %}
    <li>{{ user.username|e }}</li>
{% endfor %}

Valeur par défaut - variable undef

Erreur

fatal: [vmware-local]: FAILED! => {"failed": true, "msg": "'servers' is undefined"}

Code Ansible

- name: conf /etc/chrony.conf - add servers
  lineinfile: dest=/etc/chrony.conf line='server {{ item }} iburst'
  with_items:
    - "{{ servers }}"
    - 172.18.32.3

Code Ansible corrigé

- name: conf /etc/chrony.conf - add servers
  lineinfile: dest=/etc/chrony.conf line='server {{ item }} iburst'
  with_items:
    #- "{{ servers |default('') }}"
    - "{{ servers |default([]) }}"
    - 172.18.32.3

Liste vide avec item undef - with_item undef / empty :

{{ item |default([]) }}''

Lever une exeption

Source https://stackoverflow.com/questions/21778252/how-to-raise-an-exception-in-a-jinja2-macro

Avec Ansibe

{{ ('OK text' if condition_ok) | mandatory('Text of error message') }}

{{ ('' if false) | mandatory('ERROR: KIND must be A, B or C') }}

Ou sinon plus simple :

{{ 0/0 }}

Linter

Voir :

sudo apt-get install python3-pip
python3 -m venv djlint
source bin/activate
pip install djlint
$ ./bin/djlint ~/code/template-dockerfile/ --extension=j2 --lint

Linting 1/1 files ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 00:00


Dockerfile.j2
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
H025 19:9 Tag seems to be an orphan. <EOF >
H014 132:27 Found extra blank lines. e/pcc/logs

Linted 1 file, found 2 errors.
djlint . --extension=html.j2 --lint
 
djlint . --extension=html.j2 --check
 
djlint . --extension=html.j2 --reformat

Exemples

Variables - Whitespace Control - Exemple de contrôles de sauts de ligne et d'espaces

Méthode 1

  • Utilisation de + dans la boucle
  • Utilisation de - dans les conditions à l'interieur de la boucle
  • A la fin de la dernière condition (endif) utiliser un + à la place d'un -
{%+ for KEY in CONF.SYS_GROUPS +%}
    {%- if CONF.SYS_GROUPS[KEY].GID is defined -%}
        RUN groupadd -g {{ CONF.SYS_GROUPS[KEY].GID }} {{ KEY }}
    {%- else -%}
        RUN groupadd {{ KEY }}
    {%- endif +%}
{%+ endfor +%}

Méthode 2

  • Mettre des - systématiquement sauf aux extrémités de la boucle
  • A chaque fin de ligne utiliser :
{{ '\n' }}
{% for KEY in CONF.SYS_GROUPS -%}
    {%- if CONF.SYS_GROUPS[KEY].GID is defined -%}
        RUN groupadd -g {{ CONF.SYS_GROUPS[KEY].GID }} {{ KEY + '\n' }}
    {%- else -%}
        RUN groupadd {{ KEY + '\n' }}
    {%- endif -%}
{%- endfor %}

Ansible Templating all j2 files

- name: Templating all j2 files with config.yaml
  gather_facts: false
  hosts: localhost

  tasks:
    - name: Include vars of config.yaml
      no_log: true
      ansible.builtin.include_vars:
        file: config.yaml
        name: CONF

    - name: Find all j2 templates files
      register: reg_find_j2tpls
      ansible.builtin.find:
        paths: "."
        patterns: "*.j2"
        hidden: false
        file_type: file
        recurse: true
        excludes:
          - .git

    - name: Templating j2 files
      ansible.builtin.template:
        src: "{{ item }}"
        dest: "{{ dest }}"
        mode: "0600"
      loop: "{{ reg_find_j2tpls.files | map(attribute='path') }}"
      vars:
        dest: "{{ item | regex_replace('\\.j2$', '') }}"

Pb

Err template error while templating string: no filter named 'split'

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+') }}"}

La version d'Ansible est trop ancienne

A la place du filtre split il est possible d'utiliser la méthode split ou splitlines

- name: Set facts - get values - resolv.conf
  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' ) | list | replace('\\t', ' ') | regex_replace('domain\\s+') }}"
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