红宝石:解析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并没有返回一个散列,无论如何......我怎么能通过像上面这样的散列迭代来获得这个工作?

+0

我会调试'answer'你回来。这是一个散列,所以也许只是尝试'answer.each do | key,value |'而不是调用不存在的'answer.reservationSet' – AJcodez 2013-02-18 03:14:07

此代码可以帮助你:

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