vagrant-bolt 0.1.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -9,12 +9,24 @@ class VagrantBolt::Config::Global < Vagrant.plugin('2', :config)
9
9
  # @return [String] The bolt working directory. Defaults to `.`
10
10
  attr_accessor :boltdir
11
11
 
12
+ # @!attribute [rw] host_key_check
13
+ # @return [String] If the connection should check the host key on the remote host (linux)
14
+ attr_accessor :connect_timeout
15
+
12
16
  # @!attribute [rw] host_key_check
13
17
  # @return [Boolean] If the connection should check the host key on the remote host (linux)
14
18
  attr_accessor :host_key_check
15
19
 
20
+ # @!attribute [rw] machine_alias
21
+ # @return [String] The alias of the machine to set in the bolt inventory
22
+ attr_accessor :machine_alias
23
+
24
+ # @!attribute [rw] machine_name
25
+ # @return [String] The name of the machine to set in the bolt inventory
26
+ attr_accessor :machine_name
27
+
16
28
  # @!attribute [rw] modulepath
17
- # @return [String] The path to the modules. Defaults to `modules`.
29
+ # @return [String] The path to the modules.
18
30
  attr_accessor :modulepath
19
31
 
20
32
  # @!attribute [rw] user
@@ -74,45 +86,60 @@ class VagrantBolt::Config::Global < Vagrant.plugin('2', :config)
74
86
  attr_accessor :features
75
87
 
76
88
  def initialize
77
- @bolt_exe = UNSET_VALUE
78
- @boltdir = UNSET_VALUE
79
- @host_key_check = UNSET_VALUE
80
- @modulepath = UNSET_VALUE
81
- @password = UNSET_VALUE
82
- @port = UNSET_VALUE
83
- @private_key = UNSET_VALUE
84
- @run_as = UNSET_VALUE
85
- @ssl = UNSET_VALUE
86
- @ssl_verify = UNSET_VALUE
87
- @sudo_password = UNSET_VALUE
88
- @tmpdir = UNSET_VALUE
89
- @user = UNSET_VALUE
90
- @verbose = UNSET_VALUE
91
- @debug = UNSET_VALUE
92
- @facts = UNSET_VALUE
93
- @vars = UNSET_VALUE
94
- @features = UNSET_VALUE
89
+ @bolt_exe = UNSET_VALUE
90
+ @boltdir = UNSET_VALUE
91
+ @connect_timeout = UNSET_VALUE
92
+ @host_key_check = UNSET_VALUE
93
+ @machine_alias = UNSET_VALUE
94
+ @machine_name = UNSET_VALUE
95
+ @modulepath = UNSET_VALUE
96
+ @password = UNSET_VALUE
97
+ @port = UNSET_VALUE
98
+ @private_key = UNSET_VALUE
99
+ @run_as = UNSET_VALUE
100
+ @ssl = UNSET_VALUE
101
+ @ssl_verify = UNSET_VALUE
102
+ @sudo_password = UNSET_VALUE
103
+ @tmpdir = UNSET_VALUE
104
+ @user = UNSET_VALUE
105
+ @verbose = UNSET_VALUE
106
+ @debug = UNSET_VALUE
107
+ @facts = UNSET_VALUE
108
+ @vars = UNSET_VALUE
109
+ @features = UNSET_VALUE
95
110
  end
96
111
 
97
112
  def finalize!
