自动重试configuration推或Ansible或Saltstack?

我试图为500-2000个非常地理分布的主机selectconfigurationpipe理系统。 由于不同的networking可靠性,可能会有多个主机在任何时候暂时不可用。 出于这个原因,我最初的select是厨师,因为它使用“拉”模式,当主机上网和登记时,他们会立即得到当前的configuration。

但是,如果我的主机只会每30分钟轮询一次Chef服务器的新configuration,则不可能进行快速部署。 另外,我不是Rubyist。 我宁愿使用基于推送的模型,我可以尽可能快地将configuration推送到主机。 所以,自然select似乎是Ansible或SaltStack(可能是SaltStack)。 但是我的问题是:Ansible和SaltStack如何处理失败或失败的主机? 有什么方法可以在主机重新联机之前一直保持重试吗? 是否存在用这些工具正确处理停机主机一致性的模式? 谢谢!

Salt从节点运行到主模式。 你可以像master一样从master发出全局命令

salt 'api*.domain.com` state.highstate 

这将在具有api * .domain.com的id(主机名)的所有主机上运行高端状态。 最高境界就像一个完整的厨师跑。

通常默认情况下,人们可能会把主人的日程安排放在奴才上,或者他们会按照自己的时间运行时间表,每10分钟跑一个高位。

所以如果一个节点closures,并且你在主服务器上运行一个命令来运行一个状态,那么salt会报告节点在其运行输出中被closures,这个输出可以用许多不同的方式进行格式化,以供你摄取。 它甚至可以logging到MySQL例如。

例如,如果您在主服务器上运行上述命令,以在所有api*.domain.com .domain.com节点上运行highstate。 如果5000个中的2个当前正在重新启动,一旦salt-minion回来在线,他们将通过消息总线从主站获得甚至运行最高状态。

Salt也有一个叫做代理节点的东西来帮助master的加载。 你可以在每个数据中心有一个主节点和一个代理节点,并且从主节点发出的所有命令都要经过代理节点,这些数据中心中的小伙伴们到达了它们的代理节点,

我只能回答这个Ansible。

Ansible本身不处理无法访问的主机。 它会尝试连接和一次,如果这是不可能的主机被扔出当前播放。 但Ansible给你一些工具来处理这个你自己。

首先是wait_for模块。 有了这个,你可以等待一个非常高的超时,直到主机可用。

 - wait_for: port: 22 delay: 10 timeout: 3600 host: "{{ inventory_hostname }}" delegate_to: localhost 

这一点虽然会是一个问题,当你运行的播放,因为Ansible默认情况下不会处理任何进一步的任务,直到所有主机通过这项任务。 在这种情况下,这是相反的。 根据你的描述,当最后一个主机终于可以到达时,第一个主机可能再次不可用。

为了解决这个问题,你需要使用Ansible 2,它有一个叫做“ 策略”的新function。 strategy: free允许您尽可能快地运行每个任务,这意味着只要主机可用,它就会运行所有任务。

不过,连接可能会下降,在这种情况下,没有内置的方法来自动重试。 如果ssh连接不能build立,这个主机会抛出一个致命错误,因为Ansible〜1.9。 没有办法赶上这种连接错误。 这并不影响其他主机,但他们都会玩的很好。

你可以重试。 失败的主机将被存储在<playbook-name>.retry本身旁边的<playbook-name>.retry文件中。 要仅重试失败的主机,您可以运行:

 ansible-playbook ... --limit @<playbook-name>.retry 

为了扩展Mike的答案,你可以同时和Salt一起推拉。 推动是一样容易的

 salt 'api*.domain.com` state.highstate 

同时,你的爪牙可以通过内置的调度程序每隔X分钟或几小时进行计划拉动。 我的首选方法是通过支柱来configuration它,但是将其添加到minionconfiguration也可以。 就像是:

 schedule: highstate: function: state.highstate maxrunning: 1 hours: 1 splay: 600