{"id":15022741,"url":"https://github.com/puppetlabs/puppetlabs-postgresql","last_synced_at":"2025-05-13T18:12:34.867Z","repository":{"id":3056243,"uuid":"4078159","full_name":"puppetlabs/puppetlabs-postgresql","owner":"puppetlabs","description":"Puppet module for managing PostgreSQL","archived":false,"fork":false,"pushed_at":"2025-04-23T12:11:59.000Z","size":3350,"stargazers_count":227,"open_issues_count":43,"forks_count":611,"subscribers_count":197,"default_branch":"main","last_synced_at":"2025-05-03T02:44:09.845Z","etag":null,"topics":["hacktoberfest","module","supported"],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/puppetlabs.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":"CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2012-04-19T17:32:56.000Z","updated_at":"2025-04-23T12:12:03.000Z","dependencies_parsed_at":"2024-04-08T09:58:00.494Z","dependency_job_id":"f3a875d4-8371-4c9c-b53f-d2f0a2dcc0e1","html_url":"https://github.com/puppetlabs/puppetlabs-postgresql","commit_stats":{"total_commits":1550,"total_committers":335,"mean_commits":4.626865671641791,"dds":0.9503225806451613,"last_synced_commit":"05a78097377eebd34297e9a01054f4bd50507b79"},"previous_names":[],"tags_count":99,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/puppetlabs%2Fpuppetlabs-postgresql","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/puppetlabs%2Fpuppetlabs-postgresql/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/puppetlabs%2Fpuppetlabs-postgresql/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/puppetlabs%2Fpuppetlabs-postgresql/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/puppetlabs","download_url":"https://codeload.github.com/puppetlabs/puppetlabs-postgresql/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254000858,"owners_count":21997442,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["hacktoberfest","module","supported"],"created_at":"2024-09-24T19:58:20.206Z","updated_at":"2025-05-13T18:12:34.818Z","avatar_url":"https://github.com/puppetlabs.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# postgresql\n\n#### Table of Contents\n\n1. [Module Description - What does the module do?](#module-description)\n2. [Setup - The basics of getting started with postgresql module](#setup)\n    * [What postgresql affects](#what-postgresql-affects)\n    * [Getting started with postgresql](#getting-started-with-postgresql)\n3. [Usage - Configuration options and additional functionality](#usage)\n    * [Configure a server](#configure-a-server)\n    * [Configure an instance](#configure-an-instance)\n    * [Create a database](#create-a-database)\n    * [Manage users, roles, and permissions](#manage-users-roles-and-permissions)\n    * [Manage ownership of DB objects](#manage-ownership-of-db-objects)\n    * [Override defaults](#override-defaults)\n    * [Create an access rule for pg_hba.conf](#create-an-access-rule-for-pg_hbaconf)\n    * [Create user name maps for pg_ident.conf](#create-user-name-maps-for-pg_identconf)\n    * [Validate connectivity](#validate-connectivity)\n    * [Backups](#backups)\n4. [Reference - An under-the-hood peek at what the module is doing and how](#reference)\n5. [Limitations - OS compatibility, etc.](#limitations)\n6. [License](#license)\n7. [Development - Guide for contributing to the module](#development)\n    * [Contributors - List of module contributors](#contributors)\n8. [Tests](#tests)\n9. [Contributors - List of module contributors](#contributors)\n\n## Module description\n\nThe postgresql module allows you to manage PostgreSQL databases with Puppet.\n\nPostgreSQL is a high-performance, free, open-source relational database server. The postgresql module allows you to manage packages, services, databases, users, and common security settings in PostgreSQL.\n\n## Setup\n\n### What postgresql affects\n\n* Package, service, and configuration files for PostgreSQL\n* Listened-to ports\n* IP and mask (optional)\n\n### Getting started with postgresql\n\nTo configure a basic default PostgreSQL server, declare the `postgresql::server` class.\n\n```puppet\nclass { 'postgresql::server':\n}\n```\n\n## Usage\n\n### Configure a server\n\nFor default settings, declare the `postgresql::server` class as above. To customize PostgreSQL server settings, specify the [parameters](#postgresqlserver) you want to change:\n\n```puppet\nclass { 'postgresql::server':\n  ip_mask_deny_postgres_user =\u003e '0.0.0.0/32',\n  ip_mask_allow_all_users    =\u003e '0.0.0.0/0',\n  ipv4acls                   =\u003e ['hostssl all johndoe 192.168.0.0/24 cert'],\n  postgres_password          =\u003e 'TPSrep0rt!',\n}\n```\n\nAfter configuration, test your settings from the command line:\n\n```shell\npsql -h localhost -U postgres\npsql -h my.postgres.server -U\n```\n\nIf you get an error message from these commands, your permission settings restrict access from the location you're trying to connect from. Depending on whether you want to allow connections from that location, you might need to adjust your permissions.\n\nFor more details about server configuration parameters, consult the [PostgreSQL Runtime Configuration documentation](http://www.postgresql.org/docs/current/static/runtime-config.html).\n\n#### Selecting a version\n\nThe version is intended to be supplied via `postgresql::globals`.\nBy default the module tries to derive the version based on the OS facts, but can be overridden.\nThis is typically used with the official postgresql.org packages:\n\n```puppet\nclass { 'postgresql::globals':\n  manage_package_repo =\u003e true,\n  version             =\u003e '16',\n}\n\ninclude postgresql::server\n```\n\nOn EL 8 \u0026 9 you can also use DNF modules:\n\n```puppet\nclass { 'postgresql::globals':\n  manage_dnf_module =\u003e true,\n  version           =\u003e '16',\n}\n\ninclude postgresql::server\n```\n\nIf you manage the repositories yourself, overriding the version is sufficient.\n\n```puppet\nclass { 'postgresql::globals':\n  version =\u003e '16',\n}\n\ninclude postgresql::server\n```\n\n### Configure an instance\n\nThis module supports managing multiple instances (the default instance is referred to as 'main' and managed via including the server.pp class)\n\n**NOTE:** This feature is currently tested on CentOS 8 Streams/RHEL8 with DNF Modules enabled. Different Linux platforms and/or the postgresql.org\npackages distribute different systemd service files or use wrapper scripts with systemd to start PostgreSQL. Additional adjustmentments are needed to get this working on these platforms.\n\n#### Working Platforms\n\n* Centos 8 Streams\n* RHEL 8\n\n#### Background and example\n\ncreating a new instance has the following advantages:\n* files are owned by the postgres user\n* instance is running under a different user, if the instance is hacked, the hacker has no access to the file system\n* the instance user can be an LDAP user, higher security because of central login monitoring, password policies, password rotation policies\n* main instance can be disabled\n\n\nHere is a profile which can be used to create instances\n\n```puppet\nclass profiles::postgres (\n  Hash $instances = {},\n  String $postgresql_version = '13',\n) {\n  class { 'postgresql::globals':\n    encoding            =\u003e 'UTF-8',\n    locale              =\u003e 'en_US.UTF-8',\n    manage_package_repo =\u003e false,\n    manage_dnf_module   =\u003e true,\n    needs_initdb        =\u003e true,\n    version             =\u003e $postgresql_version,\n  }\n  include postgresql::server\n\n  $instances.each |String $instance, Hash $instance_settings| {\n    postgresql::server_instance { $instance:\n      *               =\u003e $instance_settings,\n    }\n  }\n}\n```\n\nAnd here is data to create an instance called test1:\n\n```yaml\n# stop default main instance\npostgresql::server::service_ensure: \"stopped\"\npostgresql::server::service_enable: false\n\n#define an instance\nprofiles::postgres::instances:\n  test1:\n    instance_user: \"ins_test1\"\n    instance_group: \"ins_test1\"\n    instance_directories:\n      \"/opt/pgsql\":\n        ensure: directory\n      \"/opt/pgsql/backup\":\n        ensure: directory\n      \"/opt/pgsql/data\":\n        ensure: directory\n      \"/opt/pgsql/data/13\":\n        ensure: directory\n      \"/opt/pgsql/data/home\":\n        ensure: directory\n      \"/opt/pgsql/wal\":\n        ensure: directory\n      \"/opt/pgsql/log\":\n        ensure: directory\n      \"/opt/pgsql/log/13\":\n        ensure: directory\n      \"/opt/pgsql/log/13/test1\":\n        ensure: directory\n    config_settings:\n      pg_hba_conf_path: \"/opt/pgsql/data/13/test1/pg_hba.conf\"\n      postgresql_conf_path: \"/opt/pgsql/data/13/test1/postgresql.conf\"\n      pg_ident_conf_path: \"/opt/pgsql/data/13/test1/pg_ident.conf\"\n      datadir: \"/opt/pgsql/data/13/test1\"\n      service_name: \"postgresql@13-test1\"\n      port: 5433\n      pg_hba_conf_defaults: false\n    service_settings:\n      service_name: \"postgresql@13-test1\"\n      service_status: \"systemctl status postgresql@13-test1.service\"\n      service_ensure: \"running\"\n      service_enable: true\n    initdb_settings:\n      auth_local: \"peer\"\n      auth_host: \"md5\"\n      needs_initdb: true\n      datadir: \"/opt/pgsql/data/13/test1\"\n      encoding: \"UTF-8\"\n      lc_messages: \"en_US.UTF8\"\n      locale: \"en_US.UTF8\"\n      data_checksums: false\n      group: \"postgres\"\n      user: \"postgres\"\n      username: \"ins_test1\"\n    config_entries:\n      authentication_timeout:\n        value: \"1min\"\n        comment: \"a test\"\n      log_statement_stats:\n        value: \"off\"\n      autovacuum_vacuum_scale_factor:\n        value: 0.3\n    databases:\n      testdb1:\n        encoding: \"UTF8\"\n        locale: \"en_US.UTF8\"\n        owner: \"dba_test1\"\n      testdb2:\n        encoding: \"UTF8\"\n        locale: \"en_US.UTF8\"\n        owner: \"dba_test1\"\n    roles:\n      \"ins_test1\":\n        superuser: true\n        login: true\n      \"dba_test1\":\n        createdb: true\n        login: true\n      \"app_test1\":\n        login: true\n      \"rep_test1\":\n        replication: true\n        login: true\n      \"rou_test1\":\n        login: true\n    pg_hba_rules:\n      \"local all INSTANCE user\":\n        type: \"local\"\n        database: \"all\"\n        user: \"ins_test1\"\n        auth_method: \"peer\"\n        order: 1\n      \"local all DB user\":\n        type: \"local\"\n        database: \"all\"\n        user: \"dba_test1\"\n        auth_method: \"peer\"\n        order: 2\n      \"local all APP user\":\n        type: \"local\"\n        database: \"all\"\n        user: \"app_test1\"\n        auth_method: \"peer\"\n        order: 3\n      \"local all READONLY user\":\n        type: \"local\"\n        database: \"all\"\n        user: \"rou_test1\"\n        auth_method: \"peer\"\n        order: 4\n      \"remote all INSTANCE user PGADMIN server\":\n        type: \"host\"\n        database: \"all\"\n        user: \"ins_test1\"\n        address: \"192.168.22.131/32\"\n        auth_method: \"md5\"\n        order: 5\n      \"local replication INSTANCE user\":\n        type: \"local\"\n        database: \"replication\"\n        user: \"ins_test1\"\n        auth_method: \"peer\"\n        order: 6\n      \"local replication REPLICATION user\":\n        type: \"local\"\n        database: \"replication\"\n        user: \"rep_test1\"\n        auth_method: \"peer\"\n        order: 7\n```\n### Create a database\n\nYou can set up a variety of PostgreSQL databases with the `postgresql::server::db` defined type. For instance, to set up a database for PuppetDB:\n\n```puppet\nclass { 'postgresql::server':\n}\n\npostgresql::server::db { 'mydatabasename':\n  user     =\u003e 'mydatabaseuser',\n  password =\u003e postgresql::postgresql_password('mydatabaseuser', 'mypassword'),\n}\n```\n\n### Manage users, roles, and permissions\n\nTo manage users, roles, and permissions:\n\n```puppet\nclass { 'postgresql::server':\n}\n\npostgresql::server::role { 'marmot':\n  password_hash =\u003e postgresql::postgresql_password('marmot', 'mypasswd'),\n}\n\npostgresql::server::database_grant { 'test1':\n  privilege =\u003e 'ALL',\n  db        =\u003e 'test1',\n  role      =\u003e 'marmot',\n}\n\npostgresql::server::table_grant { 'my_table of test2':\n  privilege =\u003e 'ALL',\n  table     =\u003e 'my_table',\n  db        =\u003e 'test2',\n  role      =\u003e 'marmot',\n}\n```\n\nThis example grants **all** privileges on the test1 database and on the `my_table` table of the test2 database to the specified user or group. After the values are added into the PuppetDB config file, this database would be ready for use.\n\n### Manage ownership of DB objects\n\nTo change the ownership of all objects within a database using REASSIGN OWNED:\n\n```puppet\npostgresql::server::reassign_owned_by { 'new owner is meerkat':\n  db       =\u003e 'test_db',\n  old_role =\u003e 'marmot',\n  new_role =\u003e 'meerkat',\n}\n```\n\nThis would run the PostgreSQL statement 'REASSIGN OWNED' to update to ownership of all tables, sequences, functions and views currently owned by the role 'marmot' to be owned by the role 'meerkat' instead.\n\nThis applies to objects within the nominated database, 'test_db' only.\n\nFor Postgresql \u003e= 9.3, the ownership of the database is also updated.\n\n### Manage default permissions (PostgreSQL \u003e= 9.6)\n\nTo change default permissions for newly created objects using ALTER DEFAULT PRIVILEGES:\n\n```puppet\npostgresql::server::default_privileges { 'marmot access to new tables on test_db':\n  db          =\u003e 'test_db',\n  role        =\u003e 'marmot',\n  privilege   =\u003e 'ALL',\n  object_type =\u003e 'TABLES',\n}\n```\n\n### Override defaults\n\nThe `postgresql::globals` class allows you to configure the main settings for this module globally, so that other classes and defined resources can use them. By itself, it does nothing.\n\nFor example, to overwrite the default `locale` and `encoding` for all classes, use the following:\n\n```puppet\nclass { 'postgresql::globals':\n  encoding =\u003e 'UTF-8',\n  locale   =\u003e 'en_US.UTF-8',\n}\n\nclass { 'postgresql::server':\n}\n```\n\n### Manage remote users, roles, and permissions\n\nRemote SQL objects are managed using the same Puppet resources as local SQL objects, along with a `$connect_settings` hash. This provides control over how Puppet connects to the remote Postgres instances and which version is used for generating SQL commands.\n\nThe `connect_settings` hash can contain environment variables to control Postgres client connections, such as 'PGHOST', 'PGPORT', 'PGPASSWORD', 'PGUSER' and 'PGSSLKEY'. See the [PostgreSQL Environment Variables](https://www.postgresql.org/docs/current/libpq-envars.html)  documentation for a complete list of variables.\n\nAdditionally, you can specify the target database version with the special value of 'DBVERSION'. If the `$connect_settings` hash is omitted or empty, then Puppet connects to the local PostgreSQL instance.\n\n**The $connect_settings hash has priority over the explicit variables like $port and $user**\n\nWhen a user provides only the `$port` parameter to a resource and no `$connect_settings`, `$port` will be used. When `$connect_settings` contains `PGPORT` and `$port` is set, `$connect_settings['PGPORT']` will be used.\n\nYou can provide a `connect_settings` hash for each of the Puppet resources, or you can set a default `connect_settings` hash in `postgresql::globals`. Configuring `connect_settings` per resource allows SQL objects to be created on multiple databases by multiple users.\n\n```puppet\n$connection_settings_super2 = {\n  'PGUSER'     =\u003e 'super2',\n  'PGPASSWORD' =\u003e 'foobar2',\n  'PGHOST'     =\u003e '127.0.0.1',\n  'PGPORT'     =\u003e '5432',\n  'PGDATABASE' =\u003e 'postgres',\n}\n\ninclude postgresql::server\n\n# Connect with no special settings, i.e domain sockets, user postgres\npostgresql::server::role { 'super2':\n  password_hash    =\u003e 'foobar2',\n  superuser        =\u003e true,\n\n  connect_settings =\u003e {},\n}\n\n# Now using this new user connect via TCP\npostgresql::server::database { 'db1':\n  connect_settings =\u003e $connection_settings_super2,\n  require          =\u003e Postgresql::Server::Role['super2'],\n}\n```\n\n### Create an access rule for pg_hba.conf\n\nTo create an access rule for `pg_hba.conf`:\n\n```puppet\npostgresql::server::pg_hba_rule { 'allow application network to access app database':\n  description =\u003e 'Open up PostgreSQL for access from 200.1.2.0/24',\n  type        =\u003e 'host',\n  database    =\u003e 'app',\n  user        =\u003e 'app',\n  address     =\u003e '200.1.2.0/24',\n  auth_method =\u003e 'md5',\n}\n```\n\nThis would create a ruleset in `pg_hba.conf` similar to:\n\n```\n# Rule Name: allow application network to access app database\n# Description: Open up PostgreSQL for access from 200.1.2.0/24\n# Order: 150\nhost  app  app  200.1.2.0/24  md5\n```\n\nBy default, `pg_hba_rule` requires that you include `postgresql::server`. However, you can override that behavior by setting target and postgresql_version when declaring your rule.  That might look like the following:\n\n```puppet\npostgresql::server::pg_hba_rule { 'allow application network to access app database':\n  description        =\u003e 'Open up postgresql for access from 200.1.2.0/24',\n  type               =\u003e 'host',\n  database           =\u003e 'app',\n  user               =\u003e 'app',\n  address            =\u003e '200.1.2.0/24',\n  auth_method        =\u003e 'md5',\n  target             =\u003e '/path/to/pg_hba.conf',\n  postgresql_version =\u003e '9.4',\n}\n```\n\n### Create user name maps for pg_ident.conf\n\nTo create a user name map for the pg_ident.conf:\n\n```puppet\npostgresql::server::pg_ident_rule { 'Map the SSL certificate of the backup server as a replication user':\n  map_name          =\u003e 'sslrepli',\n  system_username   =\u003e 'repli1.example.com',\n  database_username =\u003e 'replication',\n}\n```\n\nThis would create a user name map in `pg_ident.conf` similar to:\n\n```\n#Rule Name: Map the SSL certificate of the backup server as a replication user\n#Description: none\n#Order: 150\nsslrepli  repli1.example.com  replication\n```\n\n### Create recovery configuration\n\nTo create the recovery configuration file (`recovery.conf`):\n\n```puppet\npostgresql::server::recovery { 'Create a recovery.conf file with the following defined parameters':\n  restore_command           =\u003e 'cp /mnt/server/archivedir/%f %p',\n  archive_cleanup_command   =\u003e undef,\n  recovery_end_command      =\u003e undef,\n  recovery_target_name      =\u003e 'daily backup 2015-01-26',\n  recovery_target_time      =\u003e '2015-02-08 22:39:00 EST',\n  recovery_target_xid       =\u003e undef,\n  recovery_target_inclusive =\u003e true,\n  recovery_target           =\u003e 'immediate',\n  recovery_target_timeline  =\u003e 'latest',\n  pause_at_recovery_target  =\u003e true,\n  standby_mode              =\u003e 'on',\n  primary_conninfo          =\u003e 'host=localhost port=5432',\n  primary_slot_name         =\u003e undef,\n  trigger_file              =\u003e undef,\n  recovery_min_apply_delay  =\u003e 0,\n}\n```\n\nThe above creates this `recovery.conf` config file:\n\n```\nrestore_command = 'cp /mnt/server/archivedir/%f %p'\nrecovery_target_name = 'daily backup 2015-01-26'\nrecovery_target_time = '2015-02-08 22:39:00 EST'\nrecovery_target_inclusive = true\nrecovery_target = 'immediate'\nrecovery_target_timeline = 'latest'\npause_at_recovery_target = true\nstandby_mode = 'on'\nprimary_conninfo = 'host=localhost port=5432'\nrecovery_min_apply_delay = 0\n```\n\nOnly the specified parameters are recognized in the template. The `recovery.conf` is only created if at least one parameter is set **and** [manage_recovery_conf](#manage_recovery_conf) is set to true.\n\n### Validate connectivity\n\nTo validate client connections to a remote PostgreSQL database before starting dependent tasks, use the `postgresql_conn_validator` resource. You can use this on any node where the PostgreSQL client software is installed. It is often chained to other tasks such as starting an application server or performing a database migration.\n\nExample usage:\n\n```puppet\npostgresql_conn_validator { 'validate my postgres connection':\n  host              =\u003e 'my.postgres.host',\n  db_username       =\u003e 'mydbuser',\n  db_password       =\u003e 'mydbpassword',\n  db_name           =\u003e 'mydbname',\n  psql_path         =\u003e '/usr/bin/psql',\n}\n-\u003e exec { 'rake db:migrate':\n  cwd =\u003e '/opt/myrubyapp',\n}\n```\n\n### Backups\n\nThis example demonstrates how to configure PostgreSQL backups with \"pg_dump\". This sets up a daily cron job to perform a full backup. Each backup will create a new directory. A cleanup job will automatically remove backups that are older than 15 days.\n\n```\nclass { 'postgresql::server':\n  backup_enable   =\u003e true,\n  backup_provider =\u003e 'pg_dump',\n  backup_options  =\u003e {\n    db_user     =\u003e 'backupuser',\n    db_password =\u003e 'secret',\n    manage_user =\u003e true,\n    rotate      =\u003e 15,\n  },\n  ...\n}\n```\n\nIt is possible to set parameter `$ensure` to `absent` in order to remove the backup job, user/role, backup script and password file. However, the actual backup files and directories will remain untouched.\n\n## Reference\n\nFor information on the classes and types, see the [REFERENCE.md](https://github.com/puppetlabs/puppetlabs-postgresql/blob/main/REFERENCE.md)\n\n## Limitations\n\nWorks with versions of PostgreSQL on supported OSes.\n\nFor an extensive list of supported operating systems, see [metadata.json](https://github.com/puppetlabs/puppetlabs-postgresql/blob/main/metadata.json)\n\n### Apt module support\n\nWhile this module supports both 1.x and 2.x versions of the 'puppetlabs-apt' module, it does not support 'puppetlabs-apt' 2.0.0 or 2.0.1.\n\n\n### PostGIS support\n\nPostGIS is currently considered an unsupported feature, as it doesn't work on all platforms correctly.\n\n### All versions of RHEL/CentOS with manage_selinux =\u003e false\n\nIf you have SELinux enabled and you are *not* using the selinux module to manage SELinux (this is the default configuration) you will need to label any custom ports you use with the `postgresql_port_t` context.  The postgresql service will not start until this is done.  To label a port use the semanage command as follows:\n\n```shell\nsemanage port -a -t postgresql_port_t -p tcp $customport\n```\n\n## License\n\nThis codebase is licensed under the Apache2.0 licensing, however due to the nature of the codebase the open source dependencies may also use a combination of [AGPL](https://opensource.org/license/agpl-v3/), [BSD-2](https://opensource.org/license/bsd-2-clause/), [BSD-3](https://opensource.org/license/bsd-3-clause/), [GPL2.0](https://opensource.org/license/gpl-2-0/), [LGPL](https://opensource.org/license/lgpl-3-0/), [MIT](https://opensource.org/license/mit/) and [MPL](https://opensource.org/license/mpl-2-0/) Licensing.\n\n## Development\n\nPuppet Labs modules on the Puppet Forge are open projects, and community contributions are essential for keeping them great. We can’t access the huge number of platforms and myriad hardware, software, and deployment configurations that Puppet is intended to serve. We want to keep it as easy as possible to contribute changes so that our modules work in your environment. There are a few guidelines that we need contributors to follow so that we can have a chance of keeping on top of things. For more information, see our [module contribution guide](https://puppet.com/docs/puppet/latest/contributing.html).\n\n### Tests\n\nThere are two types of tests distributed with this module. Unit tests with `rspec-puppet` and system tests using `rspec-system`.\n\nFor unit testing, make sure you have:\n\n* rake\n* bundler\n\nInstall the necessary gems:\n\n```shell\nbundle install --path=vendor\n```\n\nAnd then run the unit tests:\n\n```shell\nbundle exec rake spec\n```\n\nTo run the system tests, make sure you also have:\n\n* Vagrant \u003e 1.2.x\n* VirtualBox \u003e 4.2.10\n\nThen run the tests using:\n\n```shell\nbundle exec rspec spec/acceptance\n```\n\nTo run the tests on different operating systems, see the sets available in `.nodeset.yml` and run the specific set with the following syntax:\n\n```shell\nRSPEC_SET=debian-607-x64 bundle exec rspec spec/acceptance\n```\n\n### Contributors\n\nView the full list of contributors on [Github](https://github.com/puppetlabs/puppetlabs-postgresql/graphs/contributors).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpuppetlabs%2Fpuppetlabs-postgresql","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpuppetlabs%2Fpuppetlabs-postgresql","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpuppetlabs%2Fpuppetlabs-postgresql/lists"}