Bei lang laufenden Tasks in einem Ansible Playbook (z.B. Datenbank Importe usw.) kann es vorkommen, dass unser Task in einen Timeout läuft weil die SSH Sitzung zurückgesetzt wird. Ansible bietet hier aber die möglichkeit einen solchen Timeout zu umgehen, indem ein Task im “Hintergrund” gestartet wird. Ansible wird dann in einem eingestellten Intervall den Status des Tasks überprüfen und bei Fertigstellung oder Abbruch entsprechend reagieren.
Ansible unterscheidet hier in zwei Fällen. Der erste Fall ist, dass ein Task im Hintergrund gestartet wird mit einem definierten Timeout wert und alle x Sekunden den Status des Tasks überprüft. Der zweite Fall ist, dass der Task im Hintergrund gestartet wird aber nicht auf das Beenden wartet sondern in der Zwischenzeit andere Tasks ausführt um später (eventuell) auf den Status des Hintergrund-Tasks erneut zu prüfen.
Das erste Beispiel würde beispielsweise so aussehen.
- name: My Long running Task
shell: "/bin/sleep 900"
async: 1000
poll: 5
In diesem Beispiel würde Ansible bei diesem Task “stehenbleiben” und auf das Beenden des Tasks warten. Ansible wird maximal 1000 Sekunden (async
) auf Rückmeldung warten um dann von sich aus in einen Timeout zu laufen. Auf ein Statusupdate des Tasks wird alle 5 Sekunden geprüft.
Das zweite Beispiel sieht so aus:
- name: My Long running Task
shell: "/bin/sleep 900"
async: 1000
poll: 0
register: sleeping_task_status
- name: A different Task in the meantime
...
- name: Another Task in the meantime
...
- name: Check on an async task
async_status:
jid: "{{ sleeping_task_status.ansible_job_id }}"
register: task_result
until: task_result.finished
retries: 100
delay: 10
Der Unterschied hierbei ist, dass wir im Task den wir in den Hintergrund schicken den Wert 0 beim Parameter poll
angeben. Nun können wir beliebig viele Tasks in der Zwischenzeit anstarten um dann wieder im letzten Task auf die Beendigung des Hintergrund-Tasks zu prüfen. In meinem Beispiel würden wir alle 10 Sekunden (delay
) prüfen und zwar 100 mal (retries
).
Philip