Хорошо, теперь у меня действительно сложный случай с Ansible. Мне нужно выполнить мою задачу асинхронно с повторными попытками (то есть с циклом до) и затем выполнить задачу, если превышено время ожидания. Таким образом, оба моих параметра должны контролировать мою игру: количество повторных попыток (воспроизведение завершается неудачно, если превышено количество повторных попыток) и время ожидания (неудачное воспроизведение, если превышено время ожидания).
Я могу реализовать каждую стратегию отдельно:
- name: My shell task with retries
shell: set -o pipefail && ./myscript.sh 2>&1 | tee -a "{{mylogfile}}"
args:
chdir: "{{myscript_dir}}/"
executable: /bin/bash
register: my_job
until: my_job is succeeded
retries: "{{test_retries}}"
delay: 0
или async:
- name: My async shell task
shell: set -o pipefail && ./myscript.sh 2>&1 | tee -a "{{mylogfile}}"
args:
chdir: "{{myscript_dir}}/"
executable: /bin/bash
register: my_job
async: "{{test_timeout}}"
poll: 0
- name: Tracking for async shell task
wait_for:
path: "{{mylogfile}}"
search_regex: '^.*Done in \S+'
timeout: "{{test_timeout}}"
ignore_errors: yes
register: result
Второе задание анализирует предыдущий журнал заданий, пока задание не будет завершено, то есть ищет строку «Выполнено за x секунд». Может быть, это не лучшая практика, и я должен использовать async_status
, но не могу найти, как установить тайм-аут с ним (у него есть только повторные попытки для проверки статуса задания, что довольно глупо для меня).
Ооочень .. Могу ли я комбинировать обе стратегии, чтобы контролировать свою задачу и с счетом повторов, и с тайм-аутом?
UPD: я попытался запустить оба модуля until
и async
для shell
, и, к удивлению, моя игра не провалиласьно повторные попытки не работают. Задача была запущена как задание «запусти и забудь» и выполнялась только один раз без повторных попыток. Так что это не вариант.
- name: My shell task with retries and async
shell: set -o pipefail && ./myscript.sh 2>&1 | tee -a "{{mylogfile}}"
args:
chdir: "{{myscript_dir}}/"
executable: /bin/bash
register: my_job
until: my_job is succeeded
retries: "{{test_retries}}"
delay: 0
async: "{{test_timeout}}"
poll: 0
- name: My async shell task
wait_for:
path: "{{mylogfile}}"
search_regex: '^.*Done in \S+'
timeout: "{{test_timeout}}"
ignore_errors: yes
register: result