首页 > 解决方案 > 如何使用 rspec 在 puppet 中模拟 puppet validate_cmd?

问题描述

我有一个木偶食谱 rspec 示例测试,如下所示

it {
  is_expected.to contain_file('/etc/resolv.conf')
    .with(
      'ensure' => 'file',
      'owner' => 'root',
      'group' => 'root',
      'mode' => '0444',
      'validate_cmd' => '/var/tmp/checkdns_nameservers.sh',
    )
    .with_content(resolvconf_contents)
    .that_notifies('Service[sshd]')
    .that_notifies('Service[nscd]')
}

问题是这只是检查清单中是否存在 validate_cmd 。

我必须模拟 validate_cmd 函数并返回 true/false,基于此我必须检查新创建的文件的内容。如何使用 rspec 模块模拟 validate_cmd 命令?任何帮助将不胜感激!

标签: puppetrspec-puppet

解决方案


简短的回答是,这是不可能的,您需要使用烧杯、测试厨房等工具。

要获得更长的答案,我会将您引导至 Rspec-puppet教程

很多人对这些测试的目的感到困惑,因为他们无法在实时系统上测试清单的结果。这不是 rspec-puppet 的重点。Rspec-puppet 测试用于测试 Puppet 在将清单编译成 Puppet 资源目录时的行为。

关键是 Rspec-puppet 从不应用它编译的目录;它只检查已编译的目录并允许您对那里的内容做出断言。但是要观察行为以响应您所做工作的差异validate_cmd,您确实需要在真实系统上应用目录。

当然,在 Beaker 或 Test Kitchen 中设置系统并非易事,这样您的脚本也将返回两个不同的值。此外,您真正要测试的是什么。你不是在测试 Puppet 本身是否做到了它承诺的事情吗?如果是这样,你真的不应该尝试测试它。

或者,这是您自己编写的脚本吗?如果是这样,请考虑改用shunit2BATS等 Bash 单元测试框架。相反,证明您的 shell 脚本的行为方式符合您对操作系统的期望。


推荐阅读