2017-01-23 77 views
0

我有一个machine.yml文件,如下所示:如何解析yaml文件?

--- 
    machines: 
    A: 
     ip: ABC 
     pass: vass 
     user: A 

    B: 
     ip: XYZ 
     pass: grass 
     user: B 

    C: 
     ip: klm 
     pass: pass 
     user: C 

我试图分析上面的文件,如下所示:

 machines = YAML.load_file('machine.yml') 
     machines = machines['machines'] 
     ## Iterate through entries in YAML file 
     machines.each_value do |machines| 
      var = [machines["A"]["ip"], machines["A"]["pass"], machines["B"]["ip"],machines["B"]["pass"], machines["C"]["ip"],machines["C"]["pass"]] 
      # var should have all the values 
     end 

的“VAR”应该包含所有的值作为一个字符串。但是我不能执行上面的那部分,因为它会抛出错误。我如何分别解析YAML的所有值?

+0

的[?我如何解析YAML文件(可能的复制http://stackoverflow.com/questions/3877004/how-do-i-parse-a-yaml-file) – Bustikiller

+2

什么是错误? – Anthon

回答

3

您的代码

既然你硬编码你感兴趣的钥匙,你不需要用each_values迭代:

machines = YAML.load_file('machine.yml') 
machines = machines['machines'] 
var = [machines["A"]["ip"], machines["A"]["pass"], machines["B"]["ip"],machines["B"]["pass"], machines["C"]["ip"],machines["C"]["pass"]] 

替代

首先,你应该尽量不要每次都覆盖相同的变量(machines)。这就是所谓的“阴影”,它使得更难理解和使用你的代码。

取决于你想要做什么,eachmapflat_map可以帮助你:

require 'yaml' 

yaml_hash = YAML.load_file('machine.yml') 
p yaml_hash['machines'] 
#=> {"A"=>{"ip"=>"ABC", "pass"=>"vass", "user"=>"A"}, "B"=>{"ip"=>"XYZ", "pass"=>"grass", "user"=>"B"}, "C"=>{"ip"=>"klm", "pass"=>"pass", "user"=>"C"}} 

yaml_hash['machines'].each do |letter, hash| 
    p letter 
    p hash['ip'] 
    p hash['pass'] 
end 

#=> 
# "A" 
# "ABC" 
# "vass" 
# "B" 
# "XYZ" 
# "grass" 
# "C" 
# "klm" 
# "pass" 

p yaml_hash['machines'].values 
#=> [{"ip"=>"ABC", "pass"=>"vass", "user"=>"A"}, {"ip"=>"XYZ", "pass"=>"grass", "user"=>"B"}, {"ip"=>"klm", "pass"=>"pass", "user"=>"C"}] 

p yaml_hash['machines'].values.map { |hash| hash.values_at('ip', 'pass') } 
#=> ["ABC", "vass"], ["XYZ", "grass"], ["klm", "pass"]] 

p yaml_hash['machines'].values.flat_map { |hash| hash.values_at('ip', 'pass') } 
#=> ["ABC", "vass", "XYZ", "grass", "klm", "pass"] 
+0

如何将每个值传递给一个bash脚本我正在做sample.sh,:args => [p hash ['ip']]但它不工作。 – Learner