Puppet,使用 beaker-rspec 在 control-repo 中测试角色

Puppet,使用 beaker-rspec 在 control-repo 中测试角色

我想使用 rspec-puppet 和 beaker-rspec 测试我的控制存储库(其中包含配置文件和角色)。我在使用 beaker-rspec 时仍然遇到一些问题:

  • 例如,我想单独测试配置文件,profile::postgresql查看数据库是否已安装。
  • 然后我还想单独测试我的角色,例如role::fileserverrole::webserver

我已经设置了 beaker-rspec,它可以工作,但它需要相当长的时间,因为它会一个接一个地应用所有配置文件。我发现了以下问题:

  • 如果将过多的配置文件应用于 Vagrant VM,它将受到污染(另一次运行留下的包、文件等,因此测试不再具有代表性)
  • 一些配置文件没有任何共同之处,甚至可能与它们相矛盾(例如 nginx 与 apache;它们永远不会扮演同一个角色,但都在 control-repo 中定义)。

我更愿意做的是:

  • beaker-rspec 应该检查哪个角色已经定义,然后启动一个个人每个角色的虚拟机。
  • 这些应该连续进行,或者(更好)并行进行。
  • 我怎样才能减少每次运行的时间,特别是如果有一个相当大的 Puppet 设置,具有多个角色和不同的操作系统版本等。也许选择测试类型(“仅角色测试”或“仅配置文件测试”)。

如果 beaker-rspec 在新的 VM 中测试每个配置文件,那也是可以的(但我想切换测试以用于其他用途)。

我该如何实现这个?谢谢 :)

答案1

这里有几个不同的回应:

beaker-rspec 应检查已定义的角色,然后为每个角色启动单独的虚拟机。这些操作应以串行方式或(最好)并行方式进行。

Beaker-rspec 无法为每个测试套件使用全新的 SUT(被测系统)。目前,唯一的方法是为每个测试创建一个新的 _spec.rb 文件,然后在新的进程中运行每个测试,例如:bundle exec rspec spec/acceptance/profile_test_one.rb && bundle exec rspec spec/acceptance/profile_test_two.rb

对于串行或并行运行,最好在 CI 平台内进行。因此,对于 Travis(或带有 Matrix 插件的 Jenkins),您可以创建一个测试矩阵,每个配置文件包含不同的测试,以便可以并行运行它们。这需要非常强大的测试机器,尤其是在使用大型虚拟机的情况下。

我怎样才能减少每次运行的时间,特别是如果有一个相当大的 Puppet 设置,具有多个角色和不同的操作系统版本等。也许选择测试类型(“仅角色测试”或“仅配置文件测试”)。

您说的减少时间是指哪一部分?Puppet 运行需要多长时间,或者让机器达到可测试状态需要多长时间?

使用 Docker 实例显著加快了机器配置状态。

要加快 Puppet 的运行速度,这取决于哪些方面比较慢。如果是计算方面的问题,就让 SUT 更大一些,为其提供更多核心或 RAM。对于与网络相关的问题,您可以使用缓存。例如在 Mac 上,你可以使用 Squid 缓存所有需要的 RPM/APT 包

我通常不对角色进行验收测试。角色基本上只是元配置文件:它们不应该具有逻辑,而只是配置文件的集合。

测试角色的唯一好处是使用多个配置文件时检测冲突,但使用 rspec-puppet 而不是验收测试可以更好地检测冲突和依赖性检查。

例如,像这样的角色:

class role::foo_blog {
  include profile::base
  include profile::nginx
  include profile::php
  include profile::mysql
}

使用验收测试来测试四个配置文件中的每一个,并编写 rspec-puppet 测试以确保不同的配置文件没有依赖问题或冲突,这会更容易。

相关内容