使用Puppet Gem解析节点文件并为每个主机生成规格



我正在我们的Puppet项目中集成RSPEC-PUPPET测试,并且我正在尝试自动生成"应该为所有主机编译"规格(最终可能是其他资源)。这是为了确保一切至少成功编译。

给定节点列表,我可以用:

来完成此操作。
hosts.each do |host|
  describe host, type: :host do
    it { should compile }
  end
end

问题是如何实际获取主机列表。我可以使用Regex来解析节点文件,但这显然会导致精神错乱...由于Puppet Gem已经存在并用于通过RSPEC-PUPPET GEM加载目录,所以我可以使用它来获取主机列表吗?

编辑:

我最终使用了Puppet Pops系统来做到这一点,但是我不确定这是否是这样做的最佳方法,或者是否有一些更易于使用的较高级别的抽象:

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

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

相关内容

  • 没有找到相关文章

最新更新