=====In Ansible mit Datum rechnen - at job in x Minuten starten===== Problem: Rechnen in Ansible mit dem Datum ist ziemlich umständlich ...... Aufgabe: Ein AT Job soll angelegt werden der zu einer bestimmten Uhrzeit den Server neu startet. Normalerweise müsste so was ja in 15 Minuten als Ansible Playbook erstellt sein .. Stunden später, das rechnen mit Datum hat so ein Hürden in Ansible und Jinja2. Als Parameter werden dem Script in Tower übergeben: --- # gewünschte Stunde, Minute wird Random ermittelt um die VM Umgebung nicht zu überlasten hour: "04" # gewünschter tag falls next_day = false day: "31.03.2023" # Wenn true dann immer nächster Tag, falls false wird day Parameter verwendet next_day : "true" Das Playbook: --- - hosts: all become: yes collections: - ansible.posix vars: target_time: "{{hour}}:{{ range(10, 59) | random }}" tasks: - name: get the next day shell: "date -d '+1 days' +%d.%m.%Y" register: nextday - debug: var=nextday.stdout - name: Set target_date variable set_fact: target_next_date: "{{ nextday.stdout }}" - name: set Target date set_fact: target_date: "{% if next_day == 'false' %}{{day}}{% else %}{{ target_next_date }}{% endif %}" - name: Print Input Target Time debug: var: target_time - name: Print Input Target Date debug: var: target_date - name: Calculate minutes set_fact: #minutes_until_target: "{{ ((target_date + ' ' + target_time)|to_datetime('%Y-%m-%d %H:%M') - 'now'|to_datetime).seconds // 60 }}" minutes_until_target: "{{ (((target_date + ' ' + target_time)|to_datetime('%d.%m.%Y %H:%M') ) - now()).seconds // 60 }}" minutes_target_days: "{{ (((target_date + ' ' + target_time)|to_datetime('%d.%m.%Y %H:%M') ) - now()).days * 24 *60 }}" - name: Print day Minutes to target debug: var: minutes_target_days - name: Print minutes to target debug: var: minutes_until_target - name: calculate minutes step 2 set_fact: total_minutes: "{{ (minutes_target_days | int ) + ( minutes_until_target | int) }}" - name: Print Minutes to target debug: var: total_minutes - name: Install packages ansible.builtin.yum: name: - at state: present - name: Schedule a reboot ansible.posix.at: command: touch /tmp/reboot.test state: present unique: true count: "{{ total_minutes }}" units: minutes und warum so kompliziert? So ist es halt .... mit "total_seconds" wäre es am Ende wohl einfacher gewesen. Der Trick ist es zu verstehen das ein Datum abgezogen vom anderen Datum ein timeDelta Objekt ergibt => https://docs.python.org/3/library/datetime.html , auf die Eigenschaften kann dann zugegriffen werden ( (d.days, d.seconds, d.microseconds) ).