puppetlabs / puppetlabs-postgresql

Puppet module for managing PostgreSQL
Apache License 2.0
228 stars 612 forks source link

postgresql_psql failes with "no parameter named 'instance' #1601

Open absld opened 2 months ago

absld commented 2 months ago

Describe the Bug

I'm using puppetlabs-postgresql 10.3.0 together with puppetlabs-puppetdb 8.1.0. In database/postgresql.pp manifest of puppetlabs-puppetdb, postgresql::server::extension class is called:

postgresql::server::extension { 'pg_trgm':
        database => $database_name,
        require  => Postgresql::Server::Db[$database_name],
        port     => $port,
      }

Within postgresql::server::extension, $instance has a default set to 'main'. Then, postgresql_psql type is called the following way:

case $ensure {
    'present': {
      $command = "CREATE EXTENSION \"${extension}\""
      $unless_mod = undef
      $psql_cmd_require = $package_name ? {
        undef   => $default_psql_require,
        default => [$default_psql_require, Package[$package_name]],
      }
      $psql_cmd_before = []
    }

    'absent': {
      $command = "DROP EXTENSION \"${extension}\""
      $unless_mod = 'NOT '
      $psql_cmd_require = $default_psql_require
      $psql_cmd_before = $package_name ? {
        undef   => [],
        default => Package[$package_name],
      }
    }

    default: {
      fail("Unknown value for ensure '${ensure}'.")
    }
  }

  $port_override = pick($connect_settings['PGPORT'], $port)

  postgresql_psql { "${database}: ${command}":
    psql_user        => $user,
    psql_group       => $group,
    psql_path        => $psql_path,
    connect_settings => $connect_settings,
    db               => $database,
    port             => $port_override,
    command          => $command,
    instance         => $instance,
    unless           => "SELECT 1 WHERE ${unless_mod}EXISTS (SELECT 1 FROM pg_extension WHERE extname = '${extension}')",
    require          => $psql_cmd_require,
    before           => $psql_cmd_before,
  }

Unfortunately, this results in the following error:

Error: Could not retrieve catalog from remote server: Error 500 on SERVER: Server Error: no parameter named 'instance' (file: /data/puppet/code/environments/testing/modules/postgresql/manifests/server/extension.pp, line: 83) on Postgresql_psql[puppetdb: CREATE EXTENSION "pg_trgm"] (file: /data/puppet/code/environments/testing/modules/postgresql/manifests/server/extension.pp, line: 83) on node *****.***.lan

My guess is that this fails due to quoting problems. A string containing double quotes is assigned to $command variable. Maybe they break the double quotes in postgresql_psql { "${database}: ${command}":.

Expected Behavior

No mysterious error complaining about missing parameters which are acutally properly defined.

Steps to Reproduce

Steps to reproduce the behavior:

  1. Update PuppetDB OS from Ubuntu 20.04 to 22.04
  2. Update Puppet Modules 2.1 mod 'puppet-puppetboard', '9.0.0' => mod 'puppet-puppetboard', '10.0.0' 2.2 mod 'puppetlabs-puppetdb', '7.13.0' => mod 'puppetlabs-puppetdb', '8.1.0' 2.3 mod 'puppetlabs-postgresql', '9.0.3' => mod 'puppetlabs-postgresql', '10.3.0'
  3. Run Puppet @ PuppetDB server

Environment

waldman commented 1 month ago

I'm having exactly the same issue... Any clue on how to mitigate it?

(And I really mean exactly the same... also triggered by PuppetDB module)

flepoutre commented 1 month ago

Hello, same here ... Any news please ? Thanks.

ekohl commented 1 month ago

When you deploy your environment, do you generate types? https://www.puppet.com/docs/puppet/8/environment_isolation.html

flepoutre commented 1 month ago

When you deploy your environment, do you generate types? https://www.puppet.com/docs/puppet/8/environment_isolation.html

yes

absld commented 18 hours ago

Hello all,

just gave that another try. After generating types like recommended by @ekohl, I was able to successfully run puppet. @flepoutre please check whether you really generate types as this solved the issue for me.

For all who also use the puppetboard module of voxpupuli: There is a issue within the puppet-python module in its current version. You need to use the latest git commit from the repository instead of the latest tag at the moment. Stumbled upon this problem after I got the puppetlabs-postgresql module working.