блокируйте функцию, пока она не завершит возврат.

#ruby #chef-infra #vagrantfile

#ruby #шеф-повар-инфра #vagrantfile

Вопрос:

    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 завершения, потому что datanodes в подчиненных устройствах запускались до jobtracker. Решение? блокируйте build_namenode_box() функцию, пока она не завершится. Я очень плохо разбираюсь в Ruby, так как я могу написать блокировщик функций, который ждет, пока build_namenode_box() не вернется, прежде чем выполнять build_slaves_boxes() функцию? Как я могу использовать yield для этого?

Комментарии:

1. Вы можете обернуть свои vagrant up вызовы в Rakefile. Это позволяет вам определять зависимости. Кроме того, один vagrant up machine вызов будет блокироваться до его завершения.

Ответ №1:

Это невозможно в обычном Vagrant, как вы заметили, он не поддерживает зависимости между виртуальными машинами. Вы можете использовать либо внешний скрипт, который просто вызывает vagrant up $name в правильном порядке, либо что-то более сложное, например chef-metal, для управления подготовкой.