2017-05-23 31 views
0

在我的Ansible游戏中,我正在重新启动数据库,然后尝试对其执行一些操作。只要重新启动,重新启动命令就会返回,而不是在数据库启动时。下一个命令尝试连接到数据库。当db没有启动时,那命令我失败。如何重试可能失败的Ansible任务?

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

当我试如下

retries: 3 
    delay: 5 

然后重试不执行可言,因为第一命令执行失败,整出戏。我可以添加ignore_errors: yes,但即使所有重试都失败,该方式也会通过。有没有一种简单的方法可以在我取得成功之前重试失败,但在上次重试失败时失败?

+0

请发布整个任务。我不明白你的担心 - 如果你写得正确,首先执行不应该失败。 – techraf

回答

2

我不明白你声称“第一个命令执行失败整个游戏”。如果Ansible以这种方式表现出来,这是没有道理的。

以下任务:

- command: /usr/bin/false 
    retries: 3 
    delay: 3 
    register: result 
    until: result.rc == 0 

生产:

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": []} 

这似乎正是你想要的。

+0

这就是对的。我的任务在'until'部分有错误的条件。 –

3

考虑使用wait_for模块。在继续之前它会等待一个条件,例如,一个端口打开或关闭,文件存在或不存在,或文件中的某些内容。

没有看到你的剧本的其余部分,请看下面的例子:

- name: Wait for db server to restart 
    local_action: 
    wait_for: 
     host=192.168.50.4 
     port=3306 
     delay=1 
     timeout=300 

你也可以修改它的处理程序,并明显改变这个片段,以满足您的使用情况。

相关问题