ruby-on-rails - 如何在 Vagrant 中获取 IP 地址?

标签 ruby-on-rails hadoop amazon-web-services chef-infra vagrant

我正在尝试配置一个 Hadoop 集群,但为此我需要 namenode 的 IP 地址。 集群本身由 Vagrant 创建,但在 vagrant 在 AWS 中创建实例之前我没有 IP 地址。 所以,我有以下 Vagrantfile:

current_dir = File.dirname(__FILE__)

$master_script = <<SCRIPT
// will write a script to configure 
SCRIPT

Vagrant.configure("2") do |config|
  config.omnibus.chef_version = :latest

  config.vm.provider :aws do |aws, override|
    config.vm.box = "dummy"
    aws.access_key_id = "MY_KEY"
    aws.secret_access_key = "SECRET_KEY"
    aws.keypair_name = "my_key"
    aws.ami = "ami-7747d01e"
    override.ssh.username = "ubuntu"
    override.ssh.private_key_path = "#{current_dir}/my_key.pem"
  end

  config.vm.provider :virtualbox do |v|
      config.vm.box = "precise64"
      config.vm.box_url =  "https://vagrantcloud.com/chef/ubuntu-13.04/version/1/provider/virtualbox.box"
      v.customize ["modifyvm", :id, "--memory", "1024"]
  end

  config.vm.define :namenode do |namenode|
      namenode.vm.box = "dummy"
      namenode.vm.provision :chef_solo do |chef|
         chef.cookbooks_path = "cookbooks"
         chef.roles_path = "roles"
         chef.add_role "cluster"
      end
      namenode.vm.provision :hostmanager
      namenode.vm.provision "shell", :inline => $master_script
  end



config.vm.define :slave do |slave|
      slave.vm.box = "dummy"
      slave.vm.provision :chef_solo do |chef|
         chef.cookbooks_path = "cookbooks"
         chef.roles_path = "roles"
         chef.add_role "cluster"
      end
      slave.vm.provision :hostmanager
      slave.vm.provision "shell", :inline => $master_script
  end
end

我需要使用名称节点的 ip 地址 更新 mapred-site.xml 和 core-site.xml 文件。我怎样才能获得 namenode 框的 ip 地址,以便我可以更新 hadoop 配置文件? Recipe 中是否有更好的选择可以用来完成它? 假设我有 1 个 namenode 和 5 个 slavesmapred-site.xml.erb 模板将如下所示:

<configuration>
   <property>
      <name>mapred.job.tracker</name>
      <value>hdfs://<%= node[:ipaddress] %>:8021</value>
   </property>
</configuration>

但是,我需要所有的 namenodeslaves 都只有 namenode 的 IP 地址。我怎样才能在 chef 中完成它? 无论哪种方式都适合我,即使我更喜欢 chef 解决方案。

最佳答案

你可以:

1-使用namenode实例上的实例元数据服务找出自己的ip:

curl http://169.254.169.254/latest/meta-data/local-ipv4

参见:http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AESDG-chapter-instancedata.html

2- 标记名称节点(例如:HADOOP_ROLE=NAMENODE)并在任何实例上使用 AWS CLI 查找名称节点的本地 ip:

aws ec2 describe-instances \
  --region=us-east-1 \
  --filter "Name=tag:HADOOP_ROLE,Values=NAMENODE" \
  --query='Reservations[*].Instances[*].PrivateIpAddress' \
  --output=text

参见:http://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html

关于ruby-on-rails - 如何在 Vagrant 中获取 IP 地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23372760/

相关文章:

hadoop - 无法初始化集群。请检查你配置的mapreduce.framework.name和对应的服务器地址-提交job2remoteClustr

hadoop - 使用 MapReduce 的 Hive 表数据

amazon-s3 - 从 Amazon S3 下载 Assets 的速度取决于哪些因素?

c# - SQS : Getting Number of message in the SQS Queue

ruby-on-rails - 什么是 rails 约定 'username' 或 'user_name' ?

ruby-on-rails - 在 minitest 中测试 postgres "RANDOM()"

ruby-on-rails - 找不到可寻址的 gem

c++ - 使用C++运行Hadoop管道时不存在此类文件

amazon-web-services - EC2 的 PuTTy 连接超时

ruby-on-rails - 重新启动 shell Ubuntu 16 后找不到 RVM 安装的 ruby