2013-08-23 40 views
0

我希望有人可以帮助我解决这个问题,我写了一个ruby脚本,我遇到了问题。首先,大图片:Ruby - MCollective:如何将命令的输出转换为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 

谢谢!

回答

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 
+0

太棒了!非常感谢! – MrTeleBird

相关问题