- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
卷2:第18章 Puppet part 2
卷2 :第18章 Puppet part 2
18.3. 组件分析
Agent (代理)
在 Puppet 运⾏过程之中,第⼀个提到的组件就是 agent 进程。历史上,这是⼀个独
⽴的称为puppedd 的可执⾏程序, 在 2.6 中,我们把 Puppet 变成了⼀个唯⼀的可
执⾏程序,现在,可以使⽤ puppet agent 来调⽤它,和 Git 的使⽤⽅式很类似。
这个代理本⾝的功能不多,主要是⽤于实现上⾯图中客户端的⼯作流的配置和代码。
Facter
在 agent 之后的下⼀个组件是⼀个称为 Facter 的外部⼯具,这是⼀个⽤于检测本机信
息的⾮常简单的⼯具。这些信息包括操作系统、IP 地址、主机名等, Facter ⾮常易
于扩展,很多机构在使⽤中会增加它们⾃⼰的插件来检测⼀些个性化信息。Facter 发
现的信息会由 agent 发送给服务器,之后,服务器就接过了接⼒棒,继续⼯作流。
外部节点分类器
在服务端,第⼀个遇到的组件称为外部节点分类器 (External Node Classifier ),简称
为 ENC 。ENC 接受主机名作为输⼊,返回⼀个包含对应主机的⾼级配置信息的数据
结构。ENC 通常是⼀个独⽴的服务或程序:可能是⼀个其他的开源项⽬,⽐如 Puppet
Dashboard 或 Foreman ,或者是继承的已有的数据存储,⽐如 DAP 。ENC 的⽬的
是,确定⼀台主机从功能上属于那些类,以及需要⽤哪些参数来配置这些类。⽐如,
⼀个给定的主机可能属于 debian 和 webserver 类,datacenter 参数应该设置
为 atlanta。
注意,在 Puppet 2.7 中,ENC 不是⼀个必选组件,⽤户可以在 Puppet 代码中直接指定
节点的配置。⼤约在 Puppet 项⽬开始两年之后,ENC 才被添加进来,因为我们开始
意识到,对节点的功能进⾏划分和配置节点从本质上说是不同的两件事,将它们划分
到两个不同的程序中可能⽐扩展语⾔来⽀持两种功能要更合理。尽管不是必须,
ENC 仍然是推荐配置,并且将来某天可能会成为必选组件 (到那时,Puppet 会提供⼀
个拥有⾜够必备功能的 ENC ,不必担⼼)。
⼀旦服务器收到 ENC 的分类信息,或是来⾃ Facter (经过 agent )的系统信息后,它
会将所有信息绑定到⼀个节点对象上,并将它送⼊编译器。
编译器 (Compiler )
如前所述,Puppet 有⼀个⾃定义的语⾔,⽤于指定系统配置。它的编译起实际上有三
个部分:⼀个 Yacc 风格的分析器⽣成器和⼀个定制的词法分析器;⼀组⽤于创建我
们的抽象语法树 (AST )的类;以及 Compiler 类,它⽤于处理所有这些类,以及实现
编译器作为系统的⼀部分所提供的API的函数之间的交互。
编译器要处理的最复杂的事情是,⼤部分 Puppet 配置代码是在第⼀次被引⽤时才延迟
加载的 (减少加载时间,同时避免缺少⼀些实际不必要的依赖资源时产⽣的⽆关⽇
志),这意味着不会有显式的调⽤来加载并分析代码。
Puppet 的解析器使⽤了⼀个使⽤开源的 Racc 构建的正常的 Yacc 风格的解析器⽣成
器。可不幸的是,在 Puppet 项⽬开始时,没有可⽤的词法分析器⽣成器,所以只好使
⽤了⼀个定制的词法分析器。
因为我们在 Puppet 中使⽤了 AST ,所以 Puppet 语法中的每个语句都可以被求值为
Puppet AST 类的⼀个实例 (Puppet::Parser::AST ::Statement),这些 AST
实例不会被直接执⾏操作,⽽会被放⼊⼀个语法树之中,被⼀起执⾏。当⼀个服务器
为很多不同节点服务时,使⽤ AST 会带来⼀些性能上的收益,因为这样可以⼀次解
析,多次编译。同时这也给了我们⼀个机会,来对 AST 进⾏⼀些内省
(introspection ),让我们得到⼀些额外的信息和能⼒,如果直接解析执⾏是⽆法得到
这些的。
在 Puppet 项⽬开始时,可参考的 AST 的例⼦并不多,这部分已经经过了很多的演
化,发展到现在,我们的形式看起来是⽐较独⼀⽆⼆的。我们不会直接针对整个配置
⽣成⼀个单独的AST ,相反,我们创建很多⼩的 AST ,按照名字切开。⽐如,如下代
码:
class ssh {
package { ssh: ensure = present }
}
会创建⼀个新的 AST ,包含⼀个 Puppet::Parser::AST :
文档评论(0)