在我的Ansible游戏中,我正在重新启动数据库,然后尝试对其进行一些操作。重启启动后,重启命令会立即返回,而不是在db启动时。下一个命令尝试连接到数据库。当db未启动时,该命令失败。
我想重试几次我的第二个命令。如果上次重试失败,我想失败。
当我按以下方式重试时
retries: 3
delay: 5
然后根本不执行重试,因为第一个命令执行整个播放失败。我可以添加ignore_errors: yes
,但即使所有重试都失败,这种方式也会通过。有没有一种简单的方法可以在我成功之前重试失败,但是在上次重试没有成功时会失败?
答案 0 :(得分:29)
我不明白你声称“第一个命令执行无法全部播放”。如果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": []}
这似乎正是你想要的。
答案 1 :(得分:13)
考虑使用wait_for
模块。它在继续之前等待一个条件,例如端口变为打开或关闭,文件是否存在,或文件中的某些内容。
如果没有看到剧本的其余内容,请考虑以下示例:
- name: Wait for db server to restart
local_action:
wait_for:
host=192.168.50.4
port=3306
delay=1
timeout=300
您还可以将其作为处理程序进行调整,并明显更改此代码段以适合您的用例。
答案 2 :(得分:1)
不确定这是否是Ansible塔特有的,但我正在使用:
- command: /usr/bin/false
register: result
retries: 3
delay: 10
until: result is not failed
答案 3 :(得分:1)
对于以下任务:
- hosts: all
become: yes
tasks:
- name: create the 'myusername' user
user: name=myusername append=yes state=present createhome=yes shell=/bin/bash
我不确定遥控器是否已准备就绪(因为这是新旋转的节点)。因此,我不得不尝试重试和延迟操作。不幸的是没有运气。现在,我最终在bash脚本中创建了一个包装器,以实现所需的行为。
#!/bin/bash
STATUS_CODE=1
TRY=1
while [ "$STATUS_CODE" -ge 1 ]
do
if [ $TRY -gt 5 ];
then
echo Retried to connect to node 5 times and failed. Exiting
exit 1
fi
ansible-playbook -i $HOSTS_FILE user.yml
STATUS_CODE=$?
TRY=$(( $TRY + 1 ))
if [ $STATUS_CODE -ge 1 ]
then
echo Retry to connect to node in 5 seconds
sleep 5
fi
done
仍然希望使用ansible-playbook yml使其更清洁。有人对此有建议吗?