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"
[stextbox type=“info“ caption=“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 }}" |
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