Можно ли использовать более одного config.vm.box в Vagrantfile?

Я создал виртуальную машину с некоторыми настройками и настройками сервера и использовал vagrant для создания ящика. Я импортировал коробку в vagrant, чтобы можно было запустить более одного сервера с одинаковой конфигурацией.

Также создал виртуальную машину с настройками клиента и упаковал ее с помощью vagrant, чтобы я мог создать несколько клиентов.

Я хочу знать, возможно ли иметь в одном и том же Vagrantfile блок кода для сервера, использующий server_box, и блок кода для клиента, использующий client_box. Хотя я мог бы использовать config.vm.box для каждого, но когда я запускаю виртуальные машины, клиенты выбирают образ client_box, чего я и хочу, но сервер также выбирает client_box. изображение, игнорирующее собственные настройки.

Моя попытка ниже. ПРИМЕЧАНИЕ. Я знаю, что могу использовать цикл для создания серии клиентов. Я просто поместил код, как показано ниже, для простоты и ясности.

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "server_box"
  config.vm.define "server1", primary: true do |server1|
    [...vm specs here...]
  end
end


Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "client_box"

  config.vm.define "client1", autostart: false do |client1|
    [...vm specs here...]
  end

  config.vm.define "client2", autostart: false do |client2|
    [...vm specs here...]
  end

end

person Lun    schedule 20.06.2015    source источник
comment
Есть ли причина, по которой вы не можете просто поместить все поля в один блок Vagrant.configure, а затем переопределить поля обычным образом, выполнив server1.vm.box = "server_box" и так далее? т.е. подход, описанный на странице docs.vagrantup.com/v2/multi-machine/index. HTML?   -  person Ruaidhrí Primrose    schedule 22.06.2015
comment
Я прочитал информацию по ссылке. Да, в одном блоке можно сначала поставить строку config.vm.box=server_box и раскрутить сервер, потом отредактировать Vagrantfile и изменить строку на config.vm.box = client_box для запуска клиентов, но это не так много для автоматизации, как я себе это представляю. Хотелось бы, чтобы он был более бесшовным. Теперь было бы интереснее, если бы Vagrantfile принимал аргументы командной строки, чтобы сделать его более динамичным; иметь такие переменные, как config1.vm.box, config2.vm.box и в CLI сказать --config1=server_box, --config2=client_box.   -  person Lun    schedule 23.06.2015
comment
А можно перегрузить config.vm.box для каждой машины? т.е. для виртуальной машины сервера вы указываете server.vm.box ="server_box", для клиента 1 вы указываете client1.vm.box="client_box", для клиента 2 вы указываете client2.vm.box="client_box и т. д. Это не работает для вас? Из ссылки Как видите, config.vm.define берет блок с другой переменной. Эта переменная, такая как web выше, точно такая же, как переменная конфигурации, за исключением того, что любая конфигурация внутренней переменной применяется только к определяемому компьютеру. Поэтому любая конфигурация в Интернете будет влиять только на веб-машину.   -  person Ruaidhrí Primrose    schedule 24.06.2015


Ответы (1)


Да, вы можете указать несколько машин, используя вызов метода config.vm.define, например.

Vagrant.configure("2") do |config|
  config.vm.provision "shell", inline: "echo Hello"

  config.vm.define "web" do |web|
    web.vm.box = "apache"
  end

  config.vm.define "db" do |db|
    db.vm.box = "mysql"
  end
end

См.: Определение нескольких компьютеров в Vagranup Docs


Вы также можете использовать синтаксис регистра переключателей, чтобы вы могли установить поле в зависимости от некоторой переменной, например.

case provider
  when "virtualbox"
    config.vm.box = "ubuntu/wily64"
  when "aws"
    config.vm.box = "dummy"
end

В качестве альтернативы установите web.vm.box на основе переменной среды, например.

config.vm.box = ENV['BOX']

и укажите значение из командной строки, например:

BOX=server_box vagrant up

См. также: Несколько поставщиков в одном бродячем файле?

person kenorb    schedule 10.06.2016