Class: Bolt::Config

Inherits:
Struct
  • Object
show all
Defined in:
lib/bolt/config.rb

Constant Summary collapse

DEFAULTS =
{
  concurrency: 100,
  transport: 'ssh',
  format: 'human',
  modulepath: [],
  puppetdb: {},
  color: true
}.freeze
TRANSPORT_OPTIONS =
i[password run-as sudo-password extensions
private-key tty tmpdir user connect-timeout
cacert token-file service-url].freeze
TRANSPORT_DEFAULTS =
{
  'connect-timeout' => 10,
  'tty' => false
}.freeze
TRANSPORT_SPECIFIC_DEFAULTS =
{
  ssh: {
    'host-key-check' => true
  },
  winrm: {
    'ssl' => true,
    'ssl-verify' => true
  },
  pcp: {
    'task-environment' => 'production',
    'local-validation' => false
  },
  local: {}
}.freeze
BOLTDIR_NAME =
'Boltdir'

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(**kwargs) ⇒ Config

Returns a new instance of Config.



74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/bolt/config.rb', line 74

def initialize(**kwargs)
  super()
  @logger = Logging.logger[self]
  @pwd = kwargs.delete(:pwd)

  DEFAULTS.merge(kwargs).each { |k, v| self[k] = v }

  # add an entry for the default console logger
  self[:log] ||= {}
  self[:log]['console'] ||= {}

  self[:transports] ||= {}
  TRANSPORTS.each_key do |transport|
    self[:transports][transport] ||= {}

    TRANSPORT_DEFAULTS.each do |k, v|
      unless self[:transports][transport][k]
        self[:transports][transport][k] = v
      end
    end

    TRANSPORT_SPECIFIC_DEFAULTS[transport].each do |k, v|
      unless self[:transports][transport].key? k
        self[:transports][transport][k] = v
      end
    end
  end
end

Instance Attribute Details

#colorObject

Returns the value of attribute color

Returns:

  • (Object)

    the current value of color



26
27
28
# File 'lib/bolt/config.rb', line 26

def color
  @color
end

#concurrencyObject

Returns the value of attribute concurrency

Returns:

  • (Object)

    the current value of concurrency



26
27
28
# File 'lib/bolt/config.rb', line 26

def concurrency
  @concurrency
end

#formatObject

Returns the value of attribute format

Returns:

  • (Object)

    the current value of format



26
27
28
# File 'lib/bolt/config.rb', line 26

def format
  @format
end

#inventoryfileObject

Returns the value of attribute inventoryfile

Returns:

  • (Object)

    the current value of inventoryfile



26
27
28
# File 'lib/bolt/config.rb', line 26

def inventoryfile
  @inventoryfile
end

#logObject

Returns the value of attribute log

Returns:

  • (Object)

    the current value of log



26
27
28
# File 'lib/bolt/config.rb', line 26

def log
  @log
end

#modulepathObject

Returns the value of attribute modulepath

Returns:

  • (Object)

    the current value of modulepath



26
27
28
# File 'lib/bolt/config.rb', line 26

def modulepath
  @modulepath
end

#puppetdbObject

Returns the value of attribute puppetdb

Returns:

  • (Object)

    the current value of puppetdb



26
27
28
# File 'lib/bolt/config.rb', line 26

def puppetdb
  @puppetdb
end

#traceObject

Returns the value of attribute trace

Returns:

  • (Object)

    the current value of trace



26
27
28
# File 'lib/bolt/config.rb', line 26

def trace
  @trace
end

#transportObject

Returns the value of attribute transport

Returns:

  • (Object)

    the current value of transport



26
27
28
# File 'lib/bolt/config.rb', line 26

def transport
  @transport
end

#transportsObject

Returns the value of attribute transports

Returns:

  • (Object)

    the current value of transports



26
27
28
# File 'lib/bolt/config.rb', line 26

def transports
  @transports
end

Instance Method Details

#boltdirObject



164
165
166
# File 'lib/bolt/config.rb', line 164

def boltdir
  @boltdir ||= find_boltdir(pwd) || default_boltdir
end

#deep_cloneObject



103
104
105
# File 'lib/bolt/config.rb', line 103

def deep_clone
  Bolt::Util.deep_clone(self)
end

#default_boltdirObject



168
169
170
# File 'lib/bolt/config.rb', line 168

def default_boltdir
  File.expand_path(File.join('~', '.puppetlabs', 'bolt'))
end

#default_configObject



191
192
193
194
# File 'lib/bolt/config.rb', line 191

def default_config
  path = File.join(boltdir, 'bolt.yaml')
  File.exist?(path) ? path : legacy_conf
end

#default_inventoryObject



196
197
198
# File 'lib/bolt/config.rb', line 196

def default_inventory
  File.join(boltdir, 'inventory.yaml')
end

#default_modulepathObject



172
173
174
# File 'lib/bolt/config.rb', line 172

def default_modulepath
  [File.join(boltdir, "modules")]
end

#find_boltdir(dir) ⇒ Object



149
150
151
152
153
154
155
156
157
158
# File 'lib/bolt/config.rb', line 149

