我希望有人可以帮我这个,我正在写一个ruby脚本我有问题。首先是大局:
当我从cli运行命令时:
$ mco rpc puppet last_run_summary
我得到了这个输出:
epuppet01.example.com
Changed Resources: 0
Config Retrieval Time: 1.21247005462646
Config Version: 1377176819
Failed Resources: 1
Last Run: 1377241107
Out of Sync Resources: 1
Since Last Run: 195
Summary: {"events"=>{"total"=>1, "success"=>0, "failure"=>1},
"resources"=>
{"scheduled"=>0,
"total"=>8,
"skipped"=>7,
"out_of_sync"=>1,
"failed"=>1,
"changed"=>0,
"failed_to_restart"=>0,
"restarted"=>0},
"changes"=>{"total"=>0},
"version"=>{"config"=>1377176819, "puppet"=>"3.1.1"},
"time"=>
{"config_retrieval"=>1.21247005462646,
"total"=>1.85353105462646,
"last_run"=>1377241107,
"package"=>0.641061}}
Total Resources: 8
Total Time: 1.85353105462646
Type Distribution: {"Package"=>1}
我想要的是将该命令的输出重定向/获取到某个变量/对象。具体来说,我想从摘要中获取“失败的资源”部分或“失败”值。
任何想法怎么可能做到?
到目前为止代码看起来像这样:
def runSingle
cmd = []
cmd.push(which("mco", ["/usr/bin", "/opt/puppet/bin"]))
shell_command(cmd + ["rpc", "puppet", " last_run_summary", "-I"] + shell_escaped_nodes)
end
谢谢!
答案 0 :(得分:1)
您可以像这样更改代码:
def runSingle
cmd = []
cmd.push(which("mco", ["/usr/bin", "/opt/puppet/bin"]))
cmd_output = shell_command(cmd + ["rpc", "puppet", " last_run_summary", "-I"] + shell_escaped_nodes)
result = cmd_failure_stats(cmd_output)
# you'll get 'result' as Ruby hash, like:
# {
# :failed_resources => "1",
# :summary_failed => "1"
# }
# from which you can access desired values as:
# result[:failed_resources] #=> "1"
end
def cmd_failure_stats(raw_string)
return_result = {}
raw_string.lines.map do |line|
return_result[:failed_resources] = line[/Failed Resources.*([\d]+)/, 1] if line[/(Failed Resources.*[\d]+)/, 1]
return_result[:summary_failed] = line[/failed\".*=>([\d]+)/, 1] if line[/failed\".*=>([\d]+)/, 1] }
end
return_result
end