=====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