我正在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
要补充的一点是,这些系统将与互联网隔离开来。所以我更愿意避免使用大量的依赖库,因为我需要手动安装/维护它们。
答案 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
希望这能指出你正确的方向。