我使用puppet parser validate在git pre-commit hook中puppet parser validate ,以便在将文件提交到我们的Puppetconfiguration存储库之前发现问题。 不幸的是,这个命令似乎是一个非常轻量级的语法检查,只能标记错误,如不平衡的引号和括号。
validate命令似乎没有真正parsingconfiguration,并寻找像无效的属性,未定义的引用,等等。 例如,以下内容不会导致投诉:
file { 'somefile': requires => File['some-other-file'] }
在这个例子中, requires应该是require 。 同样,这也不会产生错误:
file {'somefile': require => File['file-that-does-not-exist']}
没有file-that-does-not-exist资源定义file-that-does-not-exist 。
有没有什么办法来捕捉这些types的错误,而不实际应用configuration? 我希望puppet apply命令中的某种标志可以完全parsing一个configuration而不做任何修改,但是据我所知,在Puppet 2.7.1中不存在这样的选项。
UPDATE
puppet apply --noop似乎太努力在另一个方向。 它将尝试stat()清单中引用的任何文件,如果它尝试stat()当前用户无法访问的文件,通常会导致它失败并出现许可错误。
其他人在做什么?
简而言之,这是一个不重要的问题,通过parsing清单不容易解决。 编译目录可以扩大testing范围,但这不是万能的。 木偶大师 – 编译需要访问节点的事实,理想的虚拟节点,全面testing所有类。 您仍然必须处理以下限制:
例如,如果节点1包含a和b,那么很好,但是节点2只需要b,这只是在节点2中看到的一个失败。
class a { notify { 'hi': } } class b { notify { 'bye': require => Notify['hi'], } }
如果您有资源,则可以编译所有节点的目录,并提供相当全面的覆盖率。
puppet apply –noop也有其局限性,而且还有一个局限性:它会使包中部署的exec失败,取决于暂存位置会导致文件失败,除非扩展,否则不会testing多个平台testing一个有代表性的系统样本。 一般来说,它提供了足够的覆盖范围,以确保没有编译问题,让你知道什么系统受到影响,有什么变化,你可以通过报告判断这些变化是好的还是真正的问题。
在大多数情况下,noop就足够了,我已经看到了不同程度的自动化testing,比如jenkins,其中每个模块testing文件都使用–noop(上面的限制适用)来模拟,或者使用Vagrant产生虚拟机来执行全面的testing。
你可能想考虑引导一个testing环境,比如黄瓜木偶。
为了更多地validation资源和属性是否合理,可以使用puppet master --compile编译一个样本节点目录。 这应该抓住第一个例子。
我不确定资源引用(第二个示例)是否在主服务器或客户端上得到validation,但是您可以始终以puppet catalog apply或puppet apply非操作模式执行它。 后者将再次编译并应用它,而前者应该能够从早期的validation中获取已编译的目录。