Gibt es eine Möglichkeit, Idempotenz für Playbooks zu garantieren, die zufällig generierte Variablen verwenden?Idempotenz und zufällige Variablen in Ansible
Zum Beispiel, ich möchte meine crontabs einrichten E-Mails auf mehreren Servern zu unterschiedlichen Zeiten auszulösen, so dass ich schaffen Zufallszahlen ansible des set_fact Modul:
tasks:
- set_fact:
first_run_30="{{ 30 | random }}"
run_once: yes
Dann diese generierten Variablen auf meine crontab gelten mit ansible etwa so:
- name: Setup cron30job
cron: name=cron30job minute={{first_run_30}},{{first_run_30 | int + 30}} job='/bin/bash /cron30job.sh' state=present user=root
environment:
MAILTO: '[email protected]'
MAILFROM: '[email protected]'
Das funktioniert sehr gut, aber ansible der indempotence Prinzip ist, glaube ich, gebrochen mit dieser Strategie, weil jedes Mal, wenn eine Wiedergabe durchgeführt wird Sie eine Änderung sehen:
TASK: [Setup cron30job] *****************************************
changed: [127.0.0.1]
Ferner wird in der crontab unter root Überprüfung jedes Mal während der drei Läufe:
[ansible]# cat /var/spool/cron/root
#Ansible: cron30job
5,35 * * * * /bin/bash /sw/test/cron30job.sh
#Ansible: cron30job
9,39 * * * * /bin/bash /sw/test/cron30job.sh
#Ansible: cron30job
6,36 * * * * /bin/bash /sw/test/cron30job.sh
Wenn es eine Abhilfe ist, oder vielleicht indempotence einfach nicht möglich sein, in meinem Fall würde Ich mag an kennt.
Auch wenn dies der einzige Vorschlag ist, wie es scheint, die vernünftigste Lösung. Ich muss jedoch darauf hinweisen, dass die Aufgabe "Eine pseudozufällige Minute erhalten" den Status "[geändert]" meldet. Ich empfehle, 'changed_when: false' hinzuzufügen, um dies zu verhindern. Es zu umgehen, ist in diesem Fall in Ordnung, weil wir eine Auszahlung für die Crontab garantieren und wir wissen, dass der Hash-Wert sich nicht für jede Maschine ändert, es sei denn, Sie ändern den Hostnamen für diese IP (was eine Frage der eigenen Sache ist). – Jake88
@ Jake88 guter Punkt! –
Das ist großartig, aber ich hatte zwei Probleme. Erstens funktionierte expr nicht mit der Standard-Shell (/ bin/sh) auf debian, was meiner Meinung nach Bindestrich ist. Das Hinzufügen von 'args: executable:/bin/bash' half dabei. Zweitens hat expr einen Exit-Code von 1, wenn der Output 0 ist. 'Failed_when:" minute.rc == 2 or minute.rc == 3' behebt das, indem Exit-Code 1 nicht fehlschlägt. – Berdir