Merge remote-tracking branch 'upstream/master'
This commit is contained in:
commit
a2322c489e
|
@ -5,6 +5,9 @@ BUG FIXES:
|
||||||
- core: push configurations are validated with global configs [GH-5130]
|
- core: push configurations are validated with global configs [GH-5130]
|
||||||
- guests/funtoo: fix incorrect path in configure networks [GH-4812]
|
- guests/funtoo: fix incorrect path in configure networks [GH-4812]
|
||||||
- plugins/login: allow users to login with a token [GH-5145]
|
- plugins/login: allow users to login with a token [GH-5145]
|
||||||
|
- providers/hyperv: allow users to configure memory, cpu count, and vmname [GH-5183]
|
||||||
|
- provisioners/ansible: fix SSH settings to support more than 5 ssh keys [GH-5017]
|
||||||
|
- provisioners/ansible: increase ansible connection timeout to 30 seconds [GH-5018]
|
||||||
|
|
||||||
## 1.7.2 (January 6, 2015)
|
## 1.7.2 (January 6, 2015)
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,8 @@ module Vagrant
|
||||||
# to connect.
|
# to connect.
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
rescue Timeout::Error, Errno::ECONNREFUSED, Errno::EHOSTUNREACH, Errno::ENETUNREACH
|
rescue Timeout::Error, Errno::ECONNREFUSED, Errno::EHOSTUNREACH, \
|
||||||
|
Errno::ENETUNREACH, Errno::EACCES
|
||||||
# Any of the above exceptions signal that the port is closed.
|
# Any of the above exceptions signal that the port is closed.
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
|
@ -14,6 +14,15 @@ module VagrantPlugins
|
||||||
def call(env)
|
def call(env)
|
||||||
vm_dir = env[:machine].box.directory.join("Virtual Machines")
|
vm_dir = env[:machine].box.directory.join("Virtual Machines")
|
||||||
hd_dir = env[:machine].box.directory.join("Virtual Hard Disks")
|
hd_dir = env[:machine].box.directory.join("Virtual Hard Disks")
|
||||||
|
memory = env[:machine].provider_config.memory
|
||||||
|
maxmemory = env[:machine].provider_config.maxmemory
|
||||||
|
cpus = env[:machine].provider_config.cpus
|
||||||
|
vmname = env[:machine].provider_config.vmname
|
||||||
|
|
||||||
|
env[:ui].output("Configured Dynamical memory allocation, maxmemory is #{maxmemory}") if maxmemory
|
||||||
|
env[:ui].output("Configured startup memory is #{memory}") if memory
|
||||||
|
env[:ui].output("Configured cpus number is #{cpus}") if cpus
|
||||||
|
env[:ui].output("Configured vmname is #{vmname}") if vmname
|
||||||
|
|
||||||
if !vm_dir.directory? || !hd_dir.directory?
|
if !vm_dir.directory? || !hd_dir.directory?
|
||||||
raise Errors::BoxInvalid
|
raise Errors::BoxInvalid
|
||||||
|
@ -78,6 +87,10 @@ module VagrantPlugins
|
||||||
image_path: image_path.to_s.gsub("/", "\\")
|
image_path: image_path.to_s.gsub("/", "\\")
|
||||||
}
|
}
|
||||||
options[:switchname] = switch if switch
|
options[:switchname] = switch if switch
|
||||||
|
options[:memory] = memory if memory
|
||||||
|
options[:maxmemory] = maxmemory if maxmemory
|
||||||
|
options[:cpus] = cpus if cpus
|
||||||
|
options[:vmname] = vmname if vmname
|
||||||
|
|
||||||
env[:ui].detail("Creating and registering the VM...")
|
env[:ui].detail("Creating and registering the VM...")
|
||||||
server = env[:machine].provider.driver.import(options)
|
server = env[:machine].provider.driver.import(options)
|
||||||
|
|
|
@ -8,15 +8,27 @@ module VagrantPlugins
|
||||||
#
|
#
|
||||||
# @return [Integer]
|
# @return [Integer]
|
||||||
attr_accessor :ip_address_timeout
|
attr_accessor :ip_address_timeout
|
||||||
|
attr_accessor :memory
|
||||||
|
attr_accessor :maxmemory
|
||||||
|
attr_accessor :cpus
|
||||||
|
attr_accessor :vmname
|
||||||
|
|
||||||
def initialize
|
def initialize
|
||||||
@ip_address_timeout = UNSET_VALUE
|
@ip_address_timeout = UNSET_VALUE
|
||||||
|
@memory = UNSET_VALUE
|
||||||
|
@maxmemory = UNSET_VALUE
|
||||||
|
@cpus = UNSET_VALUE
|
||||||
|
@vmname = UNSET_VALUE
|
||||||
end
|
end
|
||||||
|
|
||||||
def finalize!
|
def finalize!
|
||||||
if @ip_address_timeout == UNSET_VALUE
|
if @ip_address_timeout == UNSET_VALUE
|
||||||
@ip_address_timeout = 120
|
@ip_address_timeout = 120
|
||||||
end
|
end
|
||||||
|
@memory = nil if @memory == UNSET_VALUE
|
||||||
|
@maxmemory = nil if @maxmemory == UNSET_VALUE
|
||||||
|
@cpus = nil if @cpus == UNSET_VALUE
|
||||||
|
@vmname = nil if @vmname == UNSET_VALUE
|
||||||
end
|
end
|
||||||
|
|
||||||
def validate(machine)
|
def validate(machine)
|
||||||
|
|
|
@ -4,7 +4,11 @@ Param(
|
||||||
[Parameter(Mandatory=$true)]
|
[Parameter(Mandatory=$true)]
|
||||||
[string]$image_path,
|
[string]$image_path,
|
||||||
|
|
||||||
[string]$switchname=$null
|
[string]$switchname=$null,
|
||||||
|
[string]$memory=$null,
|
||||||
|
[string]$maxmemory=$null,
|
||||||
|
[string]$cpus=$null,
|
||||||
|
[string]$vmname=$null
|
||||||
)
|
)
|
||||||
|
|
||||||
# Include the following modules
|
# Include the following modules
|
||||||
|
@ -13,10 +17,22 @@ $Dir = Split-Path $script:MyInvocation.MyCommand.Path
|
||||||
|
|
||||||
[xml]$vmconfig = Get-Content -Path $vm_xml_config
|
[xml]$vmconfig = Get-Content -Path $vm_xml_config
|
||||||
|
|
||||||
$vm_name = $vmconfig.configuration.properties.name.'#text'
|
|
||||||
$processors = $vmconfig.configuration.settings.processors.count.'#text'
|
|
||||||
$generation = [int]($vmconfig.configuration.properties.subtype.'#text')+1
|
$generation = [int]($vmconfig.configuration.properties.subtype.'#text')+1
|
||||||
|
|
||||||
|
if (!$vmname) {
|
||||||
|
# Get the name of the vm
|
||||||
|
$vm_name = $vmconfig.configuration.properties.name.'#text'
|
||||||
|
}else {
|
||||||
|
$vm_name = $vmname
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$cpus) {
|
||||||
|
# Get the name of the vm
|
||||||
|
$processors = $vmconfig.configuration.settings.processors.count.'#text'
|
||||||
|
}else {
|
||||||
|
$processors = $cpus
|
||||||
|
}
|
||||||
|
|
||||||
function GetUniqueName($name) {
|
function GetUniqueName($name) {
|
||||||
Get-VM | ForEach-Object -Process {
|
Get-VM | ForEach-Object -Process {
|
||||||
if ($name -eq $_.Name) {
|
if ($name -eq $_.Name) {
|
||||||
|
@ -31,18 +47,34 @@ do {
|
||||||
$vm_name = GetUniqueName $name
|
$vm_name = GetUniqueName $name
|
||||||
} while ($vm_name -ne $name)
|
} while ($vm_name -ne $name)
|
||||||
|
|
||||||
$memory = (Select-Xml -xml $vmconfig -XPath "//memory").node.Bank
|
if (!$memory) {
|
||||||
if ($memory.dynamic_memory_enabled."#text" -eq "True") {
|
$xmlmemory = (Select-Xml -xml $vmconfig -XPath "//memory").node.Bank
|
||||||
$dynamicmemory = $True
|
if ($xmlmemory.dynamic_memory_enabled."#text" -eq "True") {
|
||||||
|
$dynamicmemory = $True
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$dynamicmemory = $False
|
||||||
|
}
|
||||||
|
# Memory values need to be in bytes
|
||||||
|
$MemoryMaximumBytes = ($xmlmemory.limit."#text" -as [int]) * 1MB
|
||||||
|
$MemoryStartupBytes = ($xmlmemory.size."#text" -as [int]) * 1MB
|
||||||
|
$MemoryMinimumBytes = ($xmlmemory.reservation."#text" -as [int]) * 1MB
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$dynamicmemory = $False
|
if (!$maxmemory){
|
||||||
|
$dynamicmemory = $False
|
||||||
|
$MemoryMaximumBytes = ($memory -as [int]) * 1MB
|
||||||
|
$MemoryStartupBytes = ($memory -as [int]) * 1MB
|
||||||
|
$MemoryMinimumBytes = ($memory -as [int]) * 1MB
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$dynamicmemory = $True
|
||||||
|
$MemoryMaximumBytes = ($maxmemory -as [int]) * 1MB
|
||||||
|
$MemoryStartupBytes = ($memory -as [int]) * 1MB
|
||||||
|
$MemoryMinimumBytes = ($memory -as [int]) * 1MB
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# Memory values need to be in bytes
|
|
||||||
$MemoryMaximumBytes = ($memory.limit."#text" -as [int]) * 1MB
|
|
||||||
$MemoryStartupBytes = ($memory.size."#text" -as [int]) * 1MB
|
|
||||||
$MemoryMinimumBytes = ($memory.reservation."#text" -as [int]) * 1MB
|
|
||||||
|
|
||||||
if (!$switchname) {
|
if (!$switchname) {
|
||||||
# Get the name of the virtual switch
|
# Get the name of the virtual switch
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
require "vagrant/util/platform"
|
||||||
|
|
||||||
module VagrantPlugins
|
module VagrantPlugins
|
||||||
module Ansible
|
module Ansible
|
||||||
class Provisioner < Vagrant.plugin("2", :provisioner)
|
class Provisioner < Vagrant.plugin("2", :provisioner)
|
||||||
|
@ -23,6 +25,12 @@ module VagrantPlugins
|
||||||
# but can be enabled via raw_arguments option.
|
# but can be enabled via raw_arguments option.
|
||||||
options << "--connection=ssh"
|
options << "--connection=ssh"
|
||||||
|
|
||||||
|
# Increase the SSH connection timeout, as the Ansible default value (10 seconds)
|
||||||
|
# is a bit demanding for some overloaded developer boxes. This is particularly
|
||||||
|
# helpful when additional virtual networks are configured, as their availability
|
||||||
|
# is not controlled during vagrant boot process.
|
||||||
|
options << "--timeout=30"
|
||||||
|
|
||||||
# By default we limit by the current machine, but
|
# By default we limit by the current machine, but
|
||||||
# this can be overridden by the `limit` option.
|
# this can be overridden by the `limit` option.
|
||||||
if config.limit
|
if config.limit
|
||||||
|
@ -209,6 +217,12 @@ module VagrantPlugins
|
||||||
# Don't access user's known_hosts file, except when host_key_checking is enabled.
|
# Don't access user's known_hosts file, except when host_key_checking is enabled.
|
||||||
ssh_options << "-o UserKnownHostsFile=/dev/null" unless config.host_key_checking
|
ssh_options << "-o UserKnownHostsFile=/dev/null" unless config.host_key_checking
|
||||||
|
|
||||||
|
# Set IdentitiesOnly=yes to avoid authentication errors when the host has more than 5 ssh keys.
|
||||||
|
# Notes:
|
||||||
|
# - Solaris/OpenSolaris/Illumos uses SunSSH which doesn't support the IdentitiesOnly option.
|
||||||
|
# - this could be improved by sharing logic with lib/vagrant/util/ssh.rb
|
||||||
|
ssh_options << "-o IdentitiesOnly=yes" unless Vagrant::Util::Platform.solaris?
|
||||||
|
|
||||||
# Multiple Private Keys
|
# Multiple Private Keys
|
||||||
@ssh_info[:private_key_path].drop(1).each do |key|
|
@ssh_info[:private_key_path].drop(1).each do |key|
|
||||||
ssh_options << "-o IdentityFile=#{key}"
|
ssh_options << "-o IdentityFile=#{key}"
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
require_relative "../../omnibus"
|
||||||
|
|
||||||
|
module VagrantPlugins
|
||||||
|
module Chef
|
||||||
|
module Cap
|
||||||
|
module OmniOS
|
||||||
|
module ChefInstall
|
||||||
|
def self.chef_install(machine, version, prerelease, download_path)
|
||||||
|
su_cmd = machine.config.solaris.suexec_cmd
|
||||||
|
|
||||||
|
machine.communicate.execute("#{su_cmd} pkg list --no-refresh web/curl > /dev/null 2>&1 || pkg install -q --accept web/curl")
|
||||||
|
|
||||||
|
command = VagrantPlugins::Chef::Omnibus.build_command(version, prerelease, download_path)
|
||||||
|
machine.communicate.execute(su_cmd + ' ' + command)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,23 @@
|
||||||
|
module VagrantPlugins
|
||||||
|
module Chef
|
||||||
|
module Cap
|
||||||
|
module OmniOS
|
||||||
|
module ChefInstalled
|
||||||
|
# TODO: this is the same code as cap/linux/chef_installed, consider merging
|
||||||
|
# Check if Chef is installed at the given version.
|
||||||
|
# @return [true, false]
|
||||||
|
def self.chef_installed(machine, version)
|
||||||
|
knife = "/opt/chef/bin/knife"
|
||||||
|
command = "test -x #{knife}"
|
||||||
|
|
||||||
|
if version != :latest
|
||||||
|
command << "&& #{knife} --version | grep 'Chef: #{version}'"
|
||||||
|
end
|
||||||
|
|
||||||
|
machine.communicate.test(command, sudo: true)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -67,6 +67,17 @@ module VagrantPlugins
|
||||||
require_relative "cap/redhat/chef_install"
|
require_relative "cap/redhat/chef_install"
|
||||||
Cap::Redhat::ChefInstall
|
Cap::Redhat::ChefInstall
|
||||||
end
|
end
|
||||||
|
|
||||||
|
guest_capability(:omnios, :chef_installed) do
|
||||||
|
require_relative "cap/omnios/chef_installed"
|
||||||
|
Cap::OmniOS::ChefInstalled
|
||||||
|
end
|
||||||
|
|
||||||
|
guest_capability(:omnios, :chef_install) do
|
||||||
|
require_relative "cap/omnios/chef_install"
|
||||||
|
Cap::OmniOS::ChefInstall
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -9,10 +9,37 @@ describe VagrantPlugins::HyperV::Config do
|
||||||
subject.finalize!
|
subject.finalize!
|
||||||
expect(subject.ip_address_timeout).to eq(180)
|
expect(subject.ip_address_timeout).to eq(180)
|
||||||
end
|
end
|
||||||
|
|
||||||
it "defaults to a number" do
|
it "defaults to a number" do
|
||||||
subject.finalize!
|
subject.finalize!
|
||||||
expect(subject.ip_address_timeout).to eq(120)
|
expect(subject.ip_address_timeout).to eq(120)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
describe "#vmname" do
|
||||||
|
it "can be set" do
|
||||||
|
subject.vmname = "test"
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.vmname).to eq("test")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
describe "#memory" do
|
||||||
|
it "can be set" do
|
||||||
|
subject.memory = 512
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.memory).to eq(512)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
describe "#maxmemory" do
|
||||||
|
it "can be set" do
|
||||||
|
subject.maxmemory = 1024
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.maxmemory).to eq(1024)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
describe "#cpus" do
|
||||||
|
it "can be set" do
|
||||||
|
subject.cpus = 2
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.cpus).to eq(2)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -50,6 +50,7 @@ VF
|
||||||
let(:generated_inventory_file) { File.join(generated_inventory_dir, 'vagrant_ansible_inventory') }
|
let(:generated_inventory_file) { File.join(generated_inventory_dir, 'vagrant_ansible_inventory') }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
|
Vagrant::Util::Platform.stub(solaris?: false)
|
||||||
subject.instance_variable_get(:@logger).stub(:debug?).and_return(false)
|
subject.instance_variable_get(:@logger).stub(:debug?).and_return(false)
|
||||||
|
|
||||||
machine.stub(ssh_info: ssh_info)
|
machine.stub(ssh_info: ssh_info)
|
||||||
|
@ -63,7 +64,7 @@ VF
|
||||||
#
|
#
|
||||||
|
|
||||||
def self.it_should_set_arguments_and_environment_variables(
|
def self.it_should_set_arguments_and_environment_variables(
|
||||||
expected_args_count = 6, expected_vars_count = 4, expected_host_key_checking = false, expected_transport_mode = "ssh")
|
expected_args_count = 7, expected_vars_count = 4, expected_host_key_checking = false, expected_transport_mode = "ssh")
|
||||||
|
|
||||||
it "sets implicit arguments in a specific order" do
|
it "sets implicit arguments in a specific order" do
|
||||||
expect(Vagrant::Util::Subprocess).to receive(:execute).with { |*args|
|
expect(Vagrant::Util::Subprocess).to receive(:execute).with { |*args|
|
||||||
|
@ -72,6 +73,7 @@ VF
|
||||||
expect(args[1]).to eq("--private-key=#{machine.ssh_info[:private_key_path][0]}")
|
expect(args[1]).to eq("--private-key=#{machine.ssh_info[:private_key_path][0]}")
|
||||||
expect(args[2]).to eq("--user=#{machine.ssh_info[:username]}")
|
expect(args[2]).to eq("--user=#{machine.ssh_info[:username]}")
|
||||||
expect(args[3]).to eq("--connection=ssh")
|
expect(args[3]).to eq("--connection=ssh")
|
||||||
|
expect(args[4]).to eq("--timeout=30")
|
||||||
|
|
||||||
inventory_count = args.count { |x| x =~ /^--inventory-file=.+$/ }
|
inventory_count = args.count { |x| x =~ /^--inventory-file=.+$/ }
|
||||||
expect(inventory_count).to be > 0
|
expect(inventory_count).to be > 0
|
||||||
|
@ -103,10 +105,11 @@ VF
|
||||||
cmd_opts = args.last
|
cmd_opts = args.last
|
||||||
|
|
||||||
if expected_host_key_checking
|
if expected_host_key_checking
|
||||||
expect(cmd_opts[:env]['ANSIBLE_SSH_ARGS']).to be_nil unless config.raw_arguments
|
expect(cmd_opts[:env]['ANSIBLE_SSH_ARGS']).to_not include("-o UserKnownHostsFile=/dev/null")
|
||||||
else
|
else
|
||||||
expect(cmd_opts[:env]['ANSIBLE_SSH_ARGS']).to include("-o UserKnownHostsFile=/dev/null")
|
expect(cmd_opts[:env]['ANSIBLE_SSH_ARGS']).to include("-o UserKnownHostsFile=/dev/null")
|
||||||
end
|
end
|
||||||
|
expect(cmd_opts[:env]['ANSIBLE_SSH_ARGS']).to include("-o IdentitiesOnly=yes")
|
||||||
expect(cmd_opts[:env]['ANSIBLE_FORCE_COLOR']).to eql("true")
|
expect(cmd_opts[:env]['ANSIBLE_FORCE_COLOR']).to eql("true")
|
||||||
expect(cmd_opts[:env]['ANSIBLE_HOST_KEY_CHECKING']).to eql(expected_host_key_checking.to_s)
|
expect(cmd_opts[:env]['ANSIBLE_HOST_KEY_CHECKING']).to eql(expected_host_key_checking.to_s)
|
||||||
expect(cmd_opts[:env]['PYTHONUNBUFFERED']).to eql(1)
|
expect(cmd_opts[:env]['PYTHONUNBUFFERED']).to eql(1)
|
||||||
|
@ -270,7 +273,7 @@ VF
|
||||||
config.host_key_checking = true
|
config.host_key_checking = true
|
||||||
end
|
end
|
||||||
|
|
||||||
it_should_set_arguments_and_environment_variables 6, 3, true
|
it_should_set_arguments_and_environment_variables 7, 4, true
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "with boolean (flag) options disabled" do
|
describe "with boolean (flag) options disabled" do
|
||||||
|
@ -282,7 +285,7 @@ VF
|
||||||
config.sudo_user = 'root'
|
config.sudo_user = 'root'
|
||||||
end
|
end
|
||||||
|
|
||||||
it_should_set_arguments_and_environment_variables 7
|
it_should_set_arguments_and_environment_variables 8
|
||||||
it_should_set_optional_arguments({ "sudo_user" => "--sudo-user=root" })
|
it_should_set_optional_arguments({ "sudo_user" => "--sudo-user=root" })
|
||||||
|
|
||||||
it "it does not set boolean flag when corresponding option is set to false" do
|
it "it does not set boolean flag when corresponding option is set to false" do
|
||||||
|
@ -311,7 +314,7 @@ VF
|
||||||
"--new-arg=yeah"]
|
"--new-arg=yeah"]
|
||||||
end
|
end
|
||||||
|
|
||||||
it_should_set_arguments_and_environment_variables 17, 4, false, "paramiko"
|
it_should_set_arguments_and_environment_variables 18, 4, false, "paramiko"
|
||||||
|
|
||||||
it "sets all raw arguments" do
|
it "sets all raw arguments" do
|
||||||
expect(Vagrant::Util::Subprocess).to receive(:execute).with { |*args|
|
expect(Vagrant::Util::Subprocess).to receive(:execute).with { |*args|
|
||||||
|
@ -367,7 +370,7 @@ VF
|
||||||
config.ask_vault_pass = true
|
config.ask_vault_pass = true
|
||||||
end
|
end
|
||||||
|
|
||||||
it_should_set_arguments_and_environment_variables 7
|
it_should_set_arguments_and_environment_variables 8
|
||||||
|
|
||||||
it "should ask the vault password" do
|
it "should ask the vault password" do
|
||||||
expect(Vagrant::Util::Subprocess).to receive(:execute).with { |*args|
|
expect(Vagrant::Util::Subprocess).to receive(:execute).with { |*args|
|
||||||
|
@ -381,7 +384,7 @@ VF
|
||||||
config.vault_password_file = existing_file
|
config.vault_password_file = existing_file
|
||||||
end
|
end
|
||||||
|
|
||||||
it_should_set_arguments_and_environment_variables 7
|
it_should_set_arguments_and_environment_variables 8
|
||||||
|
|
||||||
it "uses the given vault password file" do
|
it "uses the given vault password file" do
|
||||||
expect(Vagrant::Util::Subprocess).to receive(:execute).with { |*args|
|
expect(Vagrant::Util::Subprocess).to receive(:execute).with { |*args|
|
||||||
|
@ -395,7 +398,7 @@ VF
|
||||||
config.raw_ssh_args = ['-o ControlMaster=no', '-o ForwardAgent=no']
|
config.raw_ssh_args = ['-o ControlMaster=no', '-o ForwardAgent=no']
|
||||||
end
|
end
|
||||||
|
|
||||||
it_should_set_arguments_and_environment_variables 6, 4
|
it_should_set_arguments_and_environment_variables 7, 4
|
||||||
it_should_explicitly_enable_ansible_ssh_control_persist_defaults
|
it_should_explicitly_enable_ansible_ssh_control_persist_defaults
|
||||||
|
|
||||||
it "passes custom SSH options via ANSIBLE_SSH_ARGS with the highest priority" do
|
it "passes custom SSH options via ANSIBLE_SSH_ARGS with the highest priority" do
|
||||||
|
@ -429,7 +432,7 @@ VF
|
||||||
ssh_info[:private_key_path] = ['/path/to/my/key', '/an/other/identity', '/yet/an/other/key']
|
ssh_info[:private_key_path] = ['/path/to/my/key', '/an/other/identity', '/yet/an/other/key']
|
||||||
end
|
end
|
||||||
|
|
||||||
it_should_set_arguments_and_environment_variables 6, 4
|
it_should_set_arguments_and_environment_variables 7, 4
|
||||||
it_should_explicitly_enable_ansible_ssh_control_persist_defaults
|
it_should_explicitly_enable_ansible_ssh_control_persist_defaults
|
||||||
|
|
||||||
it "passes additional Identity Files via ANSIBLE_SSH_ARGS" do
|
it "passes additional Identity Files via ANSIBLE_SSH_ARGS" do
|
||||||
|
@ -446,7 +449,7 @@ VF
|
||||||
ssh_info[:forward_agent] = true
|
ssh_info[:forward_agent] = true
|
||||||
end
|
end
|
||||||
|
|
||||||
it_should_set_arguments_and_environment_variables 6, 4
|
it_should_set_arguments_and_environment_variables 7, 4
|
||||||
it_should_explicitly_enable_ansible_ssh_control_persist_defaults
|
it_should_explicitly_enable_ansible_ssh_control_persist_defaults
|
||||||
|
|
||||||
it "enables SSH-Forwarding via ANSIBLE_SSH_ARGS" do
|
it "enables SSH-Forwarding via ANSIBLE_SSH_ARGS" do
|
||||||
|
@ -465,7 +468,7 @@ VF
|
||||||
|
|
||||||
it "shows the ansible-playbook command" do
|
it "shows the ansible-playbook command" do
|
||||||
expect(machine.env.ui).to receive(:detail).with { |full_command|
|
expect(machine.env.ui).to receive(:detail).with { |full_command|
|
||||||
expect(full_command).to eq("PYTHONUNBUFFERED=1 ANSIBLE_FORCE_COLOR=true ANSIBLE_HOST_KEY_CHECKING=false ANSIBLE_SSH_ARGS='-o UserKnownHostsFile=/dev/null -o ControlMaster=auto -o ControlPersist=60s' ansible-playbook --private-key=/path/to/my/key --user=testuser --connection=ssh --limit='machine1' --inventory-file=#{generated_inventory_dir} playbook.yml")
|
expect(full_command).to eq("PYTHONUNBUFFERED=1 ANSIBLE_FORCE_COLOR=true ANSIBLE_HOST_KEY_CHECKING=false ANSIBLE_SSH_ARGS='-o UserKnownHostsFile=/dev/null -o IdentitiesOnly=yes -o ControlMaster=auto -o ControlPersist=60s' ansible-playbook --private-key=/path/to/my/key --user=testuser --connection=ssh --timeout=30 --limit='machine1' --inventory-file=#{generated_inventory_dir} playbook.yml")
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -475,12 +478,12 @@ VF
|
||||||
config.verbose = 'v'
|
config.verbose = 'v'
|
||||||
end
|
end
|
||||||
|
|
||||||
it_should_set_arguments_and_environment_variables 7
|
it_should_set_arguments_and_environment_variables 8
|
||||||
it_should_set_optional_arguments({ "verbose" => "-v" })
|
it_should_set_optional_arguments({ "verbose" => "-v" })
|
||||||
|
|
||||||
it "shows the ansible-playbook command" do
|
it "shows the ansible-playbook command" do
|
||||||
expect(machine.env.ui).to receive(:detail).with { |full_command|
|
expect(machine.env.ui).to receive(:detail).with { |full_command|
|
||||||
expect(full_command).to eq("PYTHONUNBUFFERED=1 ANSIBLE_FORCE_COLOR=true ANSIBLE_HOST_KEY_CHECKING=false ANSIBLE_SSH_ARGS='-o UserKnownHostsFile=/dev/null -o ControlMaster=auto -o ControlPersist=60s' ansible-playbook --private-key=/path/to/my/key --user=testuser --connection=ssh --limit='machine1' --inventory-file=#{generated_inventory_dir} -v playbook.yml")
|
expect(full_command).to eq("PYTHONUNBUFFERED=1 ANSIBLE_FORCE_COLOR=true ANSIBLE_HOST_KEY_CHECKING=false ANSIBLE_SSH_ARGS='-o UserKnownHostsFile=/dev/null -o IdentitiesOnly=yes -o ControlMaster=auto -o ControlPersist=60s' ansible-playbook --private-key=/path/to/my/key --user=testuser --connection=ssh --timeout=30 --limit='machine1' --inventory-file=#{generated_inventory_dir} -v playbook.yml")
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -513,7 +516,7 @@ VF
|
||||||
config.raw_ssh_args = ['-o ControlMaster=no']
|
config.raw_ssh_args = ['-o ControlMaster=no']
|
||||||
end
|
end
|
||||||
|
|
||||||
it_should_set_arguments_and_environment_variables 20, 4, true
|
it_should_set_arguments_and_environment_variables 21, 4, true
|
||||||
it_should_explicitly_enable_ansible_ssh_control_persist_defaults
|
it_should_explicitly_enable_ansible_ssh_control_persist_defaults
|
||||||
it_should_set_optional_arguments({ "extra_vars" => "--extra-vars=@#{File.expand_path(__FILE__)}",
|
it_should_set_optional_arguments({ "extra_vars" => "--extra-vars=@#{File.expand_path(__FILE__)}",
|
||||||
"sudo" => "--sudo",
|
"sudo" => "--sudo",
|
||||||
|
@ -538,10 +541,84 @@ VF
|
||||||
|
|
||||||
it "shows the ansible-playbook command, with additional quotes when required" do
|
it "shows the ansible-playbook command, with additional quotes when required" do
|
||||||
expect(machine.env.ui).to receive(:detail).with { |full_command|
|
expect(machine.env.ui).to receive(:detail).with { |full_command|
|
||||||
expect(full_command).to eq("PYTHONUNBUFFERED=1 ANSIBLE_FORCE_COLOR=true ANSIBLE_HOST_KEY_CHECKING=true ANSIBLE_SSH_ARGS='-o IdentityFile=/my/key2 -o ForwardAgent=yes -o ControlMaster=no -o ControlMaster=auto -o ControlPersist=60s' ansible-playbook --private-key=/my/key1 --user=testuser --connection=ssh --limit='machine*:&vagrant:!that_one' --inventory-file=#{generated_inventory_dir} --extra-vars=@#{File.expand_path(__FILE__)} --sudo --sudo-user=deployer -vvv --ask-sudo-pass --ask-vault-pass --vault-password-file=#{File.expand_path(__FILE__)} --tags=db,www --skip-tags=foo,bar --start-at-task='an awesome task' --why-not --su-user=foot --ask-su-pass --limit='all' playbook.yml")
|
expect(full_command).to eq("PYTHONUNBUFFERED=1 ANSIBLE_FORCE_COLOR=true ANSIBLE_HOST_KEY_CHECKING=true ANSIBLE_SSH_ARGS='-o IdentitiesOnly=yes -o IdentityFile=/my/key2 -o ForwardAgent=yes -o ControlMaster=no -o ControlMaster=auto -o ControlPersist=60s' ansible-playbook --private-key=/my/key1 --user=testuser --connection=ssh --timeout=30 --limit='machine*:&vagrant:!that_one' --inventory-file=#{generated_inventory_dir} --extra-vars=@#{File.expand_path(__FILE__)} --sudo --sudo-user=deployer -vvv --ask-sudo-pass --ask-vault-pass --vault-password-file=#{File.expand_path(__FILE__)} --tags=db,www --skip-tags=foo,bar --start-at-task='an awesome task' --why-not --su-user=foot --ask-su-pass --limit='all' playbook.yml")
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
#
|
||||||
|
# Special cases related to the VM provider context
|
||||||
|
#
|
||||||
|
|
||||||
|
context "with Docker provider on a non-Linux host" do
|
||||||
|
|
||||||
|
let(:fake_host_ssh_info) {{
|
||||||
|
private_key_path: ['/path/to/docker/host/key'],
|
||||||
|
username: 'boot9docker',
|
||||||
|
host: '127.0.0.1',
|
||||||
|
port: 2299
|
||||||
|
}}
|
||||||
|
let(:fake_host_vm) {
|
||||||
|
double("host_vm").tap do |h|
|
||||||
|
h.stub(ssh_info: fake_host_ssh_info)
|
||||||
|
end
|
||||||
|
}
|
||||||
|
|
||||||
|
before do
|
||||||
|
machine.stub(provider_name: :docker)
|
||||||
|
machine.provider.stub(host_vm?: true)
|
||||||
|
machine.provider.stub(host_vm: fake_host_vm)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "uses an SSH ProxyCommand to reach the VM" do
|
||||||
|
expect(Vagrant::Util::Subprocess).to receive(:execute).with { |*args|
|
||||||
|
cmd_opts = args.last
|
||||||
|
expect(cmd_opts[:env]['ANSIBLE_SSH_ARGS']).to include("-o ProxyCommand='ssh boot9docker@127.0.0.1 -p 2299 -i /path/to/docker/host/key -o Compression=yes -o ConnectTimeout=5 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no exec nc %h %p 2>/dev/null'")
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
#
|
||||||
|
# Special cases related to the Vagrant Host operating system in use
|
||||||
|
#
|
||||||
|
|
||||||
|
context "with a Solaris-like host" do
|
||||||
|
before do
|
||||||
|
Vagrant::Util::Platform.stub(solaris?: true)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "does not set IdentitiesOnly=yes in ANSIBLE_SSH_ARGS" do
|
||||||
|
expect(Vagrant::Util::Subprocess).to receive(:execute).with { |*args|
|
||||||
|
cmd_opts = args.last
|
||||||
|
expect(cmd_opts[:env]['ANSIBLE_SSH_ARGS']).to_not include("-o IdentitiesOnly=yes")
|
||||||
|
|
||||||
|
# Note:
|
||||||
|
# The expectation below is a workaround to a possible misuse (or bug) in RSpec/Ruby stack.
|
||||||
|
# If 'args' variable is not required by in this block, the "Vagrant::Util::Subprocess).to receive"
|
||||||
|
# surprisingly expects to receive "no args".
|
||||||
|
# This problem can be "solved" by using args the "unnecessary" (but harmless) expectation below:
|
||||||
|
expect(true).to be_true
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "and with host_key_checking option enabled" do
|
||||||
|
it "does not set ANSIBLE_SSH_ARGS environment variable" do
|
||||||
|
config.host_key_checking = true
|
||||||
|
|
||||||
|
expect(Vagrant::Util::Subprocess).to receive(:execute).with { |*args|
|
||||||
|
cmd_opts = args.last
|
||||||
|
expect(cmd_opts[:env]).to_not include('ANSIBLE_SSH_ARGS')
|
||||||
|
|
||||||
|
# Note:
|
||||||
|
# The expectation below is a workaround to a possible misuse (or bug) in RSpec/Ruby stack.
|
||||||
|
# If 'args' variable is not required by in this block, the "Vagrant::Util::Subprocess).to receive"
|
||||||
|
# surprisingly expects to receive "no args".
|
||||||
|
# This problem can be "solved" by using args the "unnecessary" (but harmless) expectation below:
|
||||||
|
expect(true).to be_true
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -8,6 +8,15 @@ sidebar_current: "hyperv-configuration"
|
||||||
The Hyper-V provider has some provider-specific configuration options
|
The Hyper-V provider has some provider-specific configuration options
|
||||||
you may set. A complete reference is shown below:
|
you may set. A complete reference is shown below:
|
||||||
|
|
||||||
|
* `vmname` (string) - Name of virtual mashine as shown in Hyper-V manager.
|
||||||
|
Defaults is taken from box image XML.
|
||||||
|
* `cpus` (integer) - Number of virtual CPU given to mashine.
|
||||||
|
Defaults is taken from box image XML.
|
||||||
|
* `memory` (integer) - Number of MegaBytes allocated to VM at startup.
|
||||||
|
Defaults is taken from box image XML.
|
||||||
|
* `maxmemory` (integer) - Number of MegaBytes maximal allowed to allocate for VM
|
||||||
|
This parameter is switch on Dynamic Allocation of memory.
|
||||||
|
Defaults is taken from box image XML.
|
||||||
* `ip_address_timeout` (integer) - The time in seconds to wait for the
|
* `ip_address_timeout` (integer) - The time in seconds to wait for the
|
||||||
virtual machine to report an IP address. This defaults to 120 seconds.
|
virtual machine to report an IP address. This defaults to 120 seconds.
|
||||||
This may have to be increased if your VM takes longer to boot.
|
This may have to be increased if your VM takes longer to boot.
|
||||||
|
|
|
@ -33,30 +33,30 @@ a single page of documentation.
|
||||||
## Inventory File
|
## Inventory File
|
||||||
|
|
||||||
When using Ansible, it needs to know on which machines a given playbook should run. It does
|
When using Ansible, it needs to know on which machines a given playbook should run. It does
|
||||||
this by way of an [inventory](http://docs.ansible.com/intro_inventory.html) file which lists those machines. In the context of Vagrant,
|
this by way of an [inventory](http://docs.ansible.com/intro_inventory.html) file which lists those machines.
|
||||||
there are two ways to approach working with inventory files.
|
In the context of Vagrant, there are two ways to approach working with inventory files.
|
||||||
|
|
||||||
|
### Auto-Generated Inventory
|
||||||
|
|
||||||
The first and simplest option is to not provide one to Vagrant at all. Vagrant will generate an
|
The first and simplest option is to not provide one to Vagrant at all. Vagrant will generate an
|
||||||
inventory file encompassing all of the virtual machines it manages, and use it for provisioning
|
inventory file encompassing all of the virtual machines it manages, and use it for provisioning
|
||||||
machines. The generated inventory file is stored as part of your local Vagrant environment in `.vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory`.
|
machines. The generated inventory file is stored as part of your local Vagrant environment in `.vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory`.
|
||||||
|
|
||||||
The `ansible.groups` option can be used to pass a hash of group
|
**Groups of Hosts**
|
||||||
names and group members to be included in the generated inventory file. Group variables
|
|
||||||
are intentionally not supported, as this practice is not recommended.
|
The `ansible.groups` option can be used to pass a hash of group names and group members to be included in the generated inventory file.
|
||||||
For example:
|
|
||||||
|
With this configuration example:
|
||||||
|
|
||||||
```
|
```
|
||||||
ansible.groups = {
|
ansible.groups = {
|
||||||
"group1" => ["machine1"],
|
"group1" => ["machine1"],
|
||||||
"group2" => ["machine2", "machine3"],
|
"group2" => ["machine2"],
|
||||||
"all_groups:children" => ["group1", "group2", "group3"]
|
"all_groups:children" => ["group1", "group2"]
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Note that unmanaged machines and undefined groups are not added to the inventory.
|
Vagrant would generate an inventory file that might look like:
|
||||||
For example, `group3` in the above example would not be added to the inventory file.
|
|
||||||
|
|
||||||
A generated inventory might look like:
|
|
||||||
|
|
||||||
```
|
```
|
||||||
# Generated by Vagrant
|
# Generated by Vagrant
|
||||||
|
@ -75,6 +75,24 @@ group1
|
||||||
group2
|
group2
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**Notes**
|
||||||
|
|
||||||
|
* The generation of group variables blocks (e.g. `[group1:vars]`) are intentionally not supported, as it is [not recommended to store group variables in the main inventory file](http://docs.ansible.com/intro_inventory.html#splitting-out-host-and-group-specific-data). A good practice is to store these group (or host) variables in `YAML` files stored in `group_vars/` or `host_vars/` directories in the playbook (or inventory) directory.
|
||||||
|
* Unmanaged machines and undefined groups are not added to the inventory, to avoid useless Ansible errors (e.g. *unreachable host* or *undefined child group*)
|
||||||
|
|
||||||
|
For example, `machine3`, `group3` and `group1:vars` in the example below would not be added to the generated inventory file:
|
||||||
|
|
||||||
|
```
|
||||||
|
ansible.groups = {
|
||||||
|
"group1" => ["machine1"],
|
||||||
|
"group2" => ["machine2", "machine3"],
|
||||||
|
"all_groups:children" => ["group1", "group2", "group3"],
|
||||||
|
"group1:vars" => { "variable1" => 9, "variable2" => "example" }
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Static Inventory
|
||||||
|
|
||||||
The second option is for situations where you'd like to have more control over the inventory management.
|
The second option is for situations where you'd like to have more control over the inventory management.
|
||||||
With the `ansible.inventory_path` option, you can reference a specific inventory resource (e.g. a static inventory file, a [dynamic inventory script](http://docs.ansible.com/intro_dynamic_inventory.html) or even [multiple inventories stored in the same directory](http://docs.ansible.com/intro_dynamic_inventory.html#using-multiple-inventory-sources)). Vagrant will then use this inventory information instead of generating it.
|
With the `ansible.inventory_path` option, you can reference a specific inventory resource (e.g. a static inventory file, a [dynamic inventory script](http://docs.ansible.com/intro_dynamic_inventory.html) or even [multiple inventories stored in the same directory](http://docs.ansible.com/intro_dynamic_inventory.html#using-multiple-inventory-sources)). Vagrant will then use this inventory information instead of generating it.
|
||||||
|
|
||||||
|
@ -90,8 +108,10 @@ Where the above IP address is one set in your Vagrantfile:
|
||||||
config.vm.network :private_network, ip: "192.168.111.222"
|
config.vm.network :private_network, ip: "192.168.111.222"
|
||||||
```
|
```
|
||||||
|
|
||||||
Note that machine names in `Vagrantfile` and `ansible.inventory_path` file should correspond,
|
**Notes:**
|
||||||
unless you use `ansible.limit` option to reference the correct machines.
|
|
||||||
|
* The machine names in `Vagrantfile` and `ansible.inventory_path` files should correspond, unless you use `ansible.limit` option to reference the correct machines.
|
||||||
|
* The SSH host addresses (and ports) must obviously be specified twice, in `Vagrantfile` and `ansible.inventory_path` files.
|
||||||
|
|
||||||
## Playbook
|
## Playbook
|
||||||
|
|
||||||
|
@ -207,6 +227,12 @@ by the sudo command.
|
||||||
Vagrant is designed to provision [multi-machine environments](/v2/multi-machine) in sequence, but the following configuration pattern can be used to take advantage of Ansible parallelism:
|
Vagrant is designed to provision [multi-machine environments](/v2/multi-machine) in sequence, but the following configuration pattern can be used to take advantage of Ansible parallelism:
|
||||||
|
|
||||||
```
|
```
|
||||||
|
# By default, Vagrant 1.7+ automatically inserts a different
|
||||||
|
# insecure keypair for each new VM created. The easiest way
|
||||||
|
# to use the same keypair for all the machines is to disable
|
||||||
|
# this feature and rely on the legacy insecure key.
|
||||||
|
config.ssh.insert_key = false
|
||||||
|
|
||||||
config.vm.define 'machine2' do |machine|
|
config.vm.define 'machine2' do |machine|
|
||||||
machine.vm.hostname = 'machine2'
|
machine.vm.hostname = 'machine2'
|
||||||
machine.vm.network "private_network", ip: "192.168.77.22"
|
machine.vm.network "private_network", ip: "192.168.77.22"
|
||||||
|
|
|
@ -81,7 +81,7 @@ permissions, use `"--rsync-path='sudo rsync'"` to run rsync with sudo on the gue
|
||||||
<pre class="prettyprint">
|
<pre class="prettyprint">
|
||||||
Vagrant.configure("2") do |config|
|
Vagrant.configure("2") do |config|
|
||||||
config.vm.synced_folder "bin", "/usr/local/bin", type: "rsync",
|
config.vm.synced_folder "bin", "/usr/local/bin", type: "rsync",
|
||||||
rsync__exclude: ".git/"
|
rsync__exclude: ".git/",
|
||||||
rsync__args: ["--verbose", "--rsync-path='sudo rsync'", "--archive", "--delete", "-z"]
|
rsync__args: ["--verbose", "--rsync-path='sudo rsync'", "--archive", "--delete", "-z"]
|
||||||
end
|
end
|
||||||
</pre>
|
</pre>
|
||||||
|
|
|
@ -5,36 +5,149 @@ sidebar_current: "vmware-installation"
|
||||||
|
|
||||||
# Installation
|
# Installation
|
||||||
|
|
||||||
The VMware provider is installed using
|
The Vagrant VMware provider can be installed using the standard plugin
|
||||||
[standard plugin installation procedures](/v2/plugins/usage.html).
|
installation procedure. VMware Fusion users should run:
|
||||||
In addition to installing the plugin, a license must be provided so that
|
|
||||||
it can be loaded properly.
|
|
||||||
|
|
||||||
To purchase a license, visit the [Vagrant VMware provider](http://www.vagrantup.com/vmware)
|
```text
|
||||||
page. After purchasing a license, a link to download it will be emailed
|
|
||||||
to you. Download this file.
|
|
||||||
|
|
||||||
Installing the plugin and license is easy using the `vagrant plugin`
|
|
||||||
interface. Both steps are shown below. Note that the plugin name is different
|
|
||||||
depending on the provider you're using. If you're using the Fusion provider,
|
|
||||||
it is `vagrant-vmware-fusion`. If you're using the Workstation provider,
|
|
||||||
it is `vagrant-vmware-workstation`.
|
|
||||||
|
|
||||||
```
|
|
||||||
$ vagrant plugin install vagrant-vmware-fusion
|
$ vagrant plugin install vagrant-vmware-fusion
|
||||||
...
|
|
||||||
$ vagrant plugin license vagrant-vmware-fusion license.lic
|
|
||||||
...
|
|
||||||
```
|
```
|
||||||
|
|
||||||
For licensing, the first parameter is the name of the plugin, which is
|
VMware Workstation users should run:
|
||||||
`vagrant-vmware-fusion` for the VMware Fusion provider, or `vagrant-vmware-workstation`
|
|
||||||
for the VMware Workstation provider. The second parameter is the path to the license itself.
|
|
||||||
|
|
||||||
You can verify the license is properly installed by running any
|
```text
|
||||||
Vagrant command, such as `vagrant plugin list`. The VMware
|
$ vagrant plugin install vagrant-vmware-workstation
|
||||||
provider will show an error message if you are missing a license or using an
|
```
|
||||||
invalid license.
|
|
||||||
|
|
||||||
If there are problems installing the plugin, please contact
|
For more information on plugin installation, please see the
|
||||||
[support](http://www.vagrantup.com/support.html).
|
[Vagrant plugin usage documentation](/v2/plugins/usage.html).
|
||||||
|
|
||||||
|
The Vagrant VMware plugins are commercial products provided by
|
||||||
|
[HashiCorp](https://www.hashicorp.com) and **require the purchase of a license**
|
||||||
|
to operate. To purchase a license, please visit the
|
||||||
|
[Vagrant VMware provider](http://www.vagrantup.com/vmware#buy-now) page. Upon
|
||||||
|
purchasing a license, you will receive a license file in your inbox. Download
|
||||||
|
this file and save it to a temporary location on your computer.
|
||||||
|
|
||||||
|
<div class="alert alert-block alert-warn">
|
||||||
|
<strong>Warning!</strong> You cannot use your VMware product license as a
|
||||||
|
Vagrant VMware plugin license. They are separate commercial products, each
|
||||||
|
requiring their own license.
|
||||||
|
</div>
|
||||||
|
|
||||||
|
After installing the correct Vagrant VMware product plugin for your system, you
|
||||||
|
will need to install the license. For VMware Fusion users:
|
||||||
|
|
||||||
|
```text
|
||||||
|
$ vagrant plugin license vagrant-vmware-fusion ~/license.lic
|
||||||
|
```
|
||||||
|
|
||||||
|
For VMware Workstation users:
|
||||||
|
|
||||||
|
```text
|
||||||
|
$ vagrant plugin license vagrant-vmware-workstation ~/license.lic
|
||||||
|
```
|
||||||
|
|
||||||
|
The first parameter is the name of the plugin, and the second parameter is the
|
||||||
|
path to the license file on disk. Please be sure to replace `~/license.lic`
|
||||||
|
with the path where you temporarily saved the downloaded license file to disk.
|
||||||
|
After you have installed the plugin license, you may remove the temporary file.
|
||||||
|
|
||||||
|
To verify the license installation, run:
|
||||||
|
|
||||||
|
```text
|
||||||
|
$ vagrant plugin list
|
||||||
|
```
|
||||||
|
|
||||||
|
If the license is not installed correctly, you will see an error message.
|
||||||
|
|
||||||
|
|
||||||
|
## Frequently Asked Questions
|
||||||
|
|
||||||
|
**Q: I purchased a Vagrant VMware plugin license, but I did not receive an email?**<br>
|
||||||
|
First, please check your JUNK or SPAM folders. Since the license comes from an
|
||||||
|
automated system, it might have been flagged as spam by your email provider. If
|
||||||
|
you do not see the email there, please [contact support](mailto:support@hashicorp.com?subject=License Not Received)
|
||||||
|
and include the original order number.
|
||||||
|
|
||||||
|
**Q: Do you offer trial periods for the Vagrant VMware plugins?**<br>
|
||||||
|
We do not offer a trial mechanism at this time, but we do offer a 30-day, no
|
||||||
|
questions asked, 100% money-back guarantee. If you are not satisfied with the
|
||||||
|
product, contact us within 30 days and you will receive a full refund.
|
||||||
|
|
||||||
|
**Q: Do you offer educational discounts on the Vagrant VMware plugins?**<br>
|
||||||
|
A select number of educational discounts are available for students, staff, and
|
||||||
|
faculty. Please [contact support](mailto:support@hashicorp.com?subject=Educational Discounts&body=Hello support! I would like to learn more about educational discounts on the Vagrant VMware plugins. Thanks!) for more
|
||||||
|
information. You will be asked to verify your status as an employee of active
|
||||||
|
student.
|
||||||
|
|
||||||
|
**Q: Do I need to keep the Vagrant VMware plugin license file on disk?**<br>
|
||||||
|
After you have installed the Vagrant VMware plugin license, it is safe to remove
|
||||||
|
your copy from disk. Vagrant copies the license into its structure for reference
|
||||||
|
on boot.
|
||||||
|
|
||||||
|
**Q: I lost my original email, where can I download my Vagrant VMware plugin license again?**<br>
|
||||||
|
Please [contact support](mailto:support@hashicorp.com?subject=Lost My License&body=Hello support! I seem to have misplaced my Vagrant VMware license. Could you please send it to me? Thanks!). **Note:**
|
||||||
|
please contact support using the email address with which you made the
|
||||||
|
original purchase. If you use an alternate email, you will be asked to verify
|
||||||
|
that you are the owner of the requested license.
|
||||||
|
|
||||||
|
**Q: Where can I find the EULA for the Vagrant VMware plugins?**<br>
|
||||||
|
The [EULA for the Vagrant VMware plugins](http://www.vagrantup.com/vmware/eula)
|
||||||
|
is available on the Vagrant website.
|
||||||
|
|
||||||
|
**Q: Do you offer bulk/volume discounts for the Vagrant VMware plugins?**<br>
|
||||||
|
We certainly do! [Email support](mailto:support@hashicorp.com?subject=Bulk Discounts)
|
||||||
|
with the number of licenses you need and we can give you bulk pricing
|
||||||
|
information. Please note that bulk pricing requires the purchase of at least 150
|
||||||
|
seats.
|
||||||
|
|
||||||
|
**Q: I upgraded my VMware product and now my license is invalid?**<br>
|
||||||
|
The Vagrant VMware plugin licenses are valid for specific VMware product
|
||||||
|
versions at the time of purchase. When new versions of VMware products are
|
||||||
|
released, significant changes to the plugin code are often required to support
|
||||||
|
this new version. For this reason, you may need to upgrade your current license
|
||||||
|
to work with the new version of the VMware product. Customers can check their
|
||||||
|
license upgrade eligibility by visiting the [License Upgrade Center](http://license.hashicorp.com/upgrade/vmware2014)
|
||||||
|
and entering the email address with which they made the original purchase.
|
||||||
|
|
||||||
|
Your existing license will continue to work with all previous versions of the
|
||||||
|
VMware products. If you do not wish to update at this time, you can rollback
|
||||||
|
your VMware installation to an older version.
|
||||||
|
|
||||||
|
**Q: Why is the Vagrant VMware plugin not working with my trial version of VMware Fusion/Workstation?**<br>
|
||||||
|
The Vagrant VMware Fusion and Vagrant VMware Workstation plugins are not
|
||||||
|
compatible with trial versions of the VMware products. We apologize for the
|
||||||
|
inconvenience.
|
||||||
|
|
||||||
|
**Q: I accidentally bought the wrong Vagrant VMware plugin, can I switch?**<br>
|
||||||
|
Sure! Even though the Vagrant VMware Fusion plugin and the Vagrant VMware
|
||||||
|
Workstation plugin are different products, they are the same price and fall
|
||||||
|
under the same EULA. As such, we can transfer the license for you. Please
|
||||||
|
[contact support](mailto:support@hashicorp.com?subject=Transfer License).
|
||||||
|
|
||||||
|
**Q: Since each license comes with two "seats", can I use one seat for the Vagrant VMware Fusion plugin and one seat for the Vagrant VMware Workstation plugin?**<br>
|
||||||
|
Unfortunately this is not permitted. The Vagrant VMware Fusion plugin and the
|
||||||
|
Vagrant VMware Workstation plugin are separate products and cannot be shared in
|
||||||
|
this manner. We apologize for the inconvenience.
|
||||||
|
|
||||||
|
**Q: How do I upgrade my currently installed Vagrant VMware plugin?**<br>
|
||||||
|
You can update the Vagrant VMware plugin to the latest version by re-running the
|
||||||
|
install command. For VMware Fusion:
|
||||||
|
|
||||||
|
```text
|
||||||
|
$ vagrant plugin install vagrant-vmware-fusion
|
||||||
|
```
|
||||||
|
|
||||||
|
For VMWare Workstation:
|
||||||
|
|
||||||
|
```text
|
||||||
|
$ vagrant plugin install vagrant-vmware-workstation
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## Support
|
||||||
|
If you have any issues purchasing, installing, or using the Vagrant VMware
|
||||||
|
plugins, please [contact support](http://www.vagrantup.com/support.html). To
|
||||||
|
expedite the support process, please include the
|
||||||
|
[Vagrant debug output](/v2/other/debugging.html) as a Gist or pastebin if
|
||||||
|
applicable. This will help us more quickly diagnose your issue.
|
||||||
|
|
Loading…
Reference in New Issue