Ansible - 重试任务直到文件包含日志行
Ansible - Retry task until a file contains a log line
我有一个可执行文件,比方说 /tmp/foo
我想尝试 运行(最多 5 次)这个二进制文件,直到我在日志文件中看到一行:假设 /tmp/start.log
我需要这样的戏:
- block:
- shell: /tmp/foo
- pause: seconds=30
- name: Check if started successfully
shell: grep 'started successfully' /tmp/start.log
register: grep
retry: 5
until: grep.stdout
但不幸的是 Ansible 块不支持 retry-until.
我怎样才能做到这一点?
我用单一命令射击:
- shell: /tmp/foo; sleep 30; grep 'started successfully' /tmp/start.log
register: cmd_result
retries: 5
until: cmd_result | success
对于这种情况,使用普通 shell 脚本应该是最简单的方法。
Shell 脚本 start_foo.sh
(取决于 /tmp/foo
退出代码,您可以控制脚本是否以及在何处因 set -e
和 set +e
而失败) :
#!/bin/sh
set -e # fail the script if the command fails
/tmp/foo
sleep 30
set +e # do not fail the script when string is not found
grep 'started successfully' /tmp/start.log
exit 0
Ansible 任务:
- script: start_foo.sh
register: grep
retry: 5
until: grep.stdout
我有一个可执行文件,比方说 /tmp/foo
我想尝试 运行(最多 5 次)这个二进制文件,直到我在日志文件中看到一行:假设 /tmp/start.log
我需要这样的戏:
- block:
- shell: /tmp/foo
- pause: seconds=30
- name: Check if started successfully
shell: grep 'started successfully' /tmp/start.log
register: grep
retry: 5
until: grep.stdout
但不幸的是 Ansible 块不支持 retry-until.
我怎样才能做到这一点?
我用单一命令射击:
- shell: /tmp/foo; sleep 30; grep 'started successfully' /tmp/start.log
register: cmd_result
retries: 5
until: cmd_result | success
对于这种情况,使用普通 shell 脚本应该是最简单的方法。
Shell 脚本 start_foo.sh
(取决于 /tmp/foo
退出代码,您可以控制脚本是否以及在何处因 set -e
和 set +e
而失败) :
#!/bin/sh
set -e # fail the script if the command fails
/tmp/foo
sleep 30
set +e # do not fail the script when string is not found
grep 'started successfully' /tmp/start.log
exit 0
Ansible 任务:
- script: start_foo.sh
register: grep
retry: 5
until: grep.stdout