Wil*_*lem 22 configuration-management puppet chef ansible saltstack
更成熟的配置管理 (CM) 系统(如 Puppet 和 Chef)使用基于拉取的方法:客户端定期轮询集中主节点以获取更新。其中一些也提供了一种无主方法(因此,基于推送),但声明它“不适用于生产”(Saltstack)或“可扩展性较差”(Puppet)。我所知道的唯一一个从一开始就基于推送的系统是亚军 Ansible。
基于拉的系统的具体可扩展性优势是什么?为什么据说添加更多 pull-masters 比 push-agents 更容易?
例如,agiletesting.blogspot.nl写道:
在“拉”系统中,客户端相互独立地联系服务器,因此整个系统比“推”系统更具可扩展性
另一方面,Rackspace 证明他们可以使用基于推送的模型处理 15K 系统。
我们发誓使用拉式方法来维护基础架构,使用 SUP、CVSup、rsync 服务器或 cfengine 等工具。不是将更改推送给客户端,每个单独的客户端计算机都需要负责在启动时轮询黄金服务器,并在之后定期轮询,以保持自己的 rev 级别。在采用这个观点之前,我们开发了大量基于 ssh、rsh、rcp 和 rdist 的基于推送的脚本。我们在 r-commands(或 ssh)中发现的问题是:当您运行基于 r-command 的脚本将更改推送到您的目标机器时,很可能如果您有 30 多个目标主机,其中一个将在任何给定的时间下来。维护委托机器的列表变成了一场噩梦。在编写代码来纠正这个问题的过程中,你最终会得到精心设计的包装器代码来处理:死主机超时;记录和重试死主机;分叉并运行并行作业以尝试在合理的时间内访问许多主机;最后检测并防止在所有出站 rsh 会话中耗尽源计算机上所有可用 TCP 套接字的情况。然后,您仍然面临着将您刚才所做的所有内容放入安装映像中的问题,以便将来安装所有新主机,以及为任何已死且明天必须重建的主机重复此操作。在我们为实现基于 r-command 的复制而遇到的麻烦之后,我们发现它只是不值得。我们不打算再次使用 r-commands 或任何其他推送机制来管理基础设施。它们的扩展性不如基于拉动的方法。分叉并运行并行作业以尝试在合理的时间内访问许多主机;最后检测并防止在所有出站 rsh 会话中耗尽源计算机上所有可用 TCP 套接字的情况。然后,您仍然面临着将您刚才所做的所有内容放入安装映像中的问题,以便将来安装所有新主机,以及为任何已死且明天必须重建的主机重复此操作。在我们实现基于 r-command 的复制遇到麻烦之后,我们发现它不值得。我们不打算再次使用 r-commands 或任何其他推送机制来管理基础设施。它们的扩展性不如基于拉动的方法。分叉并运行并行作业以尝试在合理的时间内访问许多主机;最后检测并防止在所有出站 rsh 会话中耗尽源计算机上所有可用 TCP 套接字的情况。然后,您仍然面临着将您刚才所做的所有内容放入安装映像中的问题,以便将来安装所有新主机,以及为任何已死且明天必须重建的主机重复此操作。在我们为实现基于 r-command 的复制而遇到的麻烦之后,我们发现它只是不值得。我们不打算再次使用 r-commands 或任何其他推送机制来管理基础设施。它们的扩展性不如基于拉动的方法。最后检测并防止在所有出站 rsh 会话中耗尽源计算机上所有可用 TCP 套接字的情况。然后,您仍然面临着将您刚才所做的所有内容放入安装映像中的问题,以便将来安装所有新主机,以及为任何已死且明天必须重建的主机重复此操作。在我们实现基于 r-command 的复制遇到麻烦之后,我们发现它不值得。我们不打算再次使用 r-commands 或任何其他推送机制来管理基础设施。它们的扩展性不如基于拉动的方法。最后检测并防止在所有出站 rsh 会话中耗尽源计算机上所有可用 TCP 套接字的情况。然后,您仍然面临着将您刚才所做的所有内容放入安装映像中的问题,以便将来安装所有新主机,以及为任何已死且明天必须重建的主机重复此操作。在我们实现基于 r-command 的复制遇到麻烦之后,我们发现它不值得。我们不打算再次使用 r-commands 或任何其他推送机制来管理基础设施。它们的扩展性不如基于拉动的方法。然后,您仍然面临着将您刚才所做的所有内容放入安装映像中的问题,以便将来安装所有新主机,以及为任何已死且明天必须重建的主机重复此操作。在我们实现基于 r-command 的复制遇到麻烦之后,我们发现它不值得。我们不打算再次使用 r-commands 或任何其他推送机制来管理基础设施。它们的扩展性不如基于拉动的方法。然后,您仍然面临着将您刚才所做的所有内容放入安装映像中的问题,以便将来安装所有新主机,以及为任何已死且明天必须重建的主机重复此操作。在我们实现基于 r-command 的复制遇到麻烦之后,我们发现它不值得。我们不打算再次使用 r-commands 或任何其他推送机制来管理基础设施。它们的扩展性不如基于拉动的方法。或与任何其他推动机制有关。它们的扩展性不如基于拉动的方法。或与任何其他推动机制有关。它们的扩展性不如基于拉动的方法。
这不是一个实现问题而不是一个架构问题吗?为什么编写线程推送客户端比编写线程拉取服务器更难?
joh*_*hnz 12
如果有人感兴趣,我想至少我可以提供一份用户体验报告,在任务关键型系统的多主机设置的补丁管理环境中首次使用 Ansible 的开箱即用推送功能在亚马逊云中。为了理解我的先入之见或偏见,我应该解释一下,我在自动化脚本级别更喜欢 Ruby,并且过去曾设置项目以使用每个项目 Vpc 的主代理 puppet 配置。所以我的经历掩盖了过去的偏见,如果有的话。
我最近的经验非常有利于动态推动从数十到数百台服务器的不断变化,这些服务器可以扩展或缩减、终止和刷新。在我的情况下,我只需要一个简单的 Ansible 1.7 ad hoc 命令来制作补丁。但是,鉴于为此目的为每个 Vpc 设置 AnsibleController(在 t2.micro 上)的有效性,将来我打算扩展该技术以满足更复杂的需求。
所以让我回到这个线程中提出的问题:在动态变化的资产中推送的利弊。
我针对的服务器资产类型的假设是:
考虑到这些条件,创建 AnsibleController 的机器映像以放入多个 Vpc 并在现有服务器帐户中原位配置(使用凭据)非常简单。在从图像创建的每个实例中自动化是
如果需要,第二项可以做得相对复杂(通过 Ansible 清单的 Info 结构)。但如果不需要复杂性,这里有一个非常简单的脚本示例,用于在每个 cron 时间间隔计算所有 Amazon EC2 实例并将结果定向到适当的清单文件(例如 /etc/ansible/hosts)......
#!/bin/bash
# Assumes aws-cli/1.3.4 Python/2.6.9 Linux/3.4.73-64.112.amzn1.x86_64 or greater
# http://aws.amazon.com/releasenotes/8906204440930658
# To check yum list aws-cli
# Assumes that server is equipped with AWS keys and is able to access some or all
# instances in the account within it is running.
# Provide a list of host IPs each on a separate line
# If an argument is passed then treat it as the filename, whether local or absolute
# path, to which the list is written
function list-of-ips {
/usr/bin/aws ec2 describe-instances --filters '[ {"Name": "instance-state-code", "Values": [ "16" ] } ]' | grep -w PrivateIpAddress | awk '{x=$2; gsub("\"","", x); gsub(",","", x); if(x && FNR!=1){print x;}}' | uniq
}
if [ -n "$1" ]; then
list-of-ips > "$1"
else
list-of-ips
fi
Run Code Online (Sandbox Code Playgroud)
该用例的唯一警告是 patch 命令应该是幂等的。作为确保补丁完全符合预期的一部分,最好进行预测试以确保完全满足这一要求。
总而言之,我举例说明了动态推送对我设定的目标有效的用例。它是一个可重复的解决方案(从封装在可以在多个帐户和区域中推出的图像的意义上说)。根据我迄今为止的经验,动态推送技术比我们目前可用的工具集中提供的替代方案更容易提供 --- 并付诸实施。
基于推送的系统的问题在于,您必须在中央推送节点上拥有整个架构的完整模型。您无法推送到您不了解的机器。
它显然可以工作,但需要大量工作才能保持同步。
使用 Mcollective 之类的东西,您可以将 Puppet 和其他 CM 转换为基于推送的系统。通常,将拉式系统转换为基于推式的系统是微不足道的,但采用另一种方式并不总是那么简单。
还有组织政治的问题。基于推送的系统将中央管理员的所有控制手都放在了手上。以这种方式管理复杂性可能非常困难。我认为扩展问题是一个红鲱鱼,如果你只看客户数量,任何一种方法都会扩展。在许多方面,推送更容易扩展。但是,动态配置或多或少意味着您至少有一个客户端注册的拉取版本。
归根结底,关键在于哪个系统与您组织中的工作流程和所有权相匹配。一般来说,拉动系统更灵活。
| 归档时间: |
|
| 查看次数: |
19153 次 |
| 最近记录: |