本文共 7339 字,大约阅读时间需要 24 分钟。
Puppet4的第一个正式版本于2015年4月15日发布截止到2016年12月28日Puppet已正式发布了4.8.1版本。Puppet4与3.x版本相比有两点不同:很多的变化,很大的变化。毫不夸张地说Puppet4是一个全新的项目!\
Puppet4使用函数式编程语言Clojure对Puppet Master进行了重写,Puppetlabs公司并为此新建了一个项目:puppetserver。此外,PuppetDB也使用Clojure进行了重写。如此脱胎换骨的变化,最主要的目的是为了提升性能,官方给出的数据是: 相比Puppet3,Puppet4有2~3倍的性能提升。\
这是一个非常吸引人的提升!要知道从Puppet2到Puppet3所带来约50%的性能提升,就让我们感动不已了!\
在以往的实际生产中,我们遇到过多次来自于master端的性能瓶颈,在一个数千台规模有近百个OpenStack集群的环境中,我们使用了多台物理+虚拟服务器来作为Puppetmaster节点,管理着大量的服务,一旦遇到高并发的编排任务时,master端的CPU几乎处于100%的状态,超时时间设置为120秒的情况下,仍然会出现不少由于编译catalog超时而导致agent报错的情况。即使我们通过改进代码,水平扩展,组件拆分,参数调优,更换硬件等多种组合办法,但是受Puppet3所使用的Ruby语言性能瓶颈,对于Puppetmaster的性能我们并不满意。而Puppet4从根本上改进了性能问题。PuppetDB也是另一个主要瓶颈,像resource export,virtualresource等高级特性,以及facts,catalog的缓存都会使用到PuppetDB,虽然这些高级特性很炫酷而且也很实用,但是非常非常消耗资源。这使得我们在过去非常地谨慎甚至刻意去削减Puppet高级特性的使用,这也是PuppetOpenstack社区禁止提交含有这些高级特性的代码的原因之一(另一个原因是有些高级特性无法在Standalone模式下使用)。\
此外,Puppet4一开始就拥有面向服务的架构:\
新的Parser支持lambdas和iteraion!再也不用使用tricky的creates_resources函数了:\
\全新的parser还直接支持数据类型检查,再也不用stdlib里的validate_string等函数了:\
\另外一个亮点是直接支持插值式函数调用:\
\支持链式赋值,代码可以变得更简洁了:\
\除了以上几点,还有其他诸多特性,不再一一举例。\
目前,puppet-agent仍然使用Ruby来维护。不过JVM可以支持Ruby的Java版本:JRuby。因此在未来,puppet-agent不排除可能会从JRuby过渡到Clojure。\
Puppet4既然做了重写,因此有大量与Puppet3不兼容的变化。这些细节对于Puppet3用户来说是最关心的地方。\
过去,我们需要在服务器上单独安装Puppet,Facter,Hiera,Mcollective等多个组件才能获得相应的功能和特性。在Puppet4中,安装Puppet不再需要安装多个软件包,而是采用AIO(All-in-One)的方式来简化软件包的管理,例如puppet-agent中包含以下组件:\
Puppetlabs将这种AIO的包管理方式称之为PuppetCollections(PC),每个PC其实对应着一个软件仓库(repo),为用户提供了Facter/Ruby/Puppet等组件的匹配矩阵。下表给出了PC中主要软件包中整合的组件。\
\要在服务器上启用新版本的Puppet4,只需要执行一行简单的命令:在基于RPM的系统下使用以下命令:\
(点击放大图像)
\ \\在基于Deb的系统下使用以下命令:\
(点击放大图像)
\ \\通过这种集中式的软件仓库管理方式,用户可以移除过去puppetlabs-release中的production,dependencies,devel等多个仓库。注意:puppet-agent不会自动升级旧版本的puppet软件包(建议使用deb或rpm来管理软件包的升级)\
3.2 配置文件和目录的路径变化\
过去多年的Config File Environment将被正式移除。默认的environmentpath是$codedir/environments。以新建一个production环境为例:\
由于使用了AIO的包管理方式,Puppet不再使用系统自带的Ruby解释器,将直接使用Ruby2.1.5版本。\
重点来了,Puppet4最重要的变化是重写了parser和evaluator,在Puppet3.x中可以通过在puppet配置文件中开启Future Parser来使用,在Puppet4中该parser已经成为”present parser“,那么过去的parser正式退出舞台。新parser包含了迭代,变量类型检查等诸多新特性。并且,新parser对于数值,空字符串和'udenf/nil'比较提供更好的检查机制。除了核心模块的变动以外,还有一些炫酷的特性:\
所有的项目在历史发展过程中,都会有很多的妥协和不良设计,Puppet项目从2到3很多旧有的特性只是被标记为废弃,并没有从代码库中移除,借助Puppet4版本的重构,大约60000行\"technicaldebt\"类型的代码被移除。 较为熟知的有以下:\
Puppet4中的另一个重要变化是master和agent通讯的URLs发生了变化。因此Puppet3的agent将无法和Puppet4的server端通信。例如:\
由于puppet doc命令依赖RDoc,而RDoc与最新版本的ruby不兼容,因此在Puppet4代码中被移除,如果要继续使用,可以通过puppetlabs-strings模块来提供类似的功能。同理,tagmail被移除,可以通过puppetlabs-tagmail模块来找到它。\
3.10 Resource Type/Providers的变化\
列举一个比较重要的变化:\
Rack和WEBrick Web服务器被废弃:Rack和WEBrick Web服务器过去常用于开发和简单验证,目前已在Puppet4.1中标记为弃用,计划在5.0中移除。\
Puppet4有多达200个配置参数,不过用户需要关心的参数大约为30个。这里我们只是简单介绍puppet.conf中的主要参数。\
基础参数\
运行相关\
服务相关\
多数参数对于单机模式运行的Puppet同样适用。在CS模式下,这些参数应该放置在[master]下;在单机模式下,这些参数应该放置在[main]下。\
主要参数\
Server其他配置\
pupept server除了puppet.conf之外,还有拥有其他的配置文件,其默认的配置文件路径是:/etc/puppetlabs/puppetserver/conf.d。这些配置文件使用HOCON格式,可以在保留JSON语义格式的前提下,提高可读性。在conf.d目录下包含以下配置文件:\
例如,常见的几个参数配置有以下:\
相比Puppet2到Puppet3的版本升级,Puppet4不仅是纯粹的新功能和性能提升,更像是对Puppet的全新重构,摒弃了过去留下来的历史负担和诟病。但是,Puppet4所带来的不兼容性,导致对于Puppet3用户,尤其是Puppet 3.3版本之前的用户,若想要把线上的业务代码升级到Puppet4,需要花费不少的精力。分享我们的升级经验:约在2016年初,云极星创将线上的Puppet版本从3.3升级到了3.7,并提前使用了future parser特性(Puppet4中的parser)。2016年9月,我们使用了半周时间完成了对Puppet4升级调研并给出调研报告,在Jira上列出计划和任务分工,实际使用了一周时间完成了96 Puppet Module代码更新和测试,并在生产环境上线。因此我们的建议是:即使Puppet4令人激动人心,但配置管理系统的升级一定要谨慎对待,提前做好计划和回滚方案,充分测试,分步骤操作。\
余兴超,云极星创联合创始人兼平台开发部总监,目前负责智能运维平台和安全。Puppet OpenStack项目Core reviewer,《深入理解OpenStack自动化部署》主要作者。从2011年至今一直坚守在云计算研发一线,是中国第一批云计算的落地工程师,曾参与OpenStack落地新浪云的全过程,并主导了国内众多OpenStack案例的落地和运维。\\\
感谢对本文的审校。
\\给InfoQ中文站投稿或者参与内容翻译工作,请邮件至。也欢迎大家通过新浪微博(,),微信(微信号:)关注我们。
转载地址:http://dtqax.baihongyu.com/