#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, для управления подготовкой.