98
- @bolt_exe = 'bolt' if @bolt_exe == UNSET_VALUE
99
- @boltdir = '.' if @boltdir == UNSET_VALUE
100
- @host_key_check = nil if @host_key_check == UNSET_VALUE
101
- @modulepath = 'modules' if @modulepath == UNSET_VALUE
102
- @port = nil if @port == UNSET_VALUE
103
- @password = nil if @password == UNSET_VALUE
104
- @private_key = nil if @private_key == UNSET_VALUE
105
- @run_as = nil if @run_as == UNSET_VALUE
106
- @ssl = nil if @ssl == UNSET_VALUE
107
- @ssl_verify = nil if @ssl_verify == UNSET_VALUE
108
- @sudo_password = nil if @sudo_password == UNSET_VALUE
109
- @tmpdir = nil if @tmpdir == UNSET_VALUE
110
- @user = nil if @user == UNSET_VALUE
111
- @verbose = nil if @verbose == UNSET_VALUE
112
- @debug = nil if @debug == UNSET_VALUE
113
- @facts = nil if @facts == UNSET_VALUE
114
- @features = nil if @features == UNSET_VALUE
115
- @vars = nil if @vars == UNSET_VALUE
113
+ @bolt_exe = bolt_exe_path if @bolt_exe == UNSET_VALUE
114
+ @boltdir = '.' if @boltdir == UNSET_VALUE
115
+ @connect_timeout = nil if @connect_timeout == UNSET_VALUE
116
+ @host_key_check = nil if @host_key_check == UNSET_VALUE
117
+ @machine_alias = nil if @machine_alias == UNSET_VALUE
118
+ @machine_name = nil if @machine_name == UNSET_VALUE
119
+ @modulepath = nil if @modulepath == UNSET_VALUE
120
+ @port = nil if @port == UNSET_VALUE
121
+ @password = nil if @password == UNSET_VALUE
122
+ @private_key = nil if @private_key == UNSET_VALUE
123
+ @run_as = nil if @run_as == UNSET_VALUE
124
+ @ssl = nil if @ssl == UNSET_VALUE
125
+ @ssl_verify = nil if @ssl_verify == UNSET_VALUE
126
+ @sudo_password = nil if @sudo_password == UNSET_VALUE
127
+ @tmpdir = nil if @tmpdir == UNSET_VALUE
128
+ @user = nil if @user == UNSET_VALUE
129
+ @verbose = nil if @verbose == UNSET_VALUE
130
+ @debug = nil if @debug == UNSET_VALUE
131
+ @facts = nil if @facts == UNSET_VALUE
132
+ @features = nil if @features == UNSET_VALUE
133
+ @vars = nil if @vars == UNSET_VALUE
134
+ end
135
+
136
+ # Get the full path to the bolt executable
137
+ # @return [String] The path to the bolt exe
138
+ def bolt_exe_path
139
+ unless Vagrant::Util::Platform.windows?
140
+ return '/opt/puppetlabs/bin/bolt' if File.file?('/opt/puppetlabs/bin/bolt')
141
+ end
142
+ Vagrant::Util::Which.which('bolt') || 'bolt'
116
143
  end
117
144
 
118
145
  def validate(_machine)
@@ -127,10 +154,12 @@ class VagrantBolt::Config::Global < Vagrant.plugin('2', :config)
127
154
  group_objects = ['facts', 'features', 'vars']
128
155
  config = {}
129
156
  instance_variables_hash.each do |key, value|
130
- next if value.nil?
157
+ next if value.nil? || (value == UNSET_VALUE)
131
158
 
132
159
  if group_objects.include?(key)
133
160
  config[key] = value
161
+ elsif %r{machine_\w+}.match?(key)
162
+ config[key.sub('machine_', '')] = value
134
163
  else
135
164
  setting_map.each do |transport, settings|
136
165
  next unless settings.include?(key)
@@ -154,6 +183,7 @@ class VagrantBolt::Config::Global < Vagrant.plugin('2', :config)
154
183
  'run_as',
155
184
  'port',
156
185
  'private_key',
186
+ 'connect_timeout',
157
187
  'host_key_check',
158
188
  'sudo_password',
159
189
  'tmpdir',
@@ -20,12 +20,24 @@ class VagrantBolt::ConfigBuilder::Config < ConfigBuilder::Model::Base
20
20
  # @return [Boolean] Shows debug logging
21
21
  def_model_attribute :debug
22
22
 
