Merge pull request #14 from vStone/feature/include_offline_boxes
Added option to include offline boxes in the hosts file.
This commit is contained in:
commit
ad1febbe27
|
@ -40,6 +40,10 @@ to true.
|
||||||
A machine's host name is defined by `config.vm.hostname`. If this is not
|
A machine's host name is defined by `config.vm.hostname`. If this is not
|
||||||
set, it falls back to the symbol defining the machine in the Vagrantfile.
|
set, it falls back to the symbol defining the machine in the Vagrantfile.
|
||||||
|
|
||||||
|
When using include_offline set to true, only boxes that are up or have a
|
||||||
|
private ip configured will be added to the hosts file. You will receive a
|
||||||
|
warning on skipped boxes.
|
||||||
|
|
||||||
In addition, the `hostmanager.aliases` configuration attribute can be used
|
In addition, the `hostmanager.aliases` configuration attribute can be used
|
||||||
to provide aliases for your host names.
|
to provide aliases for your host names.
|
||||||
|
|
||||||
|
@ -49,6 +53,7 @@ Example configuration:
|
||||||
Vagrant.configure("2") do |config|
|
Vagrant.configure("2") do |config|
|
||||||
config.hostmanager.enabled = true
|
config.hostmanager.enabled = true
|
||||||
config.hostmanager.ignore_private_ip = false
|
config.hostmanager.ignore_private_ip = false
|
||||||
|
config.hostmanager.include_offline = true
|
||||||
config.vm.define "example-box" do |node|
|
config.vm.define "example-box" do |node|
|
||||||
node.vm.hostname = "example-box-hostname"
|
node.vm.hostname = "example-box-hostname"
|
||||||
node.vm.network :private_network, ip: "192.168.42.42"
|
node.vm.network :private_network, ip: "192.168.42.42"
|
||||||
|
|
|
@ -4,13 +4,16 @@ module VagrantPlugins
|
||||||
attr_accessor :enabled
|
attr_accessor :enabled
|
||||||
attr_accessor :ignore_private_ip
|
attr_accessor :ignore_private_ip
|
||||||
attr_accessor :aliases
|
attr_accessor :aliases
|
||||||
|
attr_accessor :include_offline
|
||||||
|
|
||||||
alias_method :enabled?, :enabled
|
alias_method :enabled?, :enabled
|
||||||
|
alias_method :include_offline?, :include_offline
|
||||||
|
|
||||||
def initialize
|
def initialize
|
||||||
@enabled = false
|
@enabled = false
|
||||||
@ignore_private_ip = UNSET_VALUE
|
@ignore_private_ip = UNSET_VALUE
|
||||||
@aliases = Array.new
|
@aliases = Array.new
|
||||||
|
@include_offline = false
|
||||||
end
|
end
|
||||||
|
|
||||||
def finalize!
|
def finalize!
|
||||||
|
@ -24,6 +27,9 @@ module VagrantPlugins
|
||||||
# check if enabled option is either true or false
|
# check if enabled option is either true or false
|
||||||
errors << validate_bool('hostmanager.enabled', enabled)
|
errors << validate_bool('hostmanager.enabled', enabled)
|
||||||
|
|
||||||
|
# check if include_offline is either true or false
|
||||||
|
errors << validate_bool('hostmanager.include_offline', include_offline)
|
||||||
|
|
||||||
# check if ignore_private_ip option is either true or false (or UNSET_VALUE)
|
# check if ignore_private_ip option is either true or false (or UNSET_VALUE)
|
||||||
if @ignore_private_ip != UNSET_VALUE
|
if @ignore_private_ip != UNSET_VALUE
|
||||||
errors << validate_bool('hostmanager.ignore_private_ip', ignore_private_ip)
|
errors << validate_bool('hostmanager.ignore_private_ip', ignore_private_ip)
|
||||||
|
|
|
@ -17,20 +17,19 @@ module VagrantPlugins
|
||||||
next if ip
|
next if ip
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
ip || machine.ssh_info[:host]
|
ip || (machine.ssh_info ? machine.ssh_info[:host] : nil)
|
||||||
end
|
end
|
||||||
|
|
||||||
# create the temporary hosts file
|
# create the temporary hosts file
|
||||||
path = env.tmp_path.join('hosts')
|
path = env.tmp_path.join('hosts')
|
||||||
File.open(path, 'w') do |file|
|
File.open(path, 'w') do |file|
|
||||||
file << "127.0.0.1\tlocalhost\slocalhost.localdomain\n"
|
file << "127.0.0.1\tlocalhost\slocalhost.localdomain\n"
|
||||||
|
get_machines(env, provider).each do |name, p|
|
||||||
# add a hosts entry for each active machine matching the provider
|
|
||||||
env.active_machines.each do |name, p|
|
|
||||||
if provider == p
|
if provider == p
|
||||||
machines << machine = env.machine(name, provider)
|
machines << machine = env.machine(name, provider)
|
||||||
host = machine.config.vm.hostname || name
|
host = machine.config.vm.hostname || name
|
||||||
ip = get_ip_address.call(machine)
|
ip = get_ip_address.call(machine)
|
||||||
|
if ip
|
||||||
host_aliases = machine.config.hostmanager.aliases.join("\s").chomp
|
host_aliases = machine.config.hostmanager.aliases.join("\s").chomp
|
||||||
machine.env.ui.info I18n.t('vagrant_hostmanager.action.add_host', {
|
machine.env.ui.info I18n.t('vagrant_hostmanager.action.add_host', {
|
||||||
:ip => ip,
|
:ip => ip,
|
||||||
|
@ -38,10 +37,14 @@ module VagrantPlugins
|
||||||
:aliases => host_aliases,
|
:aliases => host_aliases,
|
||||||
})
|
})
|
||||||
file << "#{ip}\t#{host}\s#{host_aliases}\n"
|
file << "#{ip}\t#{host}\s#{host_aliases}\n"
|
||||||
|
else
|
||||||
|
machine.env.ui.warn I18n.t('vagrant_hostmanager.action.host_no_ip', {
|
||||||
|
:name => name,
|
||||||
|
})
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
machines
|
machines
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -57,6 +60,30 @@ module VagrantPlugins
|
||||||
machine.communicate.sudo("mv /tmp/hosts /etc/hosts")
|
machine.communicate.sudo("mv /tmp/hosts /etc/hosts")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
# Either use the active machines, or loop over all available machines and
|
||||||
|
# get those with the same provider (aka, ignore boxes that throw MachineNotFound errors).
|
||||||
|
#
|
||||||
|
# Returns an array with the same structure as env.active_machines:
|
||||||
|
# [ [:machine, :virtualbox], [:foo, :virtualbox] ]
|
||||||
|
def get_machines(env, provider)
|
||||||
|
if env.config_global.hostmanager.include_offline?
|
||||||
|
machines = []
|
||||||
|
env.machine_names.each do |name|
|
||||||
|
begin
|
||||||
|
m = env.machine(name, provider)
|
||||||
|
machines << [name, provider]
|
||||||
|
rescue Vagrant::Errors::MachineNotFound => ex
|
||||||
|
# ignore this box.
|
||||||
|
end
|
||||||
|
end
|
||||||
|
machines
|
||||||
|
else
|
||||||
|
env.active_machines
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -2,6 +2,7 @@ en:
|
||||||
vagrant_hostmanager:
|
vagrant_hostmanager:
|
||||||
action:
|
action:
|
||||||
add_host: "Adding /etc/hosts entry: %{ip} %{host} %{aliases}"
|
add_host: "Adding /etc/hosts entry: %{ip} %{host} %{aliases}"
|
||||||
|
host_no_ip: "Could not determine ip for machine '%{name}': no private ip configured or machine not up."
|
||||||
update: "[%{name}] Updating /etc/hosts file"
|
update: "[%{name}] Updating /etc/hosts file"
|
||||||
config:
|
config:
|
||||||
not_a_bool: "A value for %{config_key} can only be true or false, not type '%{value}'"
|
not_a_bool: "A value for %{config_key} can only be true or false, not type '%{value}'"
|
||||||
|
|
Loading…
Reference in New Issue