fidanf.postgresql_ha

Alta Disponibilidad de PostgreSQL

Estado de la construcción

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:

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

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

Acerca del proyecto

Install and configure PostgreSQL cluster managed with repmgr. Add dependencies, extensions, databases and users.

Instalar
ansible-galaxy install fidanf.postgresql_ha
Licencia
mit
Descargas
676
Propietario
DevOps Engineer ~ Ansible lover & CI/CD builder. I'm learning to more effectively deploy and monitor apps every day.