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