23
+ # @!attribute [rw] connect_timeout
24
+ # @return [String] The timeout for the ssh connection (linux)
25
+ def_model_attribute :connect_timeout
26
+
23
27
  # @!attribute [rw] host_key_check
24
28
  # @return [Boolean] If the connection should check the host key on the remote host (linux)
25
29
  def_model_attribute :host_key_check
26
30
 
31
+ # @!attribute [rw] machine_alias
32
+ # @return [String] The alias of the machine to set in the bolt inventory
33
+ def_model_attribute :machine_alias
34
+
35
+ # @!attribute [rw] machine_name
36
+ # @return [String] The name of the machine to set in the bolt inventory
37
+ def_model_attribute :machine_name
38
+
27
39
  # @!attribute [rw] modulepath
28
- # @return [String] The path to the modules. Defaults to `modules`.
40
+ # @return [String] The path to the modules.
29
41
  def_model_attribute :modulepath
30
42
 
31
43
  # @!attribute [rw] name
@@ -33,21 +45,23 @@ class VagrantBolt::ConfigBuilder::Config < ConfigBuilder::Model::Base
33
45
  def_model_attribute :name
34
46
 
35
47
  # @!attribute [rw] nodes
48
+ # DEPRECATED. Use `targets` instead.
36
49
  # Note: The `node_list` will override this setting.
37
50
  # @return [Array<String, Symbol>, "ALL"] The nodes to run the task or plan on.
38
51
  # Valid values are an array of machine names or the string "ALL".
39
52
  def_model_attribute :nodes
40
53
 
41
54
  # @!attribute [rw] excludes
42
- # Note: The `node_list` will override this setting.
43
- # Note: This will be merged with `nodes`, with `excludes` taking precidence.
44
- # @return [Array<String, Symbol>] The nodes to exclude from running this task or plan on.
55
+ # Note: The `target_list` will override this setting.
56
+ # Note: This will be merged with `targets`, with `excludes` taking precidence.
57
+ # @return [Array<String, Symbol>] The targets to exclude from running this task or plan on.
45
58
  # Valid values are an array of machine names.
46
59
  def_model_attribute :excludes
47
60
 
48
61
  # @!attribute [rw] node_list
62
+ # DEPRECATED. Use `target_list` instead.
49
63
  # This setting overrides `nodes` and needs to be in the `protocol://ipaddress:port` URI format
50
- # @return [String] The bolt node list. This defaults to the currnet node.
64
+ # @return [String] The bolt node list. This defaults to the current node.
51
65
  def_model_attribute :node_list
52
66
 
53
67
  # @!attribute [rw] noop
@@ -94,6 +108,17 @@ class VagrantBolt::ConfigBuilder::Config < ConfigBuilder::Model::Base
94
108
  # @return [Boolean] If the connection should verify SSL on with WinRM (Windows)
95
109
  def_model_attribute :ssl_verify
96
110
 
111
+ # @!attribute [rw] targets
112
+ # Note: The `target_list` will override this setting.
113
+ # @return [Array<String, Symbol>, "ALL"] The targets to run the task or plan on.
114
+ # Valid values are an array of machine names or the string "ALL".
115
+ def_model_attribute :targets
116
+
117
+ # @!attribute [rw] target_list
118
+ # This setting overrides `targets` and needs to be in the `protocol://ipaddress:port` URI format
119
+ # @return [String] The bolt target list. This defaults to the current target.
120
+ def_model_attribute :target_list
121
+
97
122
  # @!attribute [rw] tmpdir
98
123
  # @return [String] The directory to upload and execute temporary files on the target
99
124
  def_model_attribute :tmpdir
@@ -118,32 +143,37 @@ class VagrantBolt::ConfigBuilder::Config < ConfigBuilder::Model::Base
118
143
  def to_proc
119
144
  proc do |config|
120
145
  bolt = config.bolt
