puppetlabs/puppet · error · ArgumentError

Invalid %{resource} provider '%{provider_class}'

Error message

Invalid %{resource} provider '%{provider_class}'

What it means

Every resource type gets a provider parameter whose validate block resolves the given name through @resource.class.provider(provider_class). That lookup only returns providers that are confined/suitable on this node and actually declared; nil means the provider is unknown here, and ArgumentError 'Invalid <type> provider <name>' aborts the resource. The message also fires when the value is a Puppet::Provider instance of the wrong class or an Array.

Source

Thrown at lib/puppet/type.rb:1875

        # provider's doc string, since markdown_definitionlist sanitizes its inputs.
        scrub(@doc) + "Available providers are:\n\n" + parenttype.providers.sort_by(&:to_s).collect { |i|
          markdown_definitionlist(i, scrub(parenttype().provider(i).doc))
        }.join
      end

      # For each resource, the provider param defaults to
      # the type's default provider
      defaultto {
        prov = @resource.class.defaultprovider
        prov.name if prov
      }

      validate do |provider_class|
        provider_class = provider_class[0] if provider_class.is_a? Array
        provider_class = provider_class.class.name if provider_class.is_a?(Puppet::Provider)

        unless @resource.class.provider(provider_class)
          raise ArgumentError, _("Invalid %{resource} provider '%{provider_class}'") % { resource: @resource.class.name, provider_class: provider_class }
        end
      end

      munge do |provider|
        provider = provider[0] if provider.is_a? Array
        provider = provider.intern if provider.is_a? String
        @resource.provider = provider

        if provider.is_a?(Puppet::Provider)
          provider.class.name
        else
          provider
        end
      end
    end
    param.parenttype = self
  end

View on GitHub (pinned to e227c27540)

Solutions

  1. List what the type actually offers on this node: puppet describe -p <type> | head, or `ruby -e "puts Puppet::Type.type(:package).suitable_provider_names"` style introspection
  2. Drop the explicit provider and let Puppet pick the default suitable provider — the most portable fix
  3. If the provider is required, install its dependency (apt-get install aptitude) and ensure its confine matches the node facts
  4. Fix typos/casing: provider names are downcased symbols ('zypper', not 'Zypper')

Example fix

# before
package { 'htop': ensure => installed, provider => 'aptitude' } # fails where aptitude absent

# after
package { 'htop': ensure => installed } # default provider auto-selected per platform
Defensive patterns

Strategy: validation

Validate before calling

type = Puppet::Type.type(:package)
name = provider_value.to_s if provider_value.respond_to?(:to_s)
unless type.provider(name)
  Puppet.warning "provider #{name} unsuitable on this node; using default"
  provider_value = nil # let defaultto choose
end

Try / catch

begin
  resource[:provider] = 'aptitude'
rescue ArgumentError => e
  raise unless e.message =~ /Invalid .* provider/
  resource[:provider] = nil # fall back to default provider
end

Prevention

When it happens

Trigger: package { 'x': provider => 'aptitude' } where aptitude is not installed or the node is not Debian-family (suitability filtering removes it); a typo like provider => 'yum' spelled 'yuum'; exec's provider => 'shell' vs 'powershell' on the wrong platform; using a provider whose gem/dep (e.g., ruby-shadow for user) failed to load, dropping it from the registry.

Common situations: Porting manifests between OS families (apt vs yum vs dnf vs zypper); module code hardcoding a provider that the node's package set lacks; missing provider dependencies (aptitude, yum-utils, ruby libraries) after a minimal install or major OS upgrade.

Related errors


AI-assisted analysis of puppetlabs/puppet@e227c27540 (2026-08-21). Data as JSON: /api/errors/efd497943b3a3c33. Report an issue: GitHub.