Учитывая ваш пример Vagrantfile
и ваши теоретические playbook2.yml
, выполняющиеся только на server2
после playbook1.yml
на server1
, мы бы пришли к следующему решению:
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/bionic64"
config.vm.define "server1" do |server1|
//
# restrict scope of ansible provisioner to server1 by invoking on its class method off the constructor
server1.vm.provision :ansible do |ansible|
ansible.playbook = 'playbook1.yml'
end
end
config.vm.define "server2" do |server2|
//
# perform similarly for server2, which executes after server1 provisioning due to the imperative ruby dsl
server2.vm.provision :ansible do |ansible|
ansible.playbook = 'playbook2.yml'
end
end
config.vm.define "server3" do |server3|
//
end
end
Это такжеСтоит отметить, что если вы хотите быть точным в отношении заказа, вы можете vagrant up server1
, а затем vagrant up server2
вместо моноблока vagrant up
.
По сути, в Vagrant.configure
есть область действиявлияет на все виртуальные машины в пределах config.vm
.Вы можете ограничить его область действия конкретными виртуальными машинами, создав экземпляр config.vm.define
, как вы делали выше.Объектные виртуальные машины, созданные с помощью config.vm.define
, имеют те же элементы / атрибуты, что и базовые config
.
Обратите внимание, что вы также можете сделать что-то подобное, если хотите:
Vagrant.configure('2') do |config|
...
(1..3).each do |i|
config.vm.define "server#{i}" do |server|
//
server.vm.provision :ansible do |ansible|
ansible.playbook = "playbook#{i}.yml"
end
end
end
end
для каждого-сервер конкретный playbook.Это зависит от того, что именно находится в вашем //
, хотя и для каждой виртуальной машины, и от того, нужна ли вам третья книга воспроизведения для третьей виртуальной машины.