121
- with_attr(:args) { |val| bolt.args = val }
122
- with_attr(:bolt_exe) { |val| bolt.bolt_exe = val }
123
- with_attr(:command) { |val| bolt.command = val }
124
- with_attr(:boltdir) { |val| bolt.boltdir = val }
125
- with_attr(:debug) { |val| bolt.debug = val }
126
- with_attr(:host_key_check) { |val| bolt.host_key_check = val }
127
- with_attr(:modulepath) { |val| bolt.modulepath = val }
128
- with_attr(:name) { |val| bolt.name = val }
129
- with_attr(:nodes) { |val| bolt.nodes = val }
130
- with_attr(:noop) { |val| bolt.noop = val }
131
- with_attr(:excludes) { |val| bolt.excludes = val }
132
- with_attr(:node_list) { |val| bolt.node_list = val }
133
- with_attr(:params) { |val| bolt.params = val }
134
- with_attr(:user) { |val| bolt.user = val }
135
- with_attr(:password) { |val| bolt.password = val }
136
- with_attr(:port) { |val| bolt.port = val }
137
- with_attr(:private_key) { |val| bolt.private_key = val }
138
- with_attr(:run_as) { |val| bolt.run_as = val }
139
- with_attr(:sudo_password) { |val| bolt.sudo_password = val }
140
- with_attr(:ssl) { |val| bolt.ssl = val }
141
- with_attr(:ssl_verify) { |val| bolt.ssl_verify = val }
142
- with_attr(:tmpdir) { |val| bolt.tmpdir = val }
143
- with_attr(:verbose) { |val| bolt.verbose = val }
144
- with_attr(:facts) { |val| bolt.facts = val }
145
- with_attr(:features) { |val| bolt.features = val }
146
- with_attr(:vars) { |val| bolt.vars = val }
146
+ with_attr(:args) { |val| bolt.args = val }
147
+ with_attr(:bolt_exe) { |val| bolt.bolt_exe = val }
148
+ with_attr(:command) { |val| bolt.command = val }
149
+ with_attr(:boltdir) { |val| bolt.boltdir = val }
150
+ with_attr(:debug) { |val| bolt.debug = val }
151
+ with_attr(:connect_timeout) { |val| bolt.connect_timeout = val }
152
+ with_attr(:host_key_check) { |val| bolt.host_key_check = val }
153
+ with_attr(:machine_alias) { |val| bolt.machine_alias = val }
154
+ with_attr(:machine_name) { |val| bolt.machine_name = val }
155
+ with_attr(:modulepath) { |val| bolt.modulepath = val }
156
+ with_attr(:name) { |val| bolt.name = val }
157
+ with_attr(:nodes) { |val| bolt.nodes = val }
158
+ with_attr(:noop) { |val| bolt.noop = val }
159
+ with_attr(:excludes) { |val| bolt.excludes = val }
160
+ with_attr(:node_list) { |val| bolt.node_list = val }
161
+ with_attr(:params) { |val| bolt.params = val }
162
+ with_attr(:user) { |val| bolt.user = val }
163
+ with_attr(:password) { |val| bolt.password = val }
164
+ with_attr(:port) { |val| bolt.port = val }
165
+ with_attr(:private_key) { |val| bolt.private_key = val }
166
+ with_attr(:run_as) { |val| bolt.run_as = val }
167
+ with_attr(:sudo_password) { |val| bolt.sudo_password = val }
168
+ with_attr(:ssl) { |val| bolt.ssl = val }
169
+ with_attr(:ssl_verify) { |val| bolt.ssl_verify = val }
170
+ with_attr(:targets) { |val| bolt.targets = val }
171
+ with_attr(:target_list) { |val| bolt.target_list = val }
172
+ with_attr(:tmpdir) { |val| bolt.tmpdir = val }
173
+ with_attr(:verbose) { |val| bolt.verbose = val }
174
+ with_attr(:facts) { |val| bolt.facts = val }
175
+ with_attr(:features) { |val| bolt.features = val }
176
+ with_attr(:vars) { |val| bolt.vars = val }
147
177
  end
