AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 759302
Accepted
Will
Will
Asked: 2016-02-24 13:16:19 +0800 CST2016-02-24 13:16:19 +0800 CST 2016-02-24 13:16:19 +0800 CST

使用 Ansible 或 Saltstack 自动重试配置推送?

  • 772

我正在尝试为 500-2000 个地理分布非常分散的主机选择一个配置管理系统。由于不同的网络可靠性,在任何给定时间,许多主机可能暂时不可用。出于这个原因,我最初的选择是 Chef,因为它使用“拉”模型,当主机上线并签入时,他们会立即获得当前配置。

但是,如果我的主机仅每 30 分钟轮询一次 Chef 服务器以获取新配置,那么快速部署是不可能的。另外,我不是Rubyist。我更喜欢使用基于推送的模型,在那里我可以尽快将配置推送到主机。所以,自然的选择似乎是 Ansible 或 SaltStack(可能是 SaltStack)。但我的问题是:Ansible 和 SaltStack 如何处理失败或宕机的主机?有什么方法可以一直重试推送,直到主机重新上线?是否存在使用这些工具正确处理主机最终一致性的模式?谢谢!

chef
  • 3 3 个回答
  • 655 Views

3 个回答

  • Voted
  1. udondan
    2016-02-24T19:42:26+08:002016-02-24T19:42:26+08:00

    我只能为 Ansible 回答这个问题。

    Ansible 本身不处理无法访问的主机。它将尝试连接一次,如果无法连接,则主机将退出当前播放。但是 Ansible 为您提供了一些工具来自己处理这个问题。

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

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

    但是,当您运行 play 时,仅此一项就会成为问题,因为 Ansible 默认情况下不会处理任何进一步的任务,直到所有主机都通过此任务。在这种情况下,这是适得其反的。根据您的描述,当最后一个主机最终可以访问时,第一台主机可能再次不可用。

    要解决这个问题,您需要使用 Ansible 2,它有一个名为 strategy 的新功能。strategy: free允许您尽可能快地运行每个任务,这意味着它会在主机可用时立即运行所有任务。

    尽管如此,连接可能会断开,在这种情况下,没有内置的方法可以自动重试。如果无法建立 ssh 连接,则会为此主机抛出致命错误,并且自 Ansible ~1.9 起。没有办法捕捉到这种连接错误。不过,这不会影响其他主机,它们都可以正常播放。

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

    ansible-playbook ... --limit @<playbook-name>.retry
    
    • 2
  2. Best Answer
    Mike
    2016-02-27T05:08:17+08:002016-02-27T05:08:17+08:00

    Salt在从节点到主节点的拉模型中运行。您可以从 master 发出全局命令,例如

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

    这将在所有 id(hostname) 为 api*.domain.com 的主机上运行 highstate。高级状态就像一个完整的厨师运行。

    通常默认情况下,人们要么让主调度 highstate 在 minions 上运行,要么他们自己在 minions 上运行调度,比如每 10 分钟运行一次 highstate。

    因此,如果一个节点已关闭,并且您在主服务器上运行命令以运行状态,那么 salt 将在其运行输出中报告该节点已关闭,该输出可以以多种不同的方式格式化以供您摄取。例如,它甚至可以记录到 mysql。

    因此,例如,如果您在主服务器上运行上述命令以在所有api*.domain.com节点上运行 highstate。如果 5000 中的 2 个当前正在重新启动,一旦salt-minion重新联机,它们将通过消息总线从主设备获得偶数并运行高状态。

    Salt还有一个叫做代理节点的东西来帮助主节点的负载。你可以在某个地方有一个主节点,每个数据中心都有一个代理节点,从主节点发送的所有命令都通过代理节点,这些数据中心中的仆从命中他们的代理节点,而不是主节点

    • 2
  3. savamane
    2016-03-17T09:28:44+08:002016-03-17T09:28:44+08:00

    为了扩展 Mike 的答案,您可以使用 Salt 同时进行推拉。推很简单

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

    同时,你的 minions 可以通过内置的scheduler 每 X 分钟或几小时进行一次定时拉取。我首选的方法是通过柱子配置它,但将它添加到 minion 配置也可以。就像是:

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

相关问题

  • 如何开始使用 Chef?

  • 调用 chef-solo 的惯用方式?

  • centos 5.3上的厨师错误

  • 哪种方式是使用 Chef 安装软件包的最“优雅”方式?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve