PGSQL Playbook

Pull up a defined cluster of HA PostgreSQL cluster using the PGSQL playbook


Playbook Function Link
pgsql Deploy a PostgreSQL cluster, or cluster expand src
pgsql-remove Destroy PostgreSQL cluster, or cluster downsize src
pgsql-createuser Create PostgreSQL business users src
pgsql-createdb Create a PostgreSQL Business Database src
pgsql-monly Monly mode, with access to existing PostgreSQL instances or RDS src
pgsql-migration Generate PostgreSQL semi-automatic database migration solution (Beta) src
pgsql-matrix Reuse the PG to deploy a set of MatrixDB clusters (Beta) src


After completing the infra initialization, users can use pgsql.yml to complete the initialization of the database cluster.

Complete the cluster definition in the Pigsty configuration file and then apply the changes to the environment by executing pgsql.yml.

./pgsql.yml                      # Perform cluster initialization on all machines in the list (Danger!)
./pgsql.yml -l pg-test           # Perform cluster initialization on the machines under the pg-test group (recommended!)
./pgsql.yml -l pg-meta,pg-test   # Initialize both pg-meta and pg-test clusters
./pgsql.yml -l       # Initialize the instance on the machine

This playbook accomplishes the following.

  • Install, deploy, and initialize PostgreSQL, Pgbouncer, Patroni (postgres).
  • Install the PostgreSQL monitor (monitor).
  • Install and deploy Haproxy and VIP, expose services (service).
  • Register the database instance to the infra to be monitored (register).

This playbook can be misused to accidentally delete the database, as initializing the database will erase the existing database.

The insurance param prevents accidental deletion by allowing automatic aborting or skipping of high-risk operations during initialization when an existing running instance is detected.

Nevertheless, when using pgsql.yml, double-check that -tags|-t and -limit|-l is correct.


  • It is strongly recommended to add the -l parameter to the execution to limit the scope of the command execution.
  • When performing initialization for a replica, the user must ensure that the primary has completed initialization.
  • If Patroni takes too long to pull up a replica when a cluster is expanded, the Ansible playbook may abort due to a timeout. (However, making the replica will continue, for example, in scenarios where making the replica takes more than one day).
  • It is possible to perform subsequent steps from the -Wait for patroni replica online task via Ansible’s -start-at-task after the replica has been automatically crafted. Please refer to SOP for details.


Pigsty provides a SafeGuard to avoid purging running PostgreSQL instances with fat fingers. There are two parameters.

  • pg_safeguard: Disabled by default, if enabled, running PostgreSQL will not be purged by any circumstance.
  • pg_clean: disabled by default, pgsql.yml will purge running PostgreSQL during node init.

When running pg exists, pgsql.yml will act as:

pg_safeguard / pg_clean pg_clean=true pg_clean=false
pg_safeguard=true ABORT ABORT
pg_safeguard=false PURGE ABORT

When running pg exists, pgsql-remove.yml will act as:

pg_safeguard / pg_clean pg_clean=true pg_clean=false
pg_safeguard=true ABORT ABORT
pg_safeguard=false PURGE PURGE

Selective execution

An ansible’s tagging mechanism can select a subset of the execution playbook.

For example, if you want to perform only service initialization, you can use the following command.

./pgsql.yml --tags=service      # Refreshing the service definition of a cluster

The common subsets of commands are as follows.

# Infra initialization
./pgsql.yml --tags=infra        # Complete infra initialization, including machine node initialization and DCS deployment

# Database initialization
./pgsql.yml --tags=pgsql        # Complete database deployment: database, monitoring, services

./pgsql.yml --tags=postgres     # Complete database deployment
./pgsql.yml --tags=monitor      # Complete monitoring deployment
./pgsql.yml --tags=service      # Complete load balancing deployment(Haproxy & VIP)
./pgsql.yml --tags=register     # Registering services to the infra

Daily management tasks

Daily management can also be used ./pgsql.yml to modify the state of the cluster. The common command subsets are as follows.

./pgsql.yml --tags=node_admin           # Create an admin user on the target node

# If the current administrator does not have ssh to the target node, you can use another user with ssh to create an administrator (enter the password)
./pgsql.yml --tags=node_admin -e ansible_user=other_admin -k 

./pgsql.yml --tags=pg_scripts           # Update the /pg/bin/ directory script
./pgsql.yml --tags=pg_hba               # Regenerate and apply cluster HBA rules
./pgsql.yml --tags=pgbouncer            # Reset Pgbouncer
./pgsql.yml --tags=pg_user              # Full volume refresh business users
./pgsql.yml --tags=pg_db                # Full volume refresh of business database

./pgsql.yml --tags=register_consul      # Register the Consul service locally with the target instance (local execution)
./pgsql.yml --tags=register_prometheus  # Register monitoring objects in Prometheus (proxy to all Meta nodes for execution)
./pgsql.yml --tags=register_grafana     # Register monitoring objects in Grafana (only once)
./pgsql.yml --tags=register_nginx       # Register a LB with Nginx (proxy to all Meta nodes for execution)

# Redeploy monitoring using binary installation
./pgsql.yml --tags=monitor -e exporter_install=binary

# Refresh the service definition of the cluster (changes in cluster membership or service definition)
./pgsql.yml --tags=haproxy_config,haproxy_reload


Database Destruction: Remove existing database cluster or instance, reclaim node: pgsql-remove.yml.

The pgsql-remove.yml is the reverse of pgsql.yml and will do the following :

  • Unregister the database instance from the infra(register
  • Stop the LB, service component(service
  • Removal of monitoring system components(monitor
  • Remove Pgbouncer, Patroni, Postgres(postgres
  • Remove database dir(rm_pgdata: true
  • Remove Package(rm_pkgs: true

The playbook has two command-line options to remove the database dir and packages (the default destruction does not remove data and packages).

rm_pgdata: false        # remove postgres data? false by default
rm_pgpkgs: false        # uninstall pg_packages? false by default

Daily management

./pgsql-remove.yml -l pg-test          # Destruction pg-test cluster
./pgsql-remove.yml -l      # Destruction instance (
./pgsql-remove.yml -l -e rm_pgdata=true # Destruction and remove the data dir (slow)
./pgsql-remove.yml -l -e rm_pkgs=true   # Destruction and remove the installed PG-related packages


Created business database: Create a new database in an existing cluster or modify a current database: pgsql-createdb.yml.

To ensure that, the author recommends creating a new database in an existing cluster via a playbook or scripting tool.

  • The inventory is consistent with the actual situation.
  • Pgbouncer connection pools are consistent with the database.
  • The data sources registered in Grafana are consistent with the actual situation.

Daily management

Please refer to the section Database for the creation of the database.

# Create a database named test in the pg-test cluster
./pgsql-createdb.yml -l pg-test -e pg_database=test

Simplify commands using wrapper scripts:

bin/createdb <pg_cluster> <dbname>


Create business users: Create a new user or modify an existing user in an existing cluster:pgsql-createuser.yml.

Daily management

Please refer to the section User for the creation of business users.

# Create a user named test in the pg-test cluster
./pgsql-createuser.yml -l pg-test -e pg_user=test

Simplify commands using wrapper scripts.

bin/createuser <pg_cluster> <username>

Note that the user-specified by pg_user must already be in the definition of the cluster pg_users. Otherwise, an error will be reported.


Dedicated playbook for performing monitoring deployments. See monly deployments for details.


Dedicated playbook for deploying MatrixDB. See Deploying MatrixDB Cluster for details.


Playbook for automated database migration, still in Beta status. See database cluster migration for details.

Last modified 2022-06-04: fii en docs batch 2 (61bf601)