148
178
  end
149
179
  # rubocop:enable Metrics/BlockLength
@@ -29,7 +29,7 @@ module VagrantBolt::ConfigBuilder::MonkeyPatches
29
29
 
30
30
  def eval_bolt_triggers_root(vm_root_config)
31
31
  # Configure the vm bolt object if the options exist
32
- triggers = attr(:bolt_triggers) || [] # rubocop:disable Style/Attr
32
+ triggers = attr(:bolt_triggers) || []
33
33
  triggers.each do |config|
34
34
  f = VagrantBolt::ConfigBuilder::Triggers.new_from_hash(config)
35
35
  f.call(vm_root_config)
@@ -20,12 +20,24 @@ class VagrantBolt::ConfigBuilder::Provisioner < ConfigBuilder::Model::Provisione
20
20
  # @return [Boolean] Shows debug logging
21
21
  def_model_attribute :debug
22
22
 
23
+ # @!attribute [rw] connect_timeout
24
+ # @return [String] The ssh connection timeout (linux)
25
+ def_model_attribute :connect_timeout
26
+
23
27
  # @!attribute [rw] host_key_check
24
28
  # @return [Boolean] If the connection should check the host key on the remote host (linux)
25
29
  def_model_attribute :host_key_check
26
30
 
31
+ # @!attribute [rw] machine_alias
32
+ # @return [String] The alias of the machine to set in the bolt inventory
33
+ def_model_attribute :machine_alias
34
+
35
+ # @!attribute [rw] machine_name
36
+ # @return [String] The name of the machine to set in the bolt inventory
37
+ def_model_attribute :machine_name
38
+
27
39
  # @!attribute [rw] modulepath
28
- # @return [String] The path to the modules. Defaults to `modules`.
40
+ # @return [String] The path to the modules.
29
41
  def_model_attribute :modulepath
30
42
 
31
43
  # @!attribute [rw] name
@@ -33,6 +45,7 @@ class VagrantBolt::ConfigBuilder::Provisioner < ConfigBuilder::Model::Provisione
33
45
  def_model_attribute :name
34
46
 
35
47
  # @!attribute [rw] nodes
48
+ # DEPRECATED. Use `targets` instead.
36
49
  # Note: The `node_list` will override this setting.
37
50
  # @return [Array<String, Symbol>, "ALL"] The nodes to run the task or plan on.
38
51
  # Valid values are an array of machine names or the string "ALL".
@@ -43,9 +56,9 @@ class VagrantBolt::ConfigBuilder::Provisioner < ConfigBuilder::Model::Provisione
43
56
  def_model_attribute :noop
44
57
 
45
58
  # @!attribute [rw] excludes
46
- # Note: The `node_list` will override this setting.
47
- # Note: This will be merged with `nodes`, with `excludes` taking precidence.
48
- # @return [Array<String, Symbol>] The nodes to exclude from running this task or plan on.
59
+ # Note: The `target_list` will override this setting.
60
+ # Note: This will be merged with `targets`, with `excludes` taking precidence.
61
+ # @return [Array<String, Symbol>] The targets to exclude from running this task or plan on.
49
62
  # Valid values are an array of machine names.
50
63
  def_model_attribute :excludes
51
64
 
@@ -94,6 +107,17 @@ class VagrantBolt::ConfigBuilder::Provisioner < ConfigBuilder::Model::Provisione
94
107
  # @return [Boolean] If the connection should verify SSL on with WinRM (Windows)
95
108
  def_model_attribute :ssl_verify
96
109
 
110
+ # @!attribute [rw] targets
111
+ # Note: The `target_list` will override this setting.
112
+ # @return [Array<String, Symbol>, "ALL"] The targets to run the task or plan on.
113
+ # Valid values are an array of machine names or the string "ALL".
114
+ def_model_attribute :targets
115
+
116
+ # @!attribute [rw] target_list
117
+ # This setting overrides `targets` and needs to be in the `protocol://ipaddress:port` URI format
118
+ # @return [String] The bolt target list. This defaults to the current target.
119
+ def_model_attribute :target_list
120
+
97
121
  # @!attribute [rw] tmpdir
