使用 Ruby 解析和编写 Puppet 节点定义
Using Ruby to parse and write Puppet node definitions
我正在 Ruby 中编写一个帮助程序 API 来自动创建和操作节点定义。我的代码正在运行;它可以成功读写节点定义,但是有点笨拙。
Ruby 不是我的主要语言,所以我确信有一个更清晰、更像 rubyesque 的解决方案。我将不胜感激一些意见或建议。
每个主机在 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.
我正在 Ruby 中编写一个帮助程序 API 来自动创建和操作节点定义。我的代码正在运行;它可以成功读写节点定义,但是有点笨拙。
Ruby 不是我的主要语言,所以我确信有一个更清晰、更像 rubyesque 的解决方案。我将不胜感激一些意见或建议。
每个主机在 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.