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

时间:2017-05-23 12:19:22

标签: ansible

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

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

当我按以下方式重试时

  retries: 3  
  delay: 5

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

4 个答案:

答案 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使其更清洁。有人对此有建议吗?