Ansible 自定义工具,重试和重新部署

Ansible custom tool ,retry and redeploy

我正在尝试使用 Ansible 作为一组主机的部署工具,但我找不到正确的方法。

我想要 运行 一个在主机中安装 rpm 的自定义工具。

现在我可以做

ansible dev -i hosts.txt -m shell -a "rpmdeployer --install package_v2.rpm"

但这并没有给出重试文件(失败的主机) 我制作了一个剧本来获取重试文件

我尝试了一个简单的剧本

---
- hosts: dev
  tasks: 
    - name: deployer
     command: rpmdeployer --install package_v2.rpm

我知道这不符合 ansible 执行自定义命令和脚本的精神。有更好的方法吗?另外有没有办法一直尝试直到所有主机都成功?

Is there a better way of doing this?

你可以write a custom module。自定义模块甚至可以 成为 工具,因此您无需安装该依赖项。模块可以用任何语言编写,但建议使用 Python 因为:

  1. Python 无论如何都是 Ansible 的要求
  2. 使用Python时可以使用Ansible提供的API

如果您的工具有自定义模块,您的任务可能如下所示:

- name: deployer
  deployer: package_v2.rpm

Also is there a way to keep trying till all hosts succeeds?

Ansible 可以自动 retry 任务。

- name: deployer
  command: rpmdeployer --install package_v2.rpm
  register: result
  until: result | success
  retries: 42
  delay: 1

只要您的工具 returns 正确的退出代码(0 表示成功,>0 表示失败),此方法有效。如果不是,您可以应用任何自定义条件,例如在 stdout 中搜索内容等

我不知道有什么工具可以在 playbook 实际失败时自动重试。但是创建一个小的包装脚本来检查重试文件和 运行 带有 --limit @foo.retry 的剧本应该不会太难,直到它不再被重新创建。

但我不确定这是否有意义。如果使用您的工具安装 rpm 失败,我想它肯定会在任何重试时失败,除非游戏中有未知组件,例如首先下载 rpm。所以当然下载可能会失败,重试可能会成功。