98
122
  # @return [String] The directory to upload and execute temporary files on the target
99
123
  def_model_attribute :tmpdir
@@ -16,12 +16,12 @@ class VagrantBolt::Runner
16
16
  # @param [Symbol, String] command The command of bolt to run; task or plan
17
17
  # @param [String] name The name of the bolt task or plan to run
18
18
  # @param [Hash] args A optional hash of bolt config overrides. No merging will be done with the overrides
19
- # @example run('task', 'facts', {node_list: "machinename"})
19
+ # @example run('task', 'facts', {targets: ["machinename"]})
20
20
  def run(command, name, **args)
21
21
  @boltconfig = setup_overrides(command, name, **args)
22
- # Don't run anything if there are nodes to run it on
23
- # TODO: Gate this in a more efficient manner. It is possible to run plans without a node list.
24
- return if @boltconfig.node_list.nil?
22
+ # Don't run anything if there are targets to run it on
23
+ # TODO: Gate this in a more efficient manner. It is possible to run plans without a target list.
24
+ return if @boltconfig.target_list.nil?
25
25
 
26
26
  @inventory_path = VagrantBolt::Util::Bolt.update_inventory_file(@env)
27
27
  validate
@@ -44,14 +44,14 @@ class VagrantBolt::Runner
44
44
  config = VagrantBolt::Util::Config.merge_config(config, @env.vagrantfile.config.bolt)
45
45
  # Add any additional arguments to the config object
46
46
  config.set_options(args) unless args.nil?
47
- # Configure the node_list based on the config
48
- config.node_list ||= [config.nodes - config.excludes].flatten.join(',') unless config.nodes.empty? || config.nodes.to_s.casecmp("all").zero?
49
- config.node_list ||= [VagrantBolt::Util::Machine.nodes_in_environment(@env).map(&:name) - config.excludes].flatten.join(',') if config.nodes.to_s.casecmp("all").zero?
50
- config.node_list ||= @machine.name.to_s unless config.excludes.include?(@machine.name.to_s)
47
+ # Configure the target_list based on the config
48
+ config.target_list ||= [config.targets - config.excludes].flatten.join(',') unless config.targets.empty? || config.targets.to_s.casecmp("all").zero?
49
+ config.target_list ||= [VagrantBolt::Util::Machine.machines_in_environment(@env).map(&:name) - config.excludes].flatten.join(',') if config.targets.to_s.casecmp("all").zero?
50
+ config.target_list ||= @machine.name.to_s unless config.excludes.include?(@machine.name.to_s)
51
51
 
52
52
  # Ensure these are absolute paths to allow for running vagrant commands outside of the root dir
53
- config.modulepath = VagrantBolt::Util::Config.full_path(config.modulepath, @env.root_path)
54
- config.boltdir = VagrantBolt::Util::Config.full_path(config.boltdir, @env.root_path)
53
+ config.modulepath = VagrantBolt::Util::Config.relative_path(config.modulepath, @env.root_path)
54
+ config.boltdir = VagrantBolt::Util::Config.relative_path(config.boltdir, @env.root_path)
55
55
 
56
56
  config
57
57
  end
@@ -36,7 +36,7 @@ module VagrantBolt::Util
36
36
  end
37
37
 
38
38
  command << "--inventoryfile \'#{inventory_path}\'" unless inventory_path.nil?
39
- command << "--nodes \'#{config.node_list}\'" unless config.node_list.nil?
39
+ command << "--targets \'#{config.target_list}\'" unless config.target_list.nil?
40
40
  command << config.args unless config.args.nil?
41
41
  command.flatten.join(" ")
42
42
  end
@@ -45,12 +45,12 @@ module VagrantBolt::Util
45
45
  # @param env [Object] The env object
