erste Version 27.03.2023
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: Install packages ansible.builtin.yum: name: - at state: present - name: Enable and start atd service ansible.builtin.systemd: name: atd enabled: yes state: started - 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: 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) ).
als Root auf dem Zielsystem
# was ist in der at Queue atq #Was wird ausgeführt at -c <jobid> #Wie es wieder löschen atrm
Bei Problemen testen:
vi testAt.sh #!/bin/sh DATE=`date --utc +%s` echo "Teste Aufruf AT um $DATE" | tee /tmp/at.log exit 0 at now -f testAt.sh warning: commands will be executed using /bin/sh job 3 at Wed Dec 10 13:39:00 2025 Can't open /var/run/atd.pid to signal atd. No atd running?
Job aktieren!
systemctl enable atd
systemctl start atd