diff --git a/lib/bolt/applicator.rb b/lib/bolt/applicator.rb index eaf4d0da0e..11cf7a9923 100644 --- a/lib/bolt/applicator.rb +++ b/lib/bolt/applicator.rb @@ -284,6 +284,9 @@ def apply_ast(raw_ast, targets, options, plan_vars = {}) 'catalog' => Puppet::Pops::Types::PSensitiveType::Sensitive.new(catalog), 'plugins' => Puppet::Pops::Types::PSensitiveType::Sensitive.new(plugins), 'apply_settings' => @apply_settings, + # This should just be boltlib and modules dirs shipped with bolt packages + # The apply_catalog task uses them to load core types if they exist + 'bolt_builtin_content' => @modulepath - @plugin_dirs, '_task' => catalog_apply_task.name, '_noop' => options[:noop] } diff --git a/libexec/apply_catalog.rb b/libexec/apply_catalog.rb index ccf6d62232..de12b8cc44 100755 --- a/libexec/apply_catalog.rb +++ b/libexec/apply_catalog.rb @@ -52,6 +52,19 @@ $LOAD_PATH << dir unless $LOAD_PATH.include?(dir) end + # In the case we are applying on a bolt runner and using bundled-ruby over local transport + # we will want to load code shipped with bolt. This is last on the load path and therefore + # explicitly packaged plugins should take precedence + args['bolt_builtin_content'].each do |builtin_dir| + next unless Dir.exist?(builtin_dir) + Dir.foreach(builtin_dir) do |dir| + unless ['.', '..'].include? dir + full_path = File.join(builtin_dir, dir, 'lib') + $LOAD_PATH << full_path unless $LOAD_PATH.include?(full_path) + end + end + end + if (conn_info = args['_target']) unless (type = conn_info['remote-transport']) puts "Cannot execute a catalog for a remote target without knowing it's the remote-transport type."