7

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

可以通过其他方法吗?

4

3 回答 3

1

您的问题是范围之一。该变量在do 块chef中具有块范围。config.vm.provision

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

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

应该做的伎俩

于 2014-05-23T23:23:48.990 回答
0

也许你已经有了这个工作,但如果没有,请检查一下:

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

于 2014-09-15T13:43:33.563 回答
0

我认为内部块“覆盖”外部块。但是,您可以像我最终在回答(对我自己的问题)中所做的那样做一些事情,以伪造供应商的由内而外的顺序,而不是像 Vagrant 提供的那样由外而内。在您的情况下,您不会像我那样拥有 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
于 2015-09-28T20:57:06.023 回答