Inhaltsverzeichnis

In Ansible templates "jinja2" verwenden und debuggen

Mit der Makro Sprache „jinja2 (siehe https://jinja.palletsprojects.com/en/3.0.x/ ) wird in Ansible dynamisch Code angepasst und Templates erzeugt.

Siehe dazu ⇒ https://docs.ansible.com/ansible/latest/user_guide/playbooks_templating.html

In Python Interpreter der Ansible Tower Umgebung testen

Über „jinja2.Template“ läßt sich zuvor auch testen ob es dann im Ansible Template so funktioniert wie erwartet.

Umgbung zuvor einstellen

source /var/lib/awx/venv/ansible/bin/activate

Python starten und Lib laden:

python
 
>>> import jinja2
 
 
# String zerlegen
 
>>> jinja2.Template(r'{{ "-".join(Text) }}').render(Text='ABCDE')
u'A-B-C-D-E'
 
 
>>>exit()

Beispiele

Variablen auslesen und in einer Zeile ausgeben

Playbook:

...
vars:
   dba_mail_list:
    -  xxxxx@mmmm.xx
    - yyyyy@mmmmm.xx
..

Im Template in einer Zeile mit Join durch Leerzeichen getrennt ausgeben:

>
{{ dba_mail_list | join(' ') }}

Ergibt dann im Ergebnis:

xxxxx@mmmm.xx yyyyy@mmmmm.xx

Facts verwenden und mit den Ergebnis rechnen

Suchen in den Ansible Fact Json mit ansible_mounts|json_query('[?mount == `/opt`].size_total') , darauf achten das das Ergebnis ein Record ist, daher mit „size_total[0]“ auf den eigentlichen Wert zugreifen!

 - hosts : apex01.pipperr.local
   vars:
    - size_total: "{{ ansible_mounts|json_query('[?mount == `/opt`].size_total') }}"
    - size_free : "{{ ansible_mounts|json_query('[?mount == `/opt`].size_available') }}"

   tasks:
    - name: check Diskspace
      ansible.builtin.debug:
       msg: "The filesystem has {{ ( size_total[0]/1024/1024 )|round(1,'common') }}  MB space, free is {{ (size_free[0]/1024/1024)|round(2)  }} MB"
    - name: check Diskspace
      ansible.builtin.debug:
       msg: "free space {{ size_free }} must be larger then {{ (2*1024*1024*1024) }}"
      failed_when: size_free[0]  < (2*1024*1024*1024)

Datumsrechnen

 vars:
  target_time: "02:{{range(5, 55) | random}}"
  target_date: "28.03.2023"

- name: Calculate minutes to start with ansible.posix.at a job after x minutes at 02: (minutes are random to reduce load on serverfarm, not start the job on each server to the same minte)
  set_fact:
   minutes_until_target: "{{ (((target_date + ' ' + target_time)|to_datetime('%d.%m.%Y %H:%M')  ) - now() ).seconds // 60 }}"

- name: Print minutes
  debug:
    var: minutes_until_target

Quellen

Dokumentation: