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

Using Ruby to parse and write Puppet node definitions

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

Ruby 不是我的主要语言,所以我确信有一个更清晰、更像 ruby​​esque 的解决方案。我将不胜感激一些意见或建议。

每个主机在 manifests/nodes 中都有自己的文件,仅包含节点定义。例如

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

类 都是启用(默认)或禁用的元素。在 Ruby 代码中,我将它们存储为实例变量哈希 @elements。

读取方法如下所示:

  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

写入方法如下所示:

  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

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

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

希望这能为您指明正确的方向。

如果您的目标是以编程方式定义您的节点,那么有一种比读写清单更直接的方法。 puppet 的内置功能之一是“External Node Classifiers”(ENC)。基本思想是 外部 到 puppet 的东西将定义节点的外观。

在最简单的形式中,ENC 可以是一个 ruby/python/whatever 脚本,它写出带有 类 列表和启用参数的 yaml。 Reading and writing yaml from ruby is as simple as it gets.