更成熟的配置管理 (CM) 系统(如 Puppet 和 Chef)使用基于拉取的方法:客户端定期轮询集中式 master 以获取更新。其中一些也提供无主方法(因此,基于推送),但声明它“不适用于生产”(Saltstack)或“可扩展性较差”(Puppet)。我所知道的唯一从一开始就基于推送的系统是亚军 Ansible。
基于拉的系统的特定可扩展性优势是什么?为什么据说添加更多的 pull-masters 比 push-agents 更容易?
例如,agiletesting.blogspot.nl写道:
在“拉”系统中,客户端彼此独立地联系服务器,因此整个系统比“推”系统更具可扩展性
另一方面,Rackspace 证明他们可以使用基于推送的模型处理 15K 系统。
我们发誓使用诸如 SUP、CVSup、rsync 服务器或 cfengine 之类的工具来维护基础设施的拉式方法。与其将更改推送给客户端,每个单独的客户端计算机需要负责在启动时轮询黄金服务器,并在之后定期轮询,以保持其自己的转速水平。在采用这种观点之前,我们开发了基于 ssh、rsh、rcp 和 rdist 的大量基于推送的脚本。我们在 r-commands(或 ssh)中发现的问题是:当您运行基于 r-command 的脚本将更改推送到目标机器时,如果您有超过 30 个目标主机,其中一个可能会在任何给定的时间下来。维护委托机器的列表成为一场噩梦。在编写代码来纠正这个问题的过程中,您最终会得到精心制作的包装代码来处理:死主机超时;记录和重试死主机;分叉和运行并行作业以尝试在合理的时间内访问许多主机;最后检测并防止使用所有出站 rsh 会话的源计算机上所有可用 TCP 套接字的情况。然后,您仍然会遇到问题,即要将您刚才所做的任何事情放入安装映像中,以便将来安装所有新主机,以及对任何死机且明天必须重建的主机重复此操作。在我们经历了实现基于 r-command 的复制的麻烦之后,我们发现它只是不值得。我们不打算再次使用 r 命令或任何其他推送机制来管理基础设施。它们的扩展性不如基于拉的方法。分叉和运行并行作业以尝试在合理的时间内访问许多主机;最后检测并防止使用所有出站 rsh 会话的源计算机上所有可用 TCP 套接字的情况。然后,您仍然会遇到问题,即要将您刚才所做的任何事情放入安装映像中,以便将来安装所有新主机,以及对任何死机且明天必须重建的主机重复此操作。在我们经历了实现基于 r-command 的复制的麻烦之后,我们发现它只是不值得。我们不打算再次使用 r 命令或任何其他推送机制来管理基础设施。它们的扩展性不如基于拉的方法。分叉和运行并行作业以尝试在合理的时间内访问许多主机;最后检测并防止使用所有出站 rsh 会话的源计算机上所有可用 TCP 套接字的情况。然后,您仍然会遇到问题,即要将您刚才所做的任何事情放入安装映像中,以便将来安装所有新主机,以及对任何死机且明天必须重建的主机重复此操作。在我们经历了实现基于 r-command 的复制的麻烦之后,我们发现它只是不值得。我们不打算再次使用 r 命令或任何其他推送机制来管理基础设施。它们的扩展性不如基于拉的方法。最后检测并防止使用所有出站 rsh 会话的源计算机上所有可用 TCP 套接字的情况。然后,您仍然会遇到问题,即要将您刚才所做的任何事情放入安装映像中,以便将来安装所有新主机,以及对任何死机且明天必须重建的主机重复此操作。在我们经历了实现基于 r-command 的复制的麻烦之后,我们发现它只是不值得。我们不打算再次使用 r 命令或任何其他推送机制来管理基础设施。它们的扩展性不如基于拉的方法。最后检测并防止使用所有出站 rsh 会话的源计算机上所有可用 TCP 套接字的情况。然后,您仍然会遇到问题,即要将您刚才所做的任何事情放入安装映像中,以便将来安装所有新主机,以及对任何死机且明天必须重建的主机重复此操作。在我们经历了实现基于 r-command 的复制的麻烦之后,我们发现它只是不值得。我们不打算再次使用 r 命令或任何其他推送机制来管理基础设施。它们的扩展性不如基于拉的方法。然后,您仍然会遇到问题,将您刚才所做的任何事情都放入安装映像中,以便将来安装所有新主机,以及对任何死机且明天必须重建的主机重复此操作。在我们经历了实现基于 r-command 的复制的麻烦之后,我们发现它只是不值得。我们不打算再次使用 r 命令或任何其他推送机制来管理基础设施。它们的扩展性不如基于拉的方法。然后,您仍然会遇到问题,即要将您刚才所做的任何事情放入安装映像中,以便将来安装所有新主机,以及对任何死机且明天必须重建的主机重复此操作。在我们经历了实现基于 r-command 的复制的麻烦之后,我们发现它只是不值得。我们不打算再次使用 r 命令或任何其他推送机制来管理基础设施。它们的扩展性不如基于拉的方法。或与此相关的任何其他推送机制。它们的扩展性不如基于拉的方法。或与此相关的任何其他推送机制。它们的扩展性不如基于拉的方法。
这不是实现问题而不是架构问题吗?为什么编写线程推送客户端比编写线程拉服务器更难?
如果有人对此感兴趣,我想我至少可以提供一份用户体验报告,因为我在关键任务系统的多主机设置的补丁管理上下文中首次使用了 Ansible 的开箱即用推送功能在亚马逊云中。为了理解我的先入之见或偏见,我应该解释说我在自动化脚本级别偏爱 Ruby,并且过去曾设置项目以使用每个项目 Vpc 的主代理 puppet 配置。所以我的经验掩盖了过去的偏见,如果有的话。
我最近的经验非常有利于动态推送从几十台到数百台服务器的不断变化的资产,这些服务器可以扩展或缩减、终止和刷新。在我的情况下,我只需要一个简单的 Ansible 1.7 ad hoc 命令来制作补丁。然而,鉴于为此目的在每个 Vpc 上设置 AnsibleController(在 t2.micro 上)的有效性,未来我打算扩展该技术以满足更复杂的需求。
所以让我回到这个线程中提出的问题:在动态变化的房地产中推动的利弊。
我针对的服务器资产类型的假设是:
考虑到这些条件,创建 AnsibleController 的机器映像以放入众多 Vpc 并在现有服务器帐户中就地配置(使用凭据)非常简单。在从图像创建的每个实例中自动化是
如果需要,可以使第二项相对复杂(通过 Ansible 清单的 Info 结构)。但是,如果不需要复杂性,这里有一个非常简单的脚本示例,用于在每个 cron 时间间隔计算所有 Amazon EC2 实例并将结果定向到适当的清单文件(例如 /etc/ansible/hosts)……
该用例的唯一警告是补丁命令应该是幂等的。作为确保补丁完全符合预期的一部分,最好进行预测试以完全确保满足此要求。
总而言之,我已经说明了一个用例,其中动态推送对我设定的目标有效。它是一个可重复的解决方案(在被封装在可以在多个帐户和区域中推出的图像中)。根据我迄今为止的经验,动态推送技术比我们目前可用的工具集中的替代方案更容易提供——并付诸实施。
基于推送的系统的问题在于,您必须在中央推送节点上拥有整个架构的完整模型。你不能推送到你不知道的机器上。
它显然可以工作,但要保持同步需要做很多工作。
使用 Mcollective 之类的东西,您可以将 Puppet 和其他 CM 转换为基于推送的系统。通常,将拉系统转换为基于推的系统是微不足道的,但采用另一种方式并不总是那么简单。
还有组织政治的问题。基于推送的系统将所有控制手放在中央管理员手中。以这种方式管理复杂性可能非常困难。我认为扩展问题是一个红鲱鱼,如果你只看客户的数量,任何一种方法都会扩展。在许多方面,推送更容易扩展。但是,动态配置或多或少意味着您至少有一个客户端注册的拉取版本。
最终,它是关于哪个系统与您组织中的工作流程和所有权相匹配。作为一般规则,拉动系统更灵活。
这是一篇旧文章,但有趣的是,历史会重演。
现在嵌入式物联网设备需要配置管理,而基础设施/网络拓扑结构似乎更加复杂,同时包含防火墙、NAT 甚至移动网络。
基于推或拉的决定同样重要,但设备的数量甚至更高。当我们开发我们的物联网嵌入式设备配置管理工具qbee.io我们选择了一种基于拉动的方法,其代理的基础是承诺理论。这意味着代理会拉取配置并自动收敛到所需的状态。优点是即使主服务器宕机也能主动维护配置,系统不需要跟踪哪个设备收到了哪些配置更改。此外,通常很难知道设备的本地网络状况如何。因此,在设备 ping 服务器之前,我们并不关心。在嵌入式用例的情况下,基于拉的解决方案的另一个示例和论据是这些设备的长生命周期。如果设备发生故障并被备用设备(例如石油钻井平台上)替换,该设备将立即接收其特定组的配置并收敛于该配置。
关注这些讨论多年来如何继续进行将会很有趣。此外,使用容器和一次性基础设施作为系统的替代品,可以在较长时间内保持配置。