我写了一些ruby代码,它将在linux服务器上运行,并返回有关服务器的详细信息。它通过连接到amazon并检索一些json(它运行两个单独的命令一个检索磁盘列表-例如/dev/sda1,/dev/xvdb,然后通过另一个查询将其映射到volumeID)来完成此操作。
我对输出做了一些小的修改,并增加了一些我感兴趣的值。代码运行多次并返回多个哈希值(每个磁盘一个哈希值——也许我应该合并它们?)无论如何,下面是一个有两个磁盘的服务器示例(这只是一些调试输出):
Hash is {"/dev/sda1"=>{"disk_mapping"=>"", "is_lvm_partitioned"=>"false", "volumeid"=>"vol1234"}}.
Hash is {"/dev/xvdb1"=>{"disk_mapping"=>"xvdb1", "is_lvm_partitioned"=>"true", "volumeid"=>"vol5678"}}.
我想要做的下一件事是将其转换为结构化事实(使用设备:/dev/sda1,/dev/xvdb1作为"键")。这里是我如何做的一个粗略的想法(我跳过了很多不相关的代码)。
json_string = {
"#{path}" => {
"disk_mapping" => "#{disk_mapping}",
"is_lvm_partitioned" => "#{is_lvm_partitioned}",
"volumeid" => "#{getVolumes}"
}
}.to_json
hash = JSON.parse(json_string)
if hash.is_a? Hash then
debug_msg("Hash is #{hash}.")
hash["#{path}"].each do |key, child|
debug_msg("Setting key: #{key} child: #{child}.")
end
end
我从来没有真正写过任何ruby之前,所以这是从多个地方复制的,但除了聚合的事实,我找不到一个方法来做到这一点;我试过这样做:
Facter.add(:test["#{path}"]["#{key}"]) do
setcode do
#{child}
end
end
所以我猜我想知道的顺序是:
- 我应该合并哈希吗?我最初认为我做了,但发现这非常困难,因为不知道我有多少哈希值。
- 我应该使用汇总事实还是"标准"?一个?
- 我如何保留哈希的结构,然后用单个查询(例如事实测试)调用它。
- 任何与我的代码相似的例子(我发现木偶很难遵循)。
这是我想要的结尾:
[root@blah ~]# facter test
{
/dev/sda1 => {
disk_mapping => "",
is_lvm_partitioned => "false",
volumeid => "vol1234"
},
/dev/xvdb => {
disk_mapping => "xvdb1",
is_lvm_partitioned => "true",
volumeid => "vol5678"
}
}
谢谢。
我错了…
hash_template = {}
hash = hash_template.merge!({
"#{path}" => {
"disk_mapping" => "#{disk_mapping}",
"is_lvm_partitioned" => "#{is_lvm_partitioned}",
"volumeid" => "#{getVolumes}"
}
}
if hash.is_a? Hash then
Facter.add(:test) do
setcode do
begin
"#{hash}"
rescue
nil
end
end
end
end
这只能通过调用它(在傀儡清单中)来检索/查看:
if $test {
notify { "Test fact is set as $test": }
}