如何在Vagrant中为多机器环境指定提供程序默认值



我想知道是否有一种方法可以在使用Vagrant创建多机器环境时为提供程序指定默认值?

我试图做如下的事情:

Vagrant.configure("2") do |config|
  config.vm.box = "andyshinn/ubuntu-precise64"
  config.vm.provision :chef_client do |chef|
    chef.chef_server_url = "https://api.opscode.com/organizations/myorg"
    chef.validation_key_path = "~/.chef/myorg-validator.pem"
    chef.delete_node = true
    chef.delete_client = true
    chef.validation_client_name = "myorg-validator"
  end
  config.vm.define :app do |app|
    app.vm.network "private_network", ip: "172.16.64.61"
    app.vm.host_name = "vagrant-app-#{ENV['USER']}"
    app.vm.provision :chef_client do |chef|
      chef.add_recipe "myrecipe1"
      chef.add_recipe "myrecipe2"
      chef.add_recipe "sudo"
    end
  end
  config.vm.define :web do |web|
    web.vm.network "private_network", ip: "172.16.64.62"
    web.vm.host_name = "vagrant-web-#{ENV['USER']}"
    web.vm.provision :chef_client do |chef|
      chef.add_recipe "myrecipe3"
      chef.add_recipe "myrecipe4"
      chef.add_recipe "sudo"
    end
  end
end

但是每个VM块似乎没有选择任何主要配置块设置。我得到这个错误:

There are errors in the configuration of this machine. Please fix
the following errors and try again:
chef client provisioner:
* Chef server URL must be populated.
* Validation key path must be valid path to your chef server validation key.

可以通过其他方法吗?

你的问题是一个范围。变量chefconfig.vm.provision do块中具有块作用域。

一旦此块退出,您的更改就会消失。您应该按照流浪汉网站的multi-machine文档中的示例进行操作。

config.vm.provision "shell", inline: "echo Hello"

Vagrant.configure("2") do |config|
  config.vm.box = "andyshinn/ubuntu-precise64"

  config.vm.provision "chef_client", chef_server_url: "https://api.opscode.com/organizations/myorg"
  config.vm.provision "chef_client", validation_key_path:  "~/.chef/myorg-validator.pem                
  config.vm.provision "chef_client", delete_node: true
  config.vm.provision "chef_client", delete_client: true
  config.vm.provision "chef_client", validation_client_name: "myorg-validator"

  config.vm.define :app do |app|
    app.vm.network "private_network", ip: "172.16.64.61"
    app.vm.host_name = "vagrant-app-#{ENV['USER']}"
    app.vm.provision :chef_client do |chef|
      chef.add_recipe "myrecipe1"
      chef.add_recipe "myrecipe2"
      chef.add_recipe "sudo"
    end
  end

应该可以

也许你已经有了这个工作,但如果没有,看看这个:

  • https://inviqa.com/blog/tips-vagrant-and-chef

这部分解决了我的问题;也许它会对你有帮助。

我认为内部块"覆盖"了外部块。但是,您可以像我在回答(我自己的问题)中所做的那样,对提供程序进行由内到外的排序,而不是像Vagrant提供的那样由外到内。在您的案例中,您不会像我一样使用shell和puppet提供程序,但是您可以应用类似模板方法模式的东西来用更多的食谱扩展chef提供程序。比如:

module Vagrant
  module Config
    module V2
      class Root
        def provision(extra_recipes)
          config.vm.provision :chef_client do |chef|
            chef.chef_server_url = "https://api.opscode.com/organizations/myorg"
            chef.validation_key_path = "~/.chef/myorg-validator.pem"
            chef.delete_node = true
            chef.delete_client = true
            chef.validation_client_name = "myorg-validator"
            extra_recipes.each { |recipe| chef.add_recipe(recipe) }
          end
        end
      end
    end
  end
end
Vagrant.configure("2") do |config|
  config.vm.box = "andyshinn/ubuntu-precise64"
  config.vm.define :app do |app|
    app.vm.network "private_network", ip: "172.16.64.61"
    app.vm.host_name = "vagrant-app-#{ENV['USER']}"
    app.provision("myrecipe1", "myrecipe2", "sudo")
  end
  config.vm.define :web do |web|
    web.vm.network "private_network", ip: "172.16.64.62"
    web.vm.host_name = "vagrant-web-#{ENV['USER']}"
    app.provision("myrecipe3", "myrecipe4", "sudo")
  end
end

最新更新