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 -eset +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