我正在尝试将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的精神来执行自定义命令和脚本。有没有更好的方法呢?还有一种方法可以继续尝试直到所有主机都成功吗?
答案 0 :(得分:1)
有更好的方法吗?
你可以write a custom module。自定义模块甚至可以 该工具,因此您可以摆脱安装该依赖项。模块可以用任何语言编写,但建议使用Python,因为:
如果您的工具有自定义模块,则任务可能如下所示:
- name: deployer
deployer: package_v2.rpm
还有一种方法可以继续尝试直到所有主机都成功吗?
Ansible可以自动retry个任务。
- name: deployer
command: rpmdeployer --install package_v2.rpm
register: result
until: result | success
retries: 42
delay: 1
如果您的工具返回正确的退出代码(成功时为0,失败时为> 0),则此方法有效。如果没有,您可以应用任何自定义条件,例如在stdout
搜索内容等。
我不知道当剧本实际失败时自动重试的工具。但是,创建一个小的包装器脚本来检查重试文件并使用--limit @foo.retry
运行playbook直到不重新创建它不应该太难。
但我不确定这是否合理。如果使用您的工具安装rpm失败,我想保证它在任何重试时都会失败,除非游戏中有未知的组件,比如首先下载rpm。因此,当然下载可能会失败,重试可能会成功。