1

このスクリプトを実行しようとしています: http://dysinger.net/2008/10/13/using-amazon-ec2-metadata-as-a-simple-dnsしかし、古い Amazon SDK を使用しているため機能しません。バージョン、私は新しいものを使用するように書き直しました:

#!/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

これがすべきことは、ec2 インスタンスを含む新しい /etc/hosts ファイルを出力することです。

そして、私は応答= Dを受け取りますが、答えはハッシュであるため、私は

error undefined method `reservationSet' for #<Hash:0x7f7573b27880>.

私はRubyをまったく知らないので、これは私の問題です(私がしていたのは、Amazonのドキュメントを読んで遊んでいたので、答えが得られました)。どういうわけか、元の例ではこれが機能しているように見えました。とにかく、当時、API はハッシュを返さなかったと思います...上記のようにハッシュを反復処理して、これを機能させるにはどうすればよいですか?

4

1 に答える 1

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
于 2013-02-18T08:13:59.183 に答える