linux:ansible_templating_jinja2
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
linux/ansible_templating_jinja2.txt · Zuletzt geändert: 2023/03/27 16:35 von gpipperr