如何重试可能失败的Ansible任务?

Bar*_*cki 28 ansible

在我的Ansible游戏中,我正在重新启动数据库,然后尝试对其进行一些操作.重启启动后,重启命令会立即返回,而不是在db启动时.下一个命令尝试连接到数据库.当db没有启动时,该命令失败了.

我想重试几次我的第二个命令.如果上次重试失败,我想失败.

当我重试如下

  retries: 3  
  delay: 5
Run Code Online (Sandbox Code Playgroud)

然后根本不执行重试,因为第一个命令执行整个播放失败.我可以添加, ignore_errors: yes但即使所有重试都失败,这种方式也会通过.有没有一种简单的方法可以在我成功之前重试失败,但是在上次重试没有成功的情况下会失败?

tec*_*raf 48

我不明白你的说法是" 第一次命令执行失败 ".如果Ansible表现得这样,那就没有意义了.

以下任务:

- command: /usr/bin/false
  retries: 3
  delay: 3
  register: result
  until: result.rc == 0
Run Code Online (Sandbox Code Playgroud)

生产:

TASK [command] ******************************************************************************************
FAILED - RETRYING: command (3 retries left).
FAILED - RETRYING: command (2 retries left).
FAILED - RETRYING: command (1 retries left).
fatal: [localhost]: FAILED! => {"attempts": 3, "changed": true, "cmd": ["/usr/bin/false"], "delta": "0:00:00.003883", "end": "2017-05-23 21:39:51.669623", "failed": true, "rc": 1, "start": "2017-05-23 21:39:51.665740", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
Run Code Online (Sandbox Code Playgroud)

这似乎正是你想要的.

  • 失败的!=> {“msg”:“条件检查'result.rc == 0'失败。错误是:评估条件时出错(result.rc == 0):'dict object'没有属性'rc'” (4认同)
  • 正如下面的答案所指出的,小的改进是“直到:结果没有失败” (3认同)

Mxx*_*Mxx 15

考虑使用wait_for模块.它在继续之前等待条件,例如,端口变为打开或关闭,文件是否存在,或者文件中的某些内容.

如果没有看到剧本的其余部分,请考虑以下示例:

- name: Wait for db server to restart
  local_action:
    wait_for:
      host=192.168.50.4
      port=3306
      delay=1
      timeout=300
Run Code Online (Sandbox Code Playgroud)

您还可以将其作为处理程序进行调整,并明显更改此代码段以适合您的用例.


小智 6

不知道这是否特定于Ansible塔,但我正在使用:

- command: /usr/bin/false
  register: result
  retries: 3
  delay: 10
  until: result is not failed
Run Code Online (Sandbox Code Playgroud)