=====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:
* https://jinja.palletsprojects.com/en/3.0.x/
* https://www.golinuxcloud.com/jinja2-template/
* https://documentation.bloomreach.com/engagement/docs/useful-jinja-snippets
* https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_filters.html