使用puppet gem解析节点文件并为每个主机生成规范

时间:2017-09-14 10:19:42

标签: ruby rspec puppet rspec-puppet

我正在我们的puppet项目中集成rspec-puppet测试,我正在尝试为所有主机(最终可能是其他资源)自动生成“should compile”规范。这是为了确保所有内容至少成功编译。

给定一个节点列表,我可以这样做:

hosts.each do |host|
  describe host, type: :host do
    it { should compile }
  end
end

问题是如何实际获取主机列表。我可以使用正则表达式来解析节点文件但显然会导致insanity ...由于puppet gem已经存在并用于通过rspec-puppet gem加载目录,我可以使用它来获取列表主持人?

编辑:

我最终设法使用puppet pops system来做到这一点,但我不确定这是否是最好的方法,或者是否有更容易使用的更高级别的抽象:

require 'spec_helper'
require 'puppet/pops'

code_dirs = [RSpec.configuration.module_path, RSpec.configuration.manifest_dir]
definitions =
    Dir["{#{code_dirs.join(',')}}/**/*.pp"].
        map {|file| Puppet::Pops::Parser::Parser.new.parse_file file}.
        flat_map {|parsed_manifest| parsed_manifest.definitions}

hosts = definitions.
    select {|definition| definition.is_a? Puppet::Pops::Model::NodeDefinition}.
    flat_map {|node_definition| node_definition.host_matches}.
    select {|host_match| host_match.is_a? Puppet::Pops::Model::LiteralString}.
    map {|string_host_match| string_host_match.value}

classes = definitions.
    select {|definition| definition.is_a? Puppet::Pops::Model::HostClassDefinition}.
    map {|host_class_definition| host_class_definition.name}

hosts.each do |host|
  describe host, type: :host do
    it {should compile}
  end
end

classes.each do |klass|
  describe klass, type: :class do
    it {should compile}
  end
end

1 个答案:

答案 0 :(得分:1)

查看https://github.com/nwops/puppet-retrospec,它提供现有模块的解析清单和模板测试。