Gleichbleibende Zufallszahlen

Manchmal braucht man in Ansible Zufallszahlen, entweder wenn man cronjobs für die Backups verteilt und nicht möchte, dass alle zur selben Zeit los gehen

Dies wäre eigentlich einfach mittels dem random-filter:

minutes: "{{ 60 | random }}"

Das Problem hierbei ist, dass man so bei jedem Durchlauf eine neue Zahl und damit ein „Changed“ bekommt.

Ab ansible 2.3 kann man den Hostnamen als seed verwenden, um für jeden Host eine Zufallszahl zu generieren, welche jedoch pro Host gleich bleibt:

"{{ 59 |random(seed=inventory_hostname) }} * * * * root /script/from/cron"
frühere Ansible Versionen
Für frühere Ansible Versionen lässt sich dies selbst basteln:
hour:     "{{ (( inventory_hostname | hash | list | map('int',0,16) | sum ) % 5) + 1 }}"

minute:   "{{ ( inventory_hostname | hash | list | map('int',0,16) | sum ) % 60 }}"
Dies generiert für die Minuten pro Host einen Zufälligen Wert zwischen 0 und 60 und für die Stunden einen zwischen 1 und 5.

Beispiel in einem ansible playbook:
- name:       Add backup cronjob
  cron:
    name:     "Nightly Backups between 01:00 and 05:59"
    job:      "backup.sh > backup.log 2>&1"
    state:    "present"
    #day:     "*"
    hour:     "{{ (( inventory_hostname | hash | list | map('int',0,16) | sum ) % 5) + 1 }}"
    minute:   "{{ ( inventory_hostname | hash | list | map('int',0,16) | sum ) % 60 }}"
    #month:   "*"
    #weekday: "*"

Weitere Infos: Ansible Daily: Idempotent random number


Published by

Steven Varco

Steven ist ein Redhat RHCE-Zertifizierter Linux-Crack und ist seit über 18 Jahren sowohl beruflich wie auch privat auf Linux spezialisiert. In seinem Keller steht ein Server Rack mit diversen ESX und Linux Servern.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.