使用Ruby来解析和编写Puppet节点定义

时间:2015-04-24 09:08:38

标签: ruby puppet

我正在Ruby中编写一个辅助API来自动创建和操作节点定义。我的代码正在运行;它可以成功地读取和写入节点defs,但是,它有点笨拙。

Ruby不是我的主要语言,所以我确信有更清洁,更有效的解决方案。我希望得到一些建议或建议。

每个主机在清单/节点中都有自己的文件,只包含节点定义。 e.g。

node 'testnode' {
  class {'firstclass': }
  class {'secondclass': enabled => false }
}

所有类都是启用(默认)或禁用的元素。在Ruby代码中,我将这些存储为实例变量hash @elements。

read方法如下所示:

  def read()
    data = File.readlines(@filepath)
    for line in data do
      if line.include? 'class'
        element = line[/.*\{'([^\']*)':/, 1]
        if @elements.include? element.to_sym
          if not line.include? 'enabled => false'
            @elements[element.to_sym] = true
          else
            @elements[element.to_sym] = false
          end
        end
      end
    end
  end

write方法如下所示:

  def write()
    data = "node #{@hostname} {\n"
    for element in @elements do
      if element[1]
        line = "    class {'#{element[0]}': }\n"
      else
        line = "    class {'#{element[0]}': enabled => false}\n"
      end

      data += line
    end

    data += "}\n"

    file = File.open(@filepath, 'w')
    file.write(data)
    file.close()
  end

要补充的一点是,这些系统将与互联网隔离开来。所以我更愿意避免使用大量的依赖库,因为我需要手动安装/维护它们。

2 个答案:

答案 0 :(得分:2)

如果您的目标是以编程方式定义节点,则可以通过更简单的方式阅读和编写清单。 puppet的内置功能之一是" External Node Classifiers"(ENC)。基本的想法是,外部到puppet的东西将定义一个节点应该是什么样子。

在最简单的形式中,ENC可以是ruby / python /无论使用类列表和启用参数写出yaml的脚本。 Reading and writing yaml from ruby is as simple as it gets

答案 1 :(得分:1)

Ruby有一些非常好的方法来迭代数据结构。请参阅下面的示例,了解如何rubify您的代码。我绝不是这方面的专家,也没有测试过代码。 :)

def read
  data = File.readlines(@filepath)
  data.each_line do |line|
    element = line[/.*\{'([^\']*)':/, 1].to_sym
    if @elements.include?(element)
      @elements[element] = line.include?('enabled => false') ? false : true
    end
  end
end

def write
  File.open(@filepath, 'w') do |file|
    file.puts "node #{@hostname} {"
    @elements.each do |element|
      if element[1]
        file.puts "    class {'#{element[0]}': }"
      else
        file.puts "    class {'#{element[0]}': enabled => false }"
      end
    end
    file.puts '}'
  end
end

希望这能指出你正确的方向。