def find_boltdir(dir)
  path = dir
  boltdir = nil
  while boltdir.nil? && path && path != File.dirname(path)
    maybe_boltdir = File.join(path, BOLTDIR_NAME)
    boltdir = maybe_boltdir if File.directory?(maybe_boltdir)
    path = File.dirname(path)
  end
  boltdir
end

#legacy_confObject

TODO: This is deprecated in 0.21.0 and can be removed in release 0.22.0.



177
178
179
180
181
182
183
184
185
186
187
188
189
# File 'lib/bolt/config.rb', line 177

def legacy_conf
  return @legacy_conf if defined?(@legacy_conf)
  root_path = File.expand_path(File.join('~', '.puppetlabs'))
  legacy_paths = [File.join(root_path, 'bolt.yaml'), File.join(root_path, 'bolt.yml')]
  @legacy_conf = legacy_paths.find { |path| File.exist?(path) }
  @legacy_conf ||= legacy_paths[0]
  if @legacy_conf
    correct_path = File.join(default_boltdir, 'bolt.yaml')
    msg = "Found configfile at deprecated location #{@legacy_conf}. Global config should be in #{correct_path}"
    @logger.warn(msg)
  end
  @legacy_conf
end

#load_file(path) ⇒ Object



248
249
250
251
# File 'lib/bolt/config.rb', line 248

def load_file(path)
  data = Bolt::Util.read_config_file(path, [default_config], 'config')
  update_from_file(data) if data
end

#normalize_log(target) ⇒ Object



107
108
109
110
111
# File 'lib/bolt/config.rb', line 107

def normalize_log(target)
  return target if target == 'console'
  target = target[5..-1] if target.start_with?('file:')
  'file:' + File.expand_path(target)
end

#pwdObject



160
161
162
# File 'lib/bolt/config.rb', line 160

def pwd
  @pwd ||= Dir.pwd
end

#transport_confObject



261
262
263
264
# File 'lib/bolt/config.rb', line 261

def transport_conf
  { transport: self[:transport],
    transports: self[:transports] }
end

#update(options) ⇒ Object

The order in which config is processed is important



242
243
244
245
246
# File 'lib/bolt/config.rb', line 242

def update(options)
  update_from_defaults
  load_file(options[:configfile])
  update_from_cli(options)
end

#update_from_cli(options) ⇒ Object



200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
# File 'lib/bolt/config.rb', line 200

def update_from_cli(options)
  i[concurrency transport format trace modulepath inventoryfile color].each do |key|
    self[key] = options[key] if options.key?(key)
  end

  if options[:debug]
    self[:log]['console'][:level] = :debug
  elsif options[:verbose]
    self[:log]['console'][:level] = :info
  end

  TRANSPORTS.each_key do |transport|
    transport = self[:transports][transport]
    TRANSPORT_OPTIONS.each do |key|
      if options[key]
        transport[key.to_s] = Bolt::Util.walk_keys(options[key], &:to_s)
      end
    end
  end

  if options.key?(:ssl) # this defaults to true so we need to check the presence of the key
    self[:transports][:winrm]['ssl'] = options[:ssl]
  end

  if options.key?(:'ssl-verify') # this defaults to true so we need to check the presence of the key
    self[:transports][:winrm]['ssl-verify'] = options[:'ssl-verify']
  end

  if options.key?(:'host-key-check') # this defaults to true so we need to check the presence of the key
    self[:transports][:ssh]['host-key-check'] = options[:'host-key-check']
  end
end

#update_from_defaultsObject

Defaults that do not vary based on boltdir should not be included here.

Defaults which are treated differently from specified values like ‘inventoryfile’ cannot be included here or they will not be handled correctly.



237
238
239
# File 'lib/bolt/config.rb', line 237

def update_from_defaults
  self[:modulepath] = default_modulepath
end

#update_from_inventory(data) ⇒ Object



253
254
255
256
257
258
259
# File 'lib/bolt/config.rb', line 253

def update_from_inventory(data)
  update_from_file(data)

  if data['transport']
    self[:transport] = data['transport']
  end
end

#validateObject



266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
# File 'lib/bolt/config.rb', line 266

def validate
  self[:log].each_pair do |name, params|
    if params.key?(:level) && !Bolt::Logger.valid_level?(params[:level])
      raise Bolt::ValidationError,
            "level of log #{name} must be one of: #{Bolt::Logger.levels.join(', ')}; received #{params[:level]}"
    end
    if params.key?(:append) && params[:append] != true && params[:append] != false
      raise Bolt::ValidationError, "append flag of log #{name} must be a Boolean, received #{params[:append]}"
    end
  end

  unless %w[human json].include? self[:format]
    raise Bolt::ValidationError, "Unsupported format: '#{self[:format]}'"
  end

  unless self[:transport].nil? || Bolt::TRANSPORTS.include?(self[:transport].to_sym)
    raise UnknownTransportError, self[:transport]
  end

  TRANSPORTS.each do |transport, impl|
    impl.validate(self[:transports][transport])
  end
end