如何在多机环境的Vagrant中指定provisioner默认值?

如何在多机环境的Vagrant中指定provisioner默认值?,vagrant,vagrantfile,Vagrant,Vagrantfile,我想知道,在使用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/myo

我想知道,在使用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.

可能通过其他方法吗?

您的问题是范围问题。变量
chef
config.vm.provision
do块中具有块作用域

一旦此块退出,您的更改就会消失。您应该遵循vagrant站点上的
多机
文档中的示例

config.vm.provision“shell”,内联:“echo Hello”


应该这样做

也许你已经有了这个功能,但如果没有,请检查以下内容:

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

我认为内部块“覆盖”了外部块。然而,你们可以做一些事情,就像我在回答(我自己的问题)时所做的一样,去伪装,而不是像流浪汉所提供的那个样从外到内。在您的情况下,您不会像我一样拥有一个shell和puppet供应器,但您会应用类似于模式的东西来扩展厨师供应器,使其具有更多的食谱。也许是这样的:

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

我认为
.Vagrantfile
通常描述一个独立的框。当您谈到一个
多机
环境时,它似乎是可疑的,因为答案是多个
.Vagrantfile
s。你认为你可能想做一些流浪汉真的不想做的事吗?我知道你是从哪里来的。但是我认为多机设置是为可扩展多个节点的应用程序设计的。为了适当地扩展,应用程序被模块化为在不同节点上运行的不同组件。因此,为了在本地模拟该环境并保持开发和生产对等,我希望以相同的方式运行它。流浪汉在这方面做得很好,而且确实有效。当你不得不为每个盒子重复相同的配置时,它会变得非常不整洁(潮湿?),这实际上是谷歌的失败。我不知道他们添加了multi-machine-config.Lemme来看看这个,我想你的配置有一些问题。谢谢你的建议!我会在下个星期尝试这个,如果它有效的话,我会接受。我最终尝试了这个,但它不起作用。每台计算机都会阻止无法找到所需参数(如Chef服务器URL和验证密钥)的错误。它似乎没有继承这一点。最好指出配置中的部分。我最终明白了你的意思,自定义方法确实有助于更接近这一点。不是最优雅的。但它起作用了。是的,不太好,但起作用了。我尝试了这个复杂的案例,有很多不同的配置,但有不同的文件:-盒子里的Vagrant文件-home dir中的Vagrant文件-自定义的Vagrant文件,我想在一个地方有厨师相关的东西(URL、键等)。我设法在VAGRANT_HOME/VAGRANT文件中包含实例变量,并且能够在自定义VAGRANT文件中引用它们
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