使用“puppet parser validate”验证 Puppet 清单的问题

lar*_*sks 5 git puppet

puppet parser validate在 git pre-commithook 中使用,以便在将文件提交到我们的 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()当前用户无法访问的文件,这通常会导致它失败并出现权限错误。

其他人在做什么?

Nan*_*Liu 1

简而言之,这是一个不平凡的问题,不能通过解析清单轻易解决。编制目录可以扩大测试范围,但并不是万能的。puppet master --compile 需要访问节点事实,最好是完全测试所有类的虚拟节点。您仍然需要应对以下限制:

  • 不能位于同一目录中的类(apache、apache::disable)
  • 跨类依赖。
  • 不同的操作系统平台。
  • 具有不同参数的节点。

例如,如果节点一包含 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 生成虚拟机来执行全面的测试。