书写结构化的事实



我写了一些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

所以我猜我想知道的顺序是:

  1. 我应该合并哈希吗?我最初认为我做了,但发现这非常困难,因为不知道我有多少哈希值。
  2. 我应该使用汇总事实还是"标准"?一个?
  3. 我如何保留哈希的结构,然后用单个查询(例如事实测试)调用它。
  4. 任何与我的代码相似的例子(我发现木偶很难遵循)。

这是我想要的结尾:

[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": }
}

相关内容

  • 没有找到相关文章

最新更新