红宝石:解析API响应
问题描述:
我想geht这个脚本来运行:http://dysinger.net/2008/10/13/using-amazon-ec2-metadata-as-a-simple-dns但dosnt工作,因为它使用的是旧亚马逊的SDK版本,我重写它使用新的:红宝石:解析API响应
#!/usr/bin/env ruby
require "rubygems"
require "aws-sdk"
%w(optparse rubygems aws-sdk resolv pp).each {|l| require l}
options = {}
parser = OptionParser.new do |p|
p.banner = "Usage: hosts [options]"
p.on("-a", "--access-key USER", "The user's AWS access key ID.") do |aki|
options[:access_key_id] = aki
end
p.on("-s",
"--secret-key PASSWORD",
"The user's AWS secret access key.") do |sak|
options[:secret_access_key] = sak
end
p.on_tail("-h", "--help", "Show this message") {
puts(p)
exit
}
p.parse!(ARGV) rescue puts(p)
end
if options.key?(:access_key_id) and options.key?(:secret_access_key)
puts "127.0.0.1 localhost"
AWS.config(options)
AWS::EC2.new(options)
answer = AWS::EC2::Client.new.describe_instances
answer.reservationSet.item.each do |r|
r.instancesSet.item.each do |i|
if i.instanceState.name =~ /running/
puts(Resolv::DNS.new.getaddress(i.privateDnsName).to_s +
" #{i.keyName}.ec2 #{i.keyName}")
end
end
end
else
puts(parser)
exit(1)
end
这是什么应该做的是输出一个新的/ etc/hosts文件,其中包含我的ec2实例。
,我得到的回应= d,但答案是一个哈希,所以我得到的
error undefined method `reservationSet' for #<Hash:0x7f7573b27880>.
这是我的问题,因为我不知道红宝石在所有的(所有我做的是阅读亚马逊文档和玩耍,所以我得到一个答案)。不知何故,在原始的例子中,这似乎工作。我想那时候,API并没有返回一个散列,无论如何......我怎么能通过像上面这样的散列迭代来获得这个工作?
答
此代码可以帮助你:
answer = AWS::EC2::Client.new.describe_instances
reservations = answer[:reservation_set]
reservations.each do |reservation|
instances = reservation[:instances_set]
instances.each do |instance|
if instance[:instance_state][:name] == "running"
private_dns_name = instance[:private_dns_name]
key_name = instance[:key_name]
address = Resolv::DNS.new.getaddress(private_dns_name)
puts "{address} #{key_name}.ec2 #{key_name}"
end
end
end
通常使用的方法与名称例如更改代码item.fooBarBaz
使用散列例如item[:foo_bar_baz]
当你学习Ruby的“PP”命令的格式打印变量是非常有用的,当您去,如:
pp reservations
pp instances
pp private_dns_name
我会调试'answer'你回来。这是一个散列,所以也许只是尝试'answer.each do | key,value |'而不是调用不存在的'answer.reservationSet' – AJcodez 2013-02-18 03:14:07