vagrant-hostmanager 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +17 -5
- data/lib/vagrant-hostmanager/action/update_hosts_file.rb +13 -48
- data/lib/vagrant-hostmanager/command.rb +29 -0
- data/lib/vagrant-hostmanager/config.rb +20 -0
- data/lib/vagrant-hostmanager/hosts_file.rb +57 -0
- data/lib/vagrant-hostmanager/plugin.rb +13 -3
- data/lib/vagrant-hostmanager/version.rb +1 -1
- data/locales/en.yml +2 -3
- data/test/test.sh +5 -4
- metadata +6 -2
data/README.md
CHANGED
@@ -11,19 +11,31 @@ The current implementation is a proof-of-concept supporting the larger
|
|
11
11
|
objective of using Vagrant as a cloud management interface for development
|
12
12
|
and production environments.
|
13
13
|
|
14
|
-
The plugin has been tested with Vagrant 1.1.
|
14
|
+
The plugin has been tested with Vagrant 1.1.5.
|
15
15
|
|
16
16
|
Installation
|
17
17
|
------------
|
18
18
|
Install the plugin following the typical Vagrant 1.1 procedure:
|
19
19
|
|
20
|
-
vagrant plugin install vagrant-hostmanager
|
20
|
+
$ vagrant plugin install vagrant-hostmanager
|
21
21
|
|
22
22
|
Usage
|
23
23
|
-----
|
24
|
-
|
25
|
-
|
26
|
-
|
24
|
+
To update the `/etc/hosts` file on each active machine, run the following
|
25
|
+
command:
|
26
|
+
|
27
|
+
$ vagrant hostmanager
|
28
|
+
|
29
|
+
The plugin may hook into the `vagrant up` and `vagrant destroy` commands
|
30
|
+
automatically to update the `/etc/hosts` file on each active machine that
|
31
|
+
is using the same provider. To enable this, add the following configuration
|
32
|
+
to your Vagrant file:
|
33
|
+
|
34
|
+
```ruby
|
35
|
+
Vagrant.configure('2') do |config|
|
36
|
+
config.hostmanager.auto_update = true
|
37
|
+
end
|
38
|
+
```
|
27
39
|
|
28
40
|
A machine's IP address is defined by either the static IP for a private
|
29
41
|
network configuration or by the SSH host configuration.
|
@@ -1,66 +1,31 @@
|
|
1
|
+
require 'vagrant-hostmanager/hosts_file'
|
2
|
+
|
1
3
|
module VagrantPlugins
|
2
4
|
module HostManager
|
3
5
|
module Action
|
4
6
|
class UpdateHostsFile
|
7
|
+
include HostsFile
|
8
|
+
|
5
9
|
def initialize(app, env)
|
6
|
-
@app
|
10
|
+
@app = app
|
11
|
+
@machine = env[:machine]
|
7
12
|
@translator = Helpers::Translator.new('action.update_hosts_file')
|
8
|
-
@logger =
|
13
|
+
@logger =
|
9
14
|
Log4r::Logger.new('vagrant_hostmanager::action::update')
|
10
15
|
end
|
11
16
|
|
12
17
|
def call(env)
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
# are using the same provider as the current one
|
18
|
-
matching_machines = []
|
19
|
-
entries = {}
|
20
|
-
entries['127.0.0.1'] = 'localhost'
|
21
|
-
global_env.active_machines.each do |name, provider|
|
22
|
-
if provider == current_provider
|
23
|
-
machine = global_env.machine(name, provider)
|
24
|
-
host = machine.config.vm.hostname || name
|
25
|
-
entries[get_ip_address(machine)] = host
|
26
|
-
matching_machines << machine
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
# generate hosts file
|
31
|
-
path = env[:tmp_path].join('hosts')
|
32
|
-
File.open(path, 'w') do |file|
|
33
|
-
entries.each_pair do |ip, host|
|
34
|
-
@logger.info "Adding /etc/hosts entry: #{ip} #{host}"
|
35
|
-
file << "#{ip}\t#{host}\n"
|
36
|
-
end
|
37
|
-
end
|
18
|
+
# check config to see if the hosts file should updated automatically
|
19
|
+
if @machine.config.hostmanager.auto_update
|
20
|
+
# generate temporary hosts file
|
21
|
+
machines = generate(@machine.env, @machine.provider_name)
|
38
22
|
|
39
|
-
|
40
|
-
|
41
|
-
matching_machines.each do |machine|
|
42
|
-
if machine.communicate.ready?
|
43
|
-
env[:ui].info @translator.t('update', { :name => machine.name })
|
44
|
-
machine.communicate.upload(path, '/tmp/hosts')
|
45
|
-
machine.communicate.sudo("mv /tmp/hosts /etc/hosts")
|
46
|
-
end
|
23
|
+
# update /etc/hosts file on each active machine
|
24
|
+
machines.each { |machine| update(machine) }
|
47
25
|
end
|
48
26
|
|
49
27
|
@app.call(env)
|
50
28
|
end
|
51
|
-
|
52
|
-
protected
|
53
|
-
|
54
|
-
def get_ip_address(machine)
|
55
|
-
ip = nil
|
56
|
-
machine.config.vm.networks.each do |network|
|
57
|
-
key, options = network[0], network[1]
|
58
|
-
ip = options[:ip] if key == :private_network
|
59
|
-
next if ip
|
60
|
-
end
|
61
|
-
|
62
|
-
ip || machine.ssh_info[:host]
|
63
|
-
end
|
64
29
|
end
|
65
30
|
end
|
66
31
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module HostManager
|
3
|
+
class Command < Vagrant.plugin('2', :command)
|
4
|
+
include HostsFile
|
5
|
+
|
6
|
+
def execute
|
7
|
+
options = {}
|
8
|
+
opts = OptionParser.new do |o|
|
9
|
+
o.banner = 'Usage: vagrant hostmanager [vm-name]'
|
10
|
+
o.separator ''
|
11
|
+
|
12
|
+
o.on('--provider provider', String,
|
13
|
+
'Update machines with the specific provider.') do |provider|
|
14
|
+
options[:provider] = provider
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
argv = parse_options(opts)
|
19
|
+
options[:provider] ||= @env.default_provider
|
20
|
+
|
21
|
+
generate(@env, options[:provider])
|
22
|
+
|
23
|
+
with_target_vms(argv[1..-1], :provider => options[:provider]) do |machine|
|
24
|
+
update(machine)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module HostManager
|
3
|
+
class Config < Vagrant.plugin('2', :config)
|
4
|
+
attr_accessor :auto_update
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@auto_update = false
|
8
|
+
end
|
9
|
+
|
10
|
+
def validate(machine)
|
11
|
+
errors = []
|
12
|
+
if !(!!@auto_update == @auto_update)
|
13
|
+
errors << 'auto_update must be a boolean'
|
14
|
+
end
|
15
|
+
|
16
|
+
{ 'hostmanager' => errors }
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module HostManager
|
3
|
+
module HostsFile
|
4
|
+
# Generate a hosts file containing the the active machines
|
5
|
+
# in the Vagrant environment backed by the specified provider.
|
6
|
+
# The file is written to the Vagrant temporary path.
|
7
|
+
def generate(env, provider)
|
8
|
+
machines = []
|
9
|
+
|
10
|
+
# define a lambda for looking up a machine's ip address
|
11
|
+
get_ip_address = lambda do |machine|
|
12
|
+
ip = nil
|
13
|
+
machine.config.vm.networks.each do |network|
|
14
|
+
key, options = network[0], network[1]
|
15
|
+
ip = options[:ip] if key == :private_network
|
16
|
+
next if ip
|
17
|
+
end
|
18
|
+
ip || machine.ssh_info[:host]
|
19
|
+
end
|
20
|
+
|
21
|
+
# create the temporary hosts file
|
22
|
+
path = env.tmp_path.join('hosts')
|
23
|
+
File.open(path, 'w') do |file|
|
24
|
+
file << "127.0.0.1\tlocalhost\n"
|
25
|
+
|
26
|
+
# add a hosts entry for each active machine matching the provider
|
27
|
+
env.active_machines.each do |name, p|
|
28
|
+
if provider == p
|
29
|
+
machines << machine = env.machine(name, provider)
|
30
|
+
host = machine.config.vm.hostname || name
|
31
|
+
ip = get_ip_address.call(machine)
|
32
|
+
@logger.info "Adding /etc/hosts entry: #{ip} #{host}"
|
33
|
+
file << "#{ip}\t#{host}\n"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
machines
|
39
|
+
end
|
40
|
+
|
41
|
+
# Copy the temporary hosts file to the specified machine overwritting
|
42
|
+
# the existing /etc/hosts file.
|
43
|
+
def update(machine)
|
44
|
+
path = machine.env.tmp_path.join('hosts')
|
45
|
+
if machine.communicate.ready?
|
46
|
+
machine.env.ui.info translator.t('update', { :name => machine.name })
|
47
|
+
machine.communicate.upload(path, '/tmp/hosts')
|
48
|
+
machine.communicate.sudo("mv /tmp/hosts /etc/hosts")
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def translator
|
53
|
+
Helpers::Translator.new('hosts_file')
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -10,16 +10,26 @@ module VagrantPlugins
|
|
10
10
|
created for each active machine using the hostname attribute.
|
11
11
|
DESC
|
12
12
|
|
13
|
-
|
13
|
+
def self.update(hook)
|
14
14
|
setup_i18n
|
15
15
|
setup_logging
|
16
16
|
hook.append(Action::UpdateHostsFile)
|
17
17
|
end
|
18
18
|
|
19
|
-
|
19
|
+
config(:hostmanager) do
|
20
|
+
require_relative 'config'
|
21
|
+
Config
|
22
|
+
end
|
23
|
+
|
24
|
+
action_hook(:hostmanager_up, :machine_action_up, &method(:update))
|
25
|
+
action_hook(:hostmanger_destroy, :machine_action_destroy, &method(:update))
|
26
|
+
|
27
|
+
# TODO remove duplication of i18n and logging setup
|
28
|
+
command(:hostmanager) do
|
20
29
|
setup_i18n
|
21
30
|
setup_logging
|
22
|
-
|
31
|
+
require_relative 'command'
|
32
|
+
Command
|
23
33
|
end
|
24
34
|
|
25
35
|
def self.setup_i18n
|
data/locales/en.yml
CHANGED
data/test/test.sh
CHANGED
@@ -6,12 +6,13 @@ vagrant ssh server1 -c 'cat /etc/hosts'
|
|
6
6
|
echo "[server2] /etc/hosts file:"
|
7
7
|
vagrant ssh server2 -c 'cat /etc/hosts'
|
8
8
|
|
9
|
-
vagrant
|
10
|
-
vagrant up
|
9
|
+
vagrant hostmanager
|
11
10
|
|
12
|
-
|
11
|
+
echo "[server1] /etc/hosts file:"
|
12
|
+
vagrant ssh server1 -c 'cat /etc/hosts'
|
13
13
|
echo "[server2] /etc/hosts file:"
|
14
14
|
vagrant ssh server2 -c 'cat /etc/hosts'
|
15
|
-
|
15
|
+
|
16
|
+
vagrant destroy -f
|
16
17
|
|
17
18
|
cd ..
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrant-hostmanager
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-04-
|
12
|
+
date: 2013-04-06 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: A Vagrant plugin that manages the /etc/hosts file within a multi-machine
|
15
15
|
environment
|
@@ -26,8 +26,11 @@ files:
|
|
26
26
|
- Rakefile
|
27
27
|
- lib/vagrant-hostmanager.rb
|
28
28
|
- lib/vagrant-hostmanager/action/update_hosts_file.rb
|
29
|
+
- lib/vagrant-hostmanager/command.rb
|
30
|
+
- lib/vagrant-hostmanager/config.rb
|
29
31
|
- lib/vagrant-hostmanager/errors.rb
|
30
32
|
- lib/vagrant-hostmanager/helpers/translator.rb
|
33
|
+
- lib/vagrant-hostmanager/hosts_file.rb
|
31
34
|
- lib/vagrant-hostmanager/plugin.rb
|
32
35
|
- lib/vagrant-hostmanager/version.rb
|
33
36
|
- locales/en.yml
|
@@ -62,3 +65,4 @@ summary: A Vagrant plugin that manages the /etc/hosts file within a multi-machin
|
|
62
65
|
test_files:
|
63
66
|
- test/Vagrantfile
|
64
67
|
- test/test.sh
|
68
|
+
has_rdoc:
|