我正在尝试为 500-2000 个地理分布非常分散的主机选择一个配置管理系统。由于不同的网络可靠性,在任何给定时间,许多主机可能暂时不可用。出于这个原因,我最初的选择是 Chef,因为它使用“拉”模型,当主机上线并签入时,他们会立即获得当前配置。
但是,如果我的主机仅每 30 分钟轮询一次 Chef 服务器以获取新配置,那么快速部署是不可能的。另外,我不是Rubyist。我更喜欢使用基于推送的模型,在那里我可以尽快将配置推送到主机。所以,自然的选择似乎是 Ansible 或 SaltStack(可能是 SaltStack)。但我的问题是:Ansible 和 SaltStack 如何处理失败或宕机的主机?有什么方法可以一直重试推送,直到主机重新上线?是否存在使用这些工具正确处理主机最终一致性的模式?谢谢!
我只能为 Ansible 回答这个问题。
Ansible 本身不处理无法访问的主机。它将尝试连接一次,如果无法连接,则主机将退出当前播放。但是 Ansible 为您提供了一些工具来自己处理这个问题。
首先是wait_for模块。有了这个,您可以等待非常高的超时,直到主机可用。
但是,当您运行 play 时,仅此一项就会成为问题,因为 Ansible 默认情况下不会处理任何进一步的任务,直到所有主机都通过此任务。在这种情况下,这是适得其反的。根据您的描述,当最后一个主机最终可以访问时,第一台主机可能再次不可用。
要解决这个问题,您需要使用 Ansible 2,它有一个名为 strategy 的新功能。
strategy: free
允许您尽可能快地运行每个任务,这意味着它会在主机可用时立即运行所有任务。尽管如此,连接可能会断开,在这种情况下,没有内置的方法可以自动重试。如果无法建立 ssh 连接,则会为此主机抛出致命错误,并且自 Ansible ~1.9 起。没有办法捕捉到这种连接错误。不过,这不会影响其他主机,它们都可以正常播放。
不过你可以重试。失败的主机将存储在
<playbook-name>.retry
剧本本身旁边的文件中。要仅重试失败的主机,您可以运行:Salt在从节点到主节点的拉模型中运行。您可以从 master 发出全局命令,例如
这将在所有 id(hostname) 为 api*.domain.com 的主机上运行 highstate。高级状态就像一个完整的厨师运行。
通常默认情况下,人们要么让主调度 highstate 在 minions 上运行,要么他们自己在 minions 上运行调度,比如每 10 分钟运行一次 highstate。
因此,如果一个节点已关闭,并且您在主服务器上运行命令以运行状态,那么 salt 将在其运行输出中报告该节点已关闭,该输出可以以多种不同的方式格式化以供您摄取。例如,它甚至可以记录到 mysql。
因此,例如,如果您在主服务器上运行上述命令以在所有
api*.domain.com
节点上运行 highstate。如果 5000 中的 2 个当前正在重新启动,一旦salt-minion
重新联机,它们将通过消息总线从主设备获得偶数并运行高状态。Salt还有一个叫做代理节点的东西来帮助主节点的负载。你可以在某个地方有一个主节点,每个数据中心都有一个代理节点,从主节点发送的所有命令都通过代理节点,这些数据中心中的仆从命中他们的代理节点,而不是主节点
为了扩展 Mike 的答案,您可以使用 Salt 同时进行推拉。推很简单
同时,你的 minions 可以通过内置的scheduler 每 X 分钟或几小时进行一次定时拉取。我首选的方法是通过柱子配置它,但将它添加到 minion 配置也可以。就像是: