【问题标题】:Does Ansible do fault-tolerant SSHing?Ansible 做容错 SSH 吗?
【发布时间】:2017-07-02 11:26:27
【问题描述】:

问题陈述:

我使用 Ansible 生成从属实例,并通过 SSH 连接到它们,执行一些任务并终止它们。

假设剧本生成 3 个实例。在 SSH 进入从属实例时,如果一个人的 SSH 失败,那么 Ansible 会继续使用那些成功完成 SSH 的实例,还是完全失败?

如果没有,那我有什么办法吗?

PS:我确实探索了ssh_connectionretries 选项。但在这里,failed SSH 的意思是暗示 SSH 在重试后失败。

【问题讨论】:

  • "如果没有,有什么办法可以做到吗?" -- 怎么办?前面的问题是“A or B”。
  • it == "继续使用 SSH 成功的实例,不要让下面的后续任务失败" :) 。将正确更新 qn
  • 这就是 Ansible 默认所做的。只需暂时拔下一台服务器,或在清单文件中更改其 IP 以进行检查。对我来说这看起来不是一个很好的问题......
  • @techraf 将检查:)。抱歉,我是 Ansible 的新手。所以,不知道 Ansible 已经做到了。可以将其添加为答案吗?

标签: ssh amazon-ec2 ansible


【解决方案1】:

默认情况下,Ansible 将为所有指定的主机运行您的剧本。如果其中任何一个失败,它仍然会继续为其余主机运行 playbook,最后将使用失败主机的名称创建一个 playbook.retry 文件,然后您可以使用以下命令重新运行:

ansible-playbook playbook.yml --limit @playbook.retry

(假设您的 playbook 的名称是 playbook.yml)请注意,即使您的某些任务已成功完成,重新运行也会从头开始重新运行整个 playbook,因此您应该始终尝试使 playbook 具有弹性重新运行。另请注意,即使您的 playbook 中有多个 play,都引用同一个 host,但在 host 第一次失败时,ansible 根本不会尝试该 host 进行后续播放。

但是有一些方法可以改变默认行为:

  • 例如,对于某些使用any_errors_fatal: true 的任务,您可以使用abort the play,这意味着失败意味着ansible 将停止在所有主机上执行(假设您使用默认值linear strategy。使用free 策略意味着其他主机可能处于不同的阶段,这意味着它们可能比您预期的更早/更晚中止)
  • 此外,从 ansible 2.2 开始,您可以在播放之间 re-set unreachable hosts,这意味着即使您的主机在其中一个播放中失败,在后续的播放中,ansible 仍将重新尝试在其上运行新的播放(之前的播放将仍被标记为失败)。您必须将meta: clear_host_errors 添加到要重试所有以前无法访问的主机的播放中。

【讨论】:

  • 感谢您的详细回答:)
猜你喜欢
  • 2016-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-26
  • 2017-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多