Puppet noop 当可执行文件尚不存在时

Puppet noop When Executable does not exist yet

以下是简化的清单我是运行:

package {'ruby2.4':
  ensure => installed
}

exec { "gem2.4_install_bundler":
  command => "/usr/bin/gem2.4 install bundler",
  require => Package['ruby2.4']
}

Puppet apply 正确运行此清单,即

  1. 安装 ruby​​2.4 包(包括 gem2.4)

  2. 使用 gem2.4 安装捆绑器

但是,puppet 应用 --noop 失败,因为 puppet 找不到可执行文件“/usr/bin/gem2.4”,因为 ruby​​2.4 没有安装 --noop。

我的问题是是否有一种标准方法可以使用 puppet apply --noop 来测试这样的场景?要验证我的人偶清单是否正确执行?

我突然想到,我可能必须解析输出并验证执行顺序。如果是这种情况,是否有标准 way/tool 呢?

最后的手段是进行非常基本的检查,确保人偶至少运行,这可以通过 --detailed-exitcodes 选项来确定。 (不同于 1 的代码)。

提前致谢

rspec-puppet 是该级别验证的标准工具。它可以从清单构建一个目录(例如 class、定义的类型或主机),然后您可以编写测试来验证内容。

在您的情况下,您可以验证 package 资源是否存在,exec 资源是否存在,并验证它们之间的顺序。这与 运行 使用 --noop 模式和解析输出一样有效 - 但比 运行.

更容易和更便宜

rspec-puppet 最适合模块,因此假设您按照网站上的模块设置进行操作(将 rspec-puppet 添加到 Gemfile,运行ning rspec-puppet-init),假设这是在一个名为 ruby24 的 class 中,spec/classes/ruby24_spec.rb 中的一个简单规范是:

require 'spec_helper'

describe 'ruby24' do
  it { is_expected.to compile.with_all_deps }
  it { is_expected.to contain_package('ruby2.4').with_ensure('installed') }
  it { is_expected.to contain_exec('gem2.4_install_bundler').with_command('/usr/bin/gem2.4 install bundler') }
  it { is_expected.to contain_exec('gem2.4_install_bundler').that_requires('Package[ruby2.4]') }
end