2

语境:

我有一个 puppet 模板,它在渲染时处理事实的count子组件。processors这个事实存在于我所有的客户身上。

该事实的用例是在对其执行十进制数学的模板行中,例如:MyConfigVar=<%= 0.9 * @processors['count'] %>在某个.erb文件中。

我想要:

  1. 将我的模板化代码部署到生产主机。
  2. 为我的模板编写健壮的单元测试,这样我就可以确定它会正确呈现,给定各种合理的事实值。

我试过的:

首先,我尝试使用印记:<%= 0.9 * @processors[:count] %>. 如果我用 rspec-puppet 模拟类似的东西facts = { :processors => { :count => 10 } },我的测试都通过了。清单应用程序不起作用;它有一个“不能相乘nil”的错误。Sigils显然已经出来了。

然后,我尝试使用字符串键:<%= 0.9 * @processors['count'] %>. 我使用 sigil ( facts = { :processors => { :count => 10 } }) 的测试没有被选中,但我的值被正确找到并乘以facts = { :processors => { 'count' => 10 } }. 然后所有的测试都通过了。但是,清单应用程序因失败而Can't coerce String into Int失败。

然后,我尝试了字符串值。模板仍然读取<%= 0.9 * @processors['count'].to_i %>,我测试了字符串和整数值,例如

let(:facts) { :processors => { 'count' => '10' } }
# tests with string value
let(:facts) { :processors => { 'count' => 10 } }
# tests with integer value

测试都通过了,但清单应用程序呈现0.0了事实的价值。

问题:

两个主要问题:

  1. 我怎样才能可靠地使用这个(或任何)事实来获得内联十进制数学?
  2. 实际上,我如何才能可靠地rspec-puppet对生产代表类型进行单元测试、使用或类似的模拟值?
4

2 回答 2

2

这里有几件事在起作用。

正如 Josh Souza 所说,旧版本的 Facter 不支持散列或数组。因此,根据您使用的 Puppet 和 Facter 版本,我会检查stringify_facts配置的值。

如果将其设置为 true(它将在较旧的 Puppet 上),那么事实将不会以哈希的形式出现,它们会被转换为清单中的字符串,从而导致没有分隔的混搭字符串(例如 . modelsIntel(R) Core(TM) i7-2760QM CPU @ 2.40GHzcount1physicalcount1)。请注意count1, 这将:count => 1在原始哈希中。

您可以使用stringify_factsrspec-puppet >= 2.2 中的 spec_helper 中的设置对此进行测试。

因此,如果您运行,您可以看到许多不是散列的遗留事实facter -p

$ facter -p | grep processor
processorcount => 8
processors => {"count"=>8, "speed"=>"2.5 GHz"}
sp_current_processor_speed => 2.5 GHz
sp_number_processors => 4

所以我建议使用$::processorcount事实,它应该是一个整数,因为这是返回的值,但你可以在你的模板中使用to_i来确定。.erb我很确定它应该总是返回一个整数。

如果您真的很勇敢,您可以创建一个函数将值转换为数字并在您的清单中使用它(例如https://github.com/kwilczynski/puppet-functions/blob/master/lib/puppet /parser/functions/str2num.rb )

所以你的代码看起来像:

if (is_integer($::processorcount)) {
  $processor_as_int = $::processorcount
} else {
  $processor_as_int = str2num($::processorcount)
}

总而言之,它有点乱,你可以看到为什么在 Puppet 4 中我们有一个更严格的打字系统!

于 2016-04-28T11:30:10.473 回答
1

对于它的价值,我对您的问题进行了一些调查,在我的测试床中,“处理器”的事实,虽然运行facter processors时是一个哈希,但实际上是一个字符串,一旦它进入 Puppet/templates 并且它缺少任何分隔符(IE “modelsIntel(R) Core(TM) i7-2760QM CPU @ 2.40GHzcount1physicalcount1”是原始值)。我通过在我的 ruby​​ 模板中使用“@processors.class”以及其他一些测试来验证这一点。我的测试平台正在运行 Puppet 3.8.3 和 Facter 2.4.6,以防万一。

所以我可以提出的解决方案是:

  1. 使用@processorcount 事实,它始终是一个整数,并且应该可以在单元测试中与符号一起正常工作。
  2. 直接在您的模板中使用 Facter(这是非常非傀儡,但它有效)

    • <%= Facter.value(:processors)['count'] %>
  3. 使用正则表达式字符串解析(我不推荐这个,因为它很脆弱而且很老套,但它确实可以解决问题)

    • count=@processors.dup.gsub!(/physicalcount/,'physical').gsub!(/.*count([0-9])+.*/,'\1')

在不同版本的 Puppet/Facter 中,这很可能不是问题,但希望这足以让您朝着正确的方向前进。

于 2016-04-27T17:20:52.397 回答