46
46
  # @return [Hash] The hash of config options for the inventory.yaml
47
47
  def self.generate_inventory_hash(env)
48
- inventory = { 'nodes' => [] }
48
+ inventory = { 'version' => 2, 'targets' => [] }
49
49
  inventory.merge!(env.vagrantfile.config.bolt.inventory_config.compact)
50
- VagrantBolt::Util::Machine.nodes_in_environment(env).each do |vm|
50
+ VagrantBolt::Util::Machine.machines_in_environment(env).each do |vm|
51
51
  next unless VagrantBolt::Util::Machine.running?(vm)
52
52
 
53
- inventory['nodes'] << generate_node_hash(vm)
53
+ inventory['targets'] << generate_node_hash(vm)
54
54
  end
55
55
  inventory.compact
56
56
  end
@@ -64,18 +64,19 @@ module VagrantBolt::Util
64
64
  ssh_info = machine.ssh_info
65
65
  return node_hash if ssh_info.nil?
66
66
 
67
- node_hash['alias'] = machine.name.to_s
68
67
  machine_config = machine.config.bolt.inventory_config
69
68
  node_hash['config'] = {}
70
69
  transport = VagrantBolt::Util::Machine.windows?(machine) ? 'winrm' : 'ssh'
71
70
  node_hash['config'][transport] = machine_transport_hash(machine, machine_config, ssh_info).compact
72
71
  node_hash['config']['transport'] = transport
73
- node_hash['name'] = "#{transport}://#{ssh_info[:host]}:#{node_hash['config'][transport]['port']}"
72
+ node_hash['uri'] = "#{transport}://#{ssh_info[:host]}:#{node_hash['config'][transport]['port']}"
74
73
  machine_config.each do |key, value|
75
74
  next if key == 'config' || value.nil? || value.empty?
76
75
 
77
76
  node_hash[key] = value
78
77
  end
78
+ node_hash['name'] ||= machine.name.to_s
79
+ node_hash['alias'] = machine.name.to_s if node_hash['alias'].nil? && node_hash['name'] != machine.name.to_s
79
80
  node_hash.compact
80
81
  end
81
82
 
@@ -108,7 +109,7 @@ module VagrantBolt::Util
108
109
  # @param env [Object] The environment
109
110
  # @return [String] The path to the inventory file
110
111
  def self.inventory_file(env)
111
- File.join(env.local_data_path, 'bolt_inventory.yaml')
112
+ VagrantBolt::Util::Config.relative_path('bolt_inventory.yaml', env.local_data_path)
112
113
  end
113
114
 
114
115
  # Update and write the inventory file for the current running machines
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'pathname'
4
+
3
5
  module VagrantBolt::Util
4
6
  module Config
5
7
  # Config Utility Functions
@@ -30,14 +32,25 @@ module VagrantBolt::Util
30
32
  result
31
33
  end
32
34
 
33
- # Convert a path to the absolute path of the inventory if it is relative
35
+ # Convert a path to the absolute path if it is relative
34
36
  # @param path [String] The path to convert
35
37
  # @param root_path [Object] The root path to append
36
38
  # @return [String] The absolute path or nil if path is nil
37
39
  def self.full_path(path, root_path)
38
40
  return path if path.nil? || root_path.nil?
39
41
 
40
- %r{^/.*}.match?(path) ? path : "#{root_path}/#{path}"
42
+ (Pathname.new path).absolute? ? path : File.expand_path(path, root_path)
43
+ end
44
+
45
+ # Convert a path to the relative path from the current directory
46
+ # @param path [String] The path to convert
47
+ # @param root_path [Object] The root path to append
48
+ # @return [String] The relative path or nil if path is nil
49
+ def self.relative_path(path, root_path)
50
+ return path if path.nil?
51
+
52
+ absolute_path = Pathname.new full_path(path, root_path)
53
+ absolute_path.relative_path_from(Pathname.getwd).to_s
41
54
  end
42
55
  end
43
56
  end