像Puppet和Chef这样的更为成熟的configurationpipe理(CM)系统使用基于拉式的方法:客户端定期轮询中央主站以获取更新。 他们中的一些人也提供了一种无主的方法(所以基于推送),但是声明它不是“生产”(Saltstack)或“不可扩展”(Puppet)。 我知道的唯一一个系统就是从一开始就是基于推动力的是Ansible。
拉式系统的具体可扩展性优势是什么? 为什么添加更多的推拉大师比push-agent更容易?
例如, agiletesting.blogspot.nl写道:
在“拉”系统中,客户彼此独立地联系服务器,所以整个系统比“推”系统更具可扩展性
另一方面,Rackspace展示了他们可以使用基于推送的模型处理15K系统 。
infastructures.org写道:
我们发誓维护基础设施,使用像SUP,CVSup,rsync服务器,或cfengine的工具拉方法。 每台客户端机器不需要将更改推送给客户端,而是需要负责在启动时对黄金服务器进行轮询,然后定期维护自己的rev级别。 在采用这个观点之前,我们开发了基于ssh,rsh,rcp和rdist的广泛的基于推送的脚本。 我们在r命令(或者ssh)中发现的问题是:当你运行一个基于r命令的脚本把一个变化推送到你的目标机器上时,可能性是,如果你有超过30个目标主机,在任何时候都会下降。 维护委托机器的列表成为一场噩梦。 在编写代码来纠正这个问题的过程中,你将最终得到精心devise的包装代码来处理:来自死亡主机的超时; logging和重试死的主机; 分叉并行,尝试在合理的时间内击中多个主机; 最后检测并阻止源机器上所有可用的TCP套接字与所有出站rsh会话的使用情况。 然后,你仍然有问题,就是为将来要安装的所有新主机安装映像,以及为明天将要重build的任何主机重复安装映像。 在经历了基于r-command复制的麻烦之后,我们发现它不值得。 我们不打算再次使用r-命令来pipe理基础架构,或者使用任何其他推送机制来pipe理基础架构。 它们不像基于拉的方法那样成比例。
这不是一个实现问题,而不是一个build筑问题? 为什么编写一个线程化的推式客户端比一个线程化的拉式服务器更难呢?
基于推送的系统的问题是你必须在中央推送节点上有一个完整的体系结构模型。 你不能推到你不知道的机器上。
它显然可以工作,但需要很多工作才能保持同步。
使用Mcollective之类的东西,可以将Puppet和其他CM转换为基于推送的系统。 一般来说,将拉式系统转换为基于推式系统是微不足道的,但并不总是那么简单。
还有组织政治问题。 基于推送的系统将中央pipe理员的所有控制手放在一起。 以这种方式pipe理复杂性可能非常困难。 我认为扩展问题是一个红鲱鱼,如果你只是看客户的数量,任何一种方法的规模。 在很多方面推动更容易扩展。 但是,dynamicconfiguration或多或less暗示您至less有一个拉客户端注册版本。
最终,它关乎哪个系统与组织中的工作stream程和所有权相匹配。 一般来说,拉动系统更加灵活。
如果任何人都感兴趣的话,我想至less我可以给一个用户体验报告,在关键任务系统的多主机设置的补丁pipe理的情况下,首次使用了Ansible的开箱即用function在亚马逊云。 为了理解我的偏见或偏见,我应该解释一下,我在自动化脚本级别上对Ruby有所偏好,并且已经build立了项目,以便在过去使用master-agent puppet configuration per-project-Vpc。 所以,如果有的话,我的经验就会掩盖偏见。
我最近的经验非常有利于dynamic推动从数十台到数百台服务器的不断变化的产业,这些服务器可以放大或缩小,终止和刷新。 在我的情况下,一个简单的Ansible 1.7 ad hoc命令是我需要做的补丁。 但是考虑到为每个Vpc设置一个AnsibleController(在t2.micro上)的有效性,今后我打算将这个技术扩展到更复杂的需求。
所以让我回到在这个线索中提出的问题:在dynamic变化的房地产中推动的利弊。
我所针对的那种服务器产品的假设是:
考虑到这些条件,创build一个AnsibleController的机器镜像以放入多个Vpcs并在现有服务器帐户内就地configuration(凭证)是非常简单的。 自动从图像创build的每个实例中
如果需要,可以使第二个项目变得相对复杂(通过Ansible清单的Info结构)。 但是,如果不需要复杂性,这里是一个非常简单的脚本示例,用于在每个计时间隔内计算所有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
唯一需要注意的是patch命令应该是幂等的。 作为确保补丁完全符合预期的一部分,预先testing以确保满足这一点是可取的。
总而言之,我已经说明了一个用例,其中dynamic推送对我设定的目标是有效的。 这是一个可重复的解决scheme(被封装在可以在多个账户和地区推出的图像中)。 根据我的经验,dynamic推送技术比现在提供给我们的工具集更容易提供和实施。