fidanf.postgresql_ha
Alta Disponibilidad de PostgreSQL
Instala y configura un clúster de alta disponibilidad de PostgreSQL gestionado con repmgr. Añade dependencias, extensiones, bases de datos y usuarios. También funciona para instalaciones independientes.
Probado con:
- Debian 10.x :heavy_check_mark:
- Debian 11.x :heavy_check_mark:
- Ubuntu 18.04.x :heavy_check_mark:
- Ubuntu 20.04.x :heavy_check_mark:
- Alta Disponibilidad de PostgreSQL
- Comandos útiles para ejecutar después de tu primera instalación
- Registrar antiguo primario como nodo en espera después de un failover automático
- Licencia
Requisitos
- Python >=3.8
- Ansible-core >=2.12
Consulta ./requirements.txt para ver las dependencias detalladas utilizadas para desarrollar el rol.
Recomendado, para cada host de PostgreSQL
- Python3 en PATH
- Pip3 en PATH
- psycopg2-binary (requiere el paquete libpq-dev)
Puedes revisar prepare.yml para ver un ejemplo de configuración para Python 3.
Instalación
Shell
ansible-galaxy collection install community.crypto
ansible-galaxy install fidanf.postgresql_ha
Archivo de requisitos
---
roles:
- src: https://github.com/fidanf/ansible-role-postgresql-ha
name: fidanf.postgresql_ha
version: master
collections:
- community.crypto
Dependencias
- cryptography (host de ansible)
Ejemplo de Inventario
Consulta inventory.yml para obtener grupos y variables de host detalladas.
Variables del rol
Las variables predeterminadas del rol están divididas en dos archivos:
Para entender el propósito y los valores válidos de cada una de estas variables, no dudes en inspeccionar todas las plantillas Jinja en el directorio templates. También se incluyen los archivos de configuración predeterminados originales (.orig
).
Ejemplo de Playbook
---
- hosts: pgcluster
gather_facts: yes
become: yes
roles:
- name: fidanf.postgresql_ha
vars:
# Elementos de configuración requeridos
repmgr_target_group: pgcluster
repmgr_master: pgsql01
repmgr_failover: automatic
repmgr_promote_command: /usr/bin/repmgr standby promote -f /etc/repmgr.conf --log-to-file
repmgr_follow_command: /usr/bin/repmgr standby follow -f /etc/repmgr.conf --log-to-file --upstream-node-id=%n
repmgr_monitoring_history: "yes"
repmgr_connection_check_type: query
repmgr_log_level: DEBUG
repmgr_reconnect_attempts: 2
repmgr_reconnect_interval: 10
# Configuraciones básicas
postgresql_version: 13
postgresql_cluster_name: main
postgresql_cluster_reset: false # TODO: Necesita ser probado para repmgr
postgresql_listen_addresses: "*"
postgresql_port: 5432
postgresql_wal_level: "replica"
postgresql_max_wal_senders: 10
postgresql_max_replication_slots: 10
postgresql_wal_keep_segments: 100
postgresql_hot_standby: on
postgresql_archive_mode: on
postgresql_archive_command: "test ! -f /tmp/%f && cp %p /tmp/%f"
postgresql_ext_install_repmgr: yes
postgresql_shared_preload_libraries:
- repmgr
# Registros de postgresql
postgresql_log_checkpoints: on
postgresql_log_connections: on
postgresql_log_disconnections: on
postgresql_log_temp_files: 0
# pg_hba.conf
postgresql_pg_hba_custom:
- { type: "host", database: "all", user: "all", address: "192.168.56.0/24", method: "md5" }
- { type: "host", database: "replication", user: "{{ repmgr_user }}", address: "192.168.56.0/24", method: "trust" }
- { type: "host", database: "replication", user: "{{ repmgr_user }}", address: "127.0.0.1/32", method: "trust" }
- { type: "host", database: "{{ repmgr_database }}", user: "{{ repmgr_user }}", address: "127.0.0.1/32", method: "trust" }
- { type: "host", database: "{{ repmgr_database }}", user: "{{ repmgr_user }}", address: "192.168.56.0/32", method: "trust" }
# Bases de datos
postgresql_databases:
- name: "{{ repmgr_database }}"
owner: "{{ repmgr_user }}"
encoding: "UTF-8"
- name: testdb
owner: admin
encoding: "UTF-8"
# Usuarios
postgresql_users:
- name: "{{ repmgr_user }}"
pass: "{{ repmgr_password }}"
- name: admin
pass: secret # postgresql >=10 no acepta contraseñas no encriptadas
encrypted: yes
# Roles
postgresql_user_privileges:
- name: "{{ repmgr_user }}"
db: "{{ repmgr_database }}"
priv: "ALL"
role_attr_flags: "SUPERUSER,REPLICATION"
- name: admin
db: testdb
role_attr_flags: "SUPERUSER"
Comandos útiles para ejecutar después de tu primera instalación
Verificar la funcionalidad del clúster
ansible pgcluster -b --become-user postgres -m shell -a "repmgr cluster crosscheck"
Mostrar el estado del clúster
ansible pgcluster -b --become-user postgres -m shell -a "repmgr cluster show"
Listar nodos y sus atributos
ansible pgcluster -b --become-user postgres -m shell -a "repmgr node status"
Registrar (clonar) un nodo en espera adicional
# Suponiendo que el nombre del host primario actual es pgsql01
ansible-playbook myplaybook.yml -l 'pgsql04' -e 'repmgr_primary_hostname=pgsql01' -vv
Registrar antiguo primario como nodo en espera después de un failover automático
postgres@pgsql01:~$ pg_ctlcluster 13 main stop
postgres@pgsql01:~$ repmgr standby clone --force -h pgsql02 -U repmgr -d repmgr
postgres@pgsql01:~$ pg_ctlcluster 13 main start
postgres@pgsql01:~$ repmgr standby register --force
O puedes usar el reingreso de nodo repmgr con pg_rewind
repmgr node rejoin -d repmgr -U repmgr -h pgsql02 --verbose --force-rewind=/usr/lib/postgresql/13/bin/pg_rewind
Licencia
MIT / BSD
Install and configure PostgreSQL cluster managed with repmgr. Add dependencies, extensions, databases and users.
ansible-galaxy install fidanf.postgresql_ha