0
   cluster_size = 5 
   def build_namenode_box( config )
      vmname = "namenode"
      config.vm.define vmname.to_sym do |namenode|
          namenode.vm.box = "dummy"
          namenode.vm.provision :chef_solo, preserve_order: true do |chef|
             chef.cookbooks_path = "cookbooks"
             chef.roles_path = "roles"
             chef.add_role "test"
             chef.data_bags_path = "data_bags"
             chef.add_recipe "cloudera::namenode"
             chef.add_recipe "cloudera-cluster"
           end
           namenode.vm.provision :hostmanager
           namenode.vm.provision :shell, :inline => $script
      end
    end

    def build_slaves_boxes( config, cluster_size )
      (1..cluster_size).each do |i|
        vmname = "slave#{i}"
        config.vm.define vmname.to_sym do |slave|
          slave.vm.box = "dummy"
          slave.vm.provision :chef_solo, preserve_order: true do |chef|
            chef.cookbooks_path = "cookbooks"
            chef.roles_path = "roles"
            chef.add_role "test"
            chef.data_bags_path = "data_bags"
            chef.add_recipe "cloudera::datanode"
            chef.add_recipe "cloudera-cluster"
          end
          slave.vm.provision :shell, :inline => $slavescript
        end
      end  
    end

    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 = "myid"
        aws.secret_access_key = "my_key"
        aws.keypair_name = "my_key"
        aws.ami = "ami-7747d01e"
        aws.security_groups = ["my_group"]
        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-12.04/version/1/provider/virtualbox.box"
          v.customize ["modifyvm", :id, "--memory", "1024"] 
      end

      #block the program until it returns. 
      build_namenode_box( config )
      # have to wait until the build_namenode_box() returns
      build_slaves_boxes( config, cluster_size )
    end

我正在构建一个 Vagrantfile(在 Ruby 中)来创建一个 Cloudera Hadoop 集群。它造成的问题如下: Vagrant 不强制执行订单(不要等到订单定义的虚拟机完成执行)。所以我需要等到namenode完成,因为从属中的数据节点在作业跟踪器之前启动。解决方案?阻塞build_namenode_box()函数直到它完成。我在 Ruby 中非常原始,那么如何编写一个函数阻止程序,等待直到build_namenode_box()在执行函数之前返回build_slaves_boxes()?我该如何使用yield来实现这一点?

4

1 回答 1

0

这在普通的 Vagrant 中是不可能的,因为您注意到它不支持虚拟机间的依赖关系。您可以查看使用仅以vagrant up $name正确顺序调用的外部脚本或更复杂的东西(例如 chef-metal)来管理配置。

于 2014-06-24T23:01:30.297 回答