如何在ansible中逐个主机运行并在失败时停止

98次阅读
没有评论

问题描述

在使用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: 1max_failure_percentage: 0属性来按顺序执行任务并在失败时停止playbook。你还可以使用--forks 1参数来手动控制每次连接一个系统,或者使用调试器来进行调试和停止。如果你想从失败的主机继续执行,可以使用--limit参数和.retry文件,或者使用--start-at-task参数从特定任务重新开始执行。如果你的Ansible版本较旧,你可以尝试使用一些第三方工具来实现类似的功能。
请根据你的具体情况选择适合你的解决方案,并根据需要进行相应的配置和调整。

参考资料

正文完