2013-02-18 63 views
1

我想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

回答

0

此代碼可以幫助你:

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