您似乎混淆了Vagrant configuration (with version) 和[Vagrant VM 定义](https://www.vagrantup.com/docs/multi-machine#defining-multiple-machines]
您将有 1 个配置用于您的 Vagrantfile 和多个 VM 定义。
这是我过去使用的 4 个虚拟机的示例(3 个基于 centos,1 个 Windows 虚拟机)
# -*- mode: ruby -*-
# vi: set ft=ruby :
require 'yaml'
settings = YAML.load_file File.join(File.dirname(__FILE__), "puppet/hieradata/common.yaml")
selenium_version = settings['selenium_version']
Vagrant.configure("2") do |config|
config.vm.box = settings['host_box'] || "pws/centos65"
config.ssh.username = settings['ariba_user']
config.vm.define "db" do |db|
db.vm.hostname = settings['db_hostname']
db.vm.network "private_network", ip: settings['host_db_address']
db.vm.synced_folder "dump/", "/dump"
db.vm.provider "vmware_workstation" do |vm|
vm.vmx["memsize"] = "3072"
end
db.vm.provider "virtualbox" do |vb|
vb.memory = "3072"
end
db.vm.provision "shell", path: "puppet/script/install-puppet-modules-db.sh"
db.vm.provision :puppet do |puppet|
puppet.manifests_path = "puppet/manifests"
puppet.manifest_file = "base-db.pp"
puppet.module_path = "puppet/modules/db"
puppet.hiera_config_path = "puppet/hiera.yaml"
#puppet.options = "--verbose --debug"
end
end
config.vm.define "app", primary: true do |app|
app.vm.hostname = settings['ariba_hostname']
app.vm.network "private_network", ip: settings['host_app_address']
app.vm.synced_folder "puppet/install_ariba", "/home/ariba/install_sources"
app.ssh.forward_agent = true
app.ssh.forward_x11 = true
app.vm.provider "vmware_workstation" do |vm|
vm.vmx["memsize"] = "4096"
end
app.vm.provider "virtualbox" do |vb|
vb.memory = "3072"
end
app.vm.provision "shell", path: "puppet/script/install-puppet-modules-app.sh"
app.vm.provision :puppet do |puppet|
puppet.manifests_path = "puppet/manifests"
puppet.manifest_file = "base-app.pp"
puppet.module_path = "puppet/modules"
puppet.hiera_config_path = "puppet/hiera.yaml"
#puppet.options = "--verbose --debug"
end
app.vm.provision "shell", path: "puppet/script/run-ariba-app.sh", privileged: false, run: 'always'
end
config.vm.define "win_10" do |win10|
win10.vm.box = "windows_10"
win10.vm.synced_folder "puppet/install_ariba/test", "/test"
win10.vm.provision "shell", path: "puppet/install_ariba/test/install_win_jdk.ps1", privileged: false
win10.vm.provision "shell", path: "puppet/install_ariba/test/install_browsers.ps1", privileged: false
win10.vm.provision "shell", path: "puppet/install_ariba/test/start_win_selenium.bat", run: 'always', args: ["#{selenium_version}", settings['host_hub_address']]
end
config.vm.define "hub" do |hub|
hub.vm.hostname = settings['hub_hostname']
hub.vm.network "private_network", ip: settings['host_hub_address']
hub.vm.provider "vmware_workstation" do |vm|
vm.vmx["memsize"] = "1024"
end
hub.vm.provider "virtualbox" do |vb|
vb.memory = "3072"
end
hub.vm.synced_folder "puppet/install_ariba/test", "/test"
hub.vm.provision "shell", path: "puppet/script/install-puppet-modules-hub.sh"
hub.vm.provision :puppet do |puppet|
puppet.manifests_path = "puppet/manifests"
puppet.manifest_file = "base-hub.pp"
puppet.module_path = "puppet/modules/hub"
puppet.hiera_config_path = "puppet/hiera.yaml"
#puppet.options = "--verbose --debug"
end
hub.vm.provision "shell", path: "puppet/script/run-test.sh", privileged: false, run: 'always', args: "#{selenium_version}"
end
end
Linux 配置是通过 shell 脚本或 puppet 完成的,而 Windows 配置是通过 PowerShell 脚本或 bat 文件完成的。注意 VM 是如何定义的,以及我们如何在其对应的块中使用变量名。
如Vagrant doc中所述
对于类似 POSIX 的机器,shell 配置器执行脚本
SSH。对于配置为使用 WinRM 的 Windows 客户机,
shell 配置程序通过 WinRM 执行 PowerShell 和 Batch 脚本。