Benutzer-Werkzeuge

Webseiten-Werkzeuge


linux:ansible_rechnen_datum

In Ansible mit Datum rechnen - at Job in x Minuten starten

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:

reboot_server.yml
---
- 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) ).


Überprüfen

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

Falls der Aufruf nicht erfolgt

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

Quellen

Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information
"Autor: Gunther Pipperr"
linux/ansible_rechnen_datum.txt · Zuletzt geändert: von gpipperr