问题描述
在使用Ansible playbook时,希望能够按顺序更新一些不稳定的设备。他可以使用serial:1
来实现,但是他希望在出现失败时停止整个playbook,以便在继续之前修复错误,而不是累积错误。他还希望在同一主机上重新启动playbook。目前使用的是Ansible v2.0,但如果这样的功能只在更新版本中可用,也可以切换到更新版本。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
根据Ansible的文档,当发生失败时,playbook会停止执行,并且使用serial: 1
可以实现按顺序执行。如果serial: 1
不够用,可以使用max_failure_percentage: 0
来设置额外的设置。
以下是解决方案的步骤:
1. 在你的playbook中添加serial: 1
属性。
2. 如果需要,在playbook中添加max_failure_percentage: 0
属性。
下面是一个示例的playbook:
- name: Update flaky devices
hosts: your_hosts
serial: 1
max_failure_percentage: 0
tasks:
- name: Task 1
# 定义任务1的操作
- name: Task 2
# 定义任务2的操作
# 添加其他任务
在上面的示例中,我们定义了一个名为”Update flaky devices”的playbook,并使用serial: 1
属性来确保按顺序执行任务。如果需要,可以添加max_failure_percentage: 0
属性来设置额外的设置。
方案2
如果你想手动控制每次连接一个系统,可以使用--forks 1
参数来运行Ansible ad-hoc命令。这样可以实现逐个主机运行的效果。
以下是一个示例:
ansible-playbook your_playbook.yml --forks 1
在这个示例中,我们使用--forks 1
参数来指定每次只连接一个系统。
方案3
如果你使用的是Ansible 2.5或更新版本,可以使用调试器来实现类似的功能。调试器可以帮助你在playbook执行过程中进行调试和停止。
以下是一个示例:
ansible-playbook your_playbook.yml --step
在这个示例中,我们使用--step
参数来启用调试器,并在每个任务之前暂停执行,以便你可以逐个任务进行调试和停止。
请注意,这个功能在Ansible 2.5及更新版本中可用。
方案4
如果你想在失败后重新运行playbook,并从失败的主机继续执行,可以使用--limit
参数和.retry
文件。
以下是一个示例:
ansible-playbook your_playbook.yml --limit @/path/to/your_playbook.retry
在这个示例中,我们使用--limit
参数来指定要运行的主机范围,并使用.retry
文件来指定从哪个主机继续执行。
请注意,.retry
文件将在playbook执行失败时自动生成,除非你在配置中禁用了.retry
文件的生成。
方案5
如果你想从特定任务重新开始执行playbook,可以使用--start-at-task
参数。
以下是一个示例:
ansible-playbook your_playbook.yml --start-at-task="your_task_name"
在这个示例中,我们使用--start-at-task
参数来指定要从哪个任务重新开始执行。
请注意,你需要将your_task_name
替换为你要重新开始执行的任务的名称。
方案6
如果你的Ansible版本较旧,无法使用上述方法,你可以尝试使用一些第三方工具来管理playbook的执行顺序和失败处理。这些工具可以帮助你实现类似的功能。
请注意,这些工具可能需要额外的配置和学习成本,并且可能与你的Ansible版本不兼容。
总结
根据你的需求,你可以选择使用serial: 1
和max_failure_percentage: 0
属性来按顺序执行任务并在失败时停止playbook。你还可以使用--forks 1
参数来手动控制每次连接一个系统,或者使用调试器来进行调试和停止。如果你想从失败的主机继续执行,可以使用--limit
参数和.retry
文件,或者使用--start-at-task
参数从特定任务重新开始执行。如果你的Ansible版本较旧,你可以尝试使用一些第三方工具来实现类似的功能。
请根据你的具体情况选择适合你的解决方案,并根据需要进行相应的配置和调整。
参考资料
- Ansible Documentation: Playbook Delegation
- Ansible Documentation: Retry Files Enabled
- Ansible Documentation: Start at Task
- GitHub Issue: ansible/ansible – Issue #1663
- GitHub Issue: ansible/ansible – Issue #16241