Benutzer-Werkzeuge

Webseiten-Werkzeuge


linux:ansible_rechnen_datum

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:

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

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
linux/ansible_rechnen_datum.txt · Zuletzt geändert: 2023/03/27 22:18 von gpipperr