我puppet parser validate
在 git pre-commit
hook 中使用,以便在将文件提交到我们的 Puppet 配置存储库之前发现问题。不幸的是,这个命令似乎是一个非常轻量级的语法检查,它只标记错误,例如不平衡的引号和括号。
该validate
命令似乎并未实际解析配置并查找无效属性、未定义引用等内容。例如,以下情况不会导致投诉:
file { 'somefile': requires => File['some-other-file'] }
Run Code Online (Sandbox Code Playgroud)
在这个例子中,requires
应该是require
. 同样,这也不会产生错误:
file {'somefile': require => File['file-that-does-not-exist']}
Run Code Online (Sandbox Code Playgroud)
没有资源定义file-that-does-not-exist
。
有没有办法在不实际应用配置的情况下捕获这些类型的错误?我希望puppet apply
命令上有某种标志,可以在不进行更改的情况下完全解析配置,但据我所知,Puppet 2.7.1 中不存在这样的选项。
更新
puppet apply --noop
似乎在另一个方向上太努力了。它将尝试stat()
在清单中引用的任何文件,如果它尝试stat()
当前用户无法访问的文件,这通常会导致它失败并出现权限错误。
其他人在做什么?
简而言之,这是一个不平凡的问题,不能通过解析清单轻易解决。编制目录可以扩大测试范围,但并不是万能的。puppet master --compile 需要访问节点事实,最好是完全测试所有类的虚拟节点。您仍然需要应对以下限制:
例如,如果节点一包含 a 和 b,那没问题,但节点二只需要 b,这只是节点二出现的故障。
class a {
notify { 'hi': }
}
class b {
notify { 'bye':
require => Notify['hi'],
}
}
Run Code Online (Sandbox Code Playgroud)
如果您有资源,您可以为所有节点编译目录,这将提供相当全面的覆盖范围。
puppet apply --noop 也有它的局限性,超出了我的想象:它会使包部署的 exec 失败,它会使文件失败,具体取决于暂存位置,并且除非您扩展,否则它不会测试多个平台对系统的代表性样本进行测试。一般来说,它提供了足够的覆盖范围以确保没有编译问题,让您了解哪些系统受到影响,发生了哪些变化,并且您可以通过报告判断这些变化是正常的还是真正的问题。
在大多数情况下,noop 就足够了,我见过不同程度的自动化测试,例如 jenkins,其中每个模块测试文件都使用 --noop 进行模拟(适用上述限制),或者使用 Vagrant 生成虚拟机来执行全面的测试。