Industrialisation PostgreSQL avec pglift et Ansible

Atelier Industrialisation PostgreSQL

Dalibo & Contributors

Présentation

Introduction

Présentation de pglift

  • Permet de déployer et de gérer des instances PostgreSQL uniformisées
  • Instances prêtes pour la production dès leur déploiement
  • Capable de déployer des instances en réplication avec patroni
  • Prends en charge pgBackRest en mode local ou distant

CLI

  • L’ensemble de ces fonctionnalités sont exposées dans une interface en ligne de commande

Ansible (Collection dalibo.pglift)

  • Fonctionnalités de pglift accessibles depuis la collection dalibo.pglift
  • Permet d’intégrer pglift dans un processus de déploiement automatisé ansible

Ansible (Collections dalibo.essential, dalibo.advanced, dalibo.extras)

  • Permet une installation et un déploiement automatisé de l’ensemble des éléments nécessaires à pglift
  • Chaque collection est spécifique à un thème :
    • dalibo.essential : PostgreSQL, réplication, monitoring, sauvergarde
    • dalibo.advanced : HA, performances, audit, ldap, pooler
    • dalibo.extras : Tous les outils annexes (ETCD,rsyslog, logrotate, etc)

Installation et création d’instance avec pglift (CLI).

Pré-requis

  • Dépôts Powertools, EPEL, PGDG et Dalibo Labs
  • Utilisateur système postgres
  • Activer le lingering

Installation de PostgreSQL

Installer PostgreSQL 16 :

[root@srv-pg1 ~]# dnf install -y postgresql16 postgresql16-server \
postgresql16-contrib

Installation de pgBackrest

Installer pgBackRest :

[root@srv-pg1 ~]# dnf install -y pgbackrest

Installation de pglift

pipx

Installer pglift avec pipx, en tant que postgres :

[root@srv-pg1 ~]# su - postgres << EOF
  pip3.9 install pipx
  ~/.local/bin/pipx install "pglift[cli]" --include-deps
  ~/.local/bin/pipx ensurepath
EOF

Ouvrir une nouvelle session est nécessaire pour que le binaire pglift soit dans le ${PATH} de l’utilisateur postgres

Configuration initiale

  • Fichier de configuration pglift :
    • ~/.config/pglift/settings.yaml
    • /etc/pglift/settings.yaml
  • Template de configuration PostgreSQL et pgBackRest
  • Installer la configuration de site : pglift site-configure install

Déploiement d’une instance (CLI)

[postgres@srv-pg1 ~]$ pglift instance create main \ 
--pgbackrest-stanza=main

Installation et création d’instance avec pglift (Ansible).

Inventaire

Inventaire Ansible : ~/ansible/inventory

srv-pg1      ansible_user=dalibo ansible_port=2201 ansible_host=51.158.107.167
srv-helper1  ansible_user=dalibo ansible_port=2202 ansible_host=51.158.107.167

[database]
srv-pg1

[primary]
srv-pg1

[standby]
srv-pg1

[temboard]
srv-helper1

Collection

collections:
  - dalibo.pglift
  - community.general
  - dalibo.essential
  - dalibo.advanced
  - dalibo.extras
[dalibo@srv-helper1 ~/ansible]$ ansible-galaxy collection install -fr collections/requirements.yml

Installation de temBoard UI

  • Roles :
    • dalibo.essential.temboard : Pour l’installation
    • temboard : Pour la configuration
  • Playbook : temboard.yml
[dalibo@srv-helper1 ~/ansible]$ ansible-playbook -i inventory temboard.yml

Installation de l’environnement

- name: Install Database Server
  hosts: database
  become: true
  roles:
    - dalibo.extras.repo_epel
    - dalibo.essential.repo_pgdg
    - dalibo.essential.repo_dalibo
    - dalibo.extras.accounts
    - dalibo.essential.postgresql
    - dalibo.essential.pgbackrest
    - dalibo.essential.temboard_agent
    - dalibo.essential.pglift
[dalibo@srv-helper1 ~/ansible]$ ansible-playbook -i inventory postgresql.yml

Déploiement d’une instance avec Ansible

  • Module dalibo.pglift.instance

Création de l’instance

---

- name: Deploy a standalone Instance
  hosts: primary
  become: true
  become_user: postgres
  tasks:
    - name: Create Instance
      dalibo.pglift.instance:
        name: main
        state: started
        version: 16
        port: 5432
        surole_password: Passw0rd
        pgbackrest:
          password: Passw0rd
          stanza: main-stz
        temboard:
          password: Passw0rd
        replrole_password: Passw0rd
        databases:
          - name: ws1
[dalibo@srv-helper1 ~/ansible]$ ansible-playbook -i inventory instance_standalone.yml

Création d’un secondaire en streaming réplication

---
- name: Deploy standby Instance
  hosts: standby
  become: true
  become_user: postgres
  tasks:
    - name: Creating standby Instance
      dalibo.pglift.instance:
        name: standby
        state: started
        version: 16
        port: 5433
        surole_password: Passw0rd
        pgbackrest:
          password: Passw0rd
          stanza: main-stz
        standby:
          primary_conninfo: "host=127.0.0.1 user=replication port=5432"
          password: Passw0rd
        temboard:
          password: Passw0rd
          port: 2346
[dalibo@srv-helper1 ~/ansible]$ ansible-playbook -i inventory standby_instance.yml

Sauvegarde et Restauration pgbackrest avec pglift

Rappel Point In Time Recovery (PITR)

  • Point In Time Recovery
  • À chaud
  • En continu
  • Cohérente

Sauvegarde

[postgres@srv-pg1 ~]$ pglift instance backup main
INFO     backing up instance 16/main with pgBackRest

Restauration

[postgres@srv-pg1 ~]$ pglift instance stop main
INFO     stopping PostgreSQL 16-main
[postgres@srv-pg1 ~]$ pglift instance restore main --date '2024-01-18 08:48:43'
INFO     restoring instance 16/main with pgBackRest

Manipulation d’instances avec pglift

Lister les instances

[postgres@srv-pg1 ~]$ pglift instance list

Obtenir la descriptions des instances

[postgres@srv-pg1 ~]$ pglift instance get main

Obtenir le statut d’une instance

[postgres@srv-pg1 ~]$ pglift instance status main

Gestion de l’état

[postgres@srv-pg1 ~]$ pglift instance start main
[postgres@srv-pg1 ~]$ pglift instance stop main
[postgres@srv-pg1 ~]$ pglift instance restart main
[postgres@srv-pg1 ~]$ pglift instance reload main

Consulter les traces

[postgres@srv-pg1 ~]$ pglift instance logs main

Gestion de la configuration de PostgreSQL

  • pglift peut manipuler la configuration des instances PostgreSQL avec la commande pglift pgconf
  • Opérations possibles : edit, remove, set, show

Modifier la configuration

[postgres@srv-pg1 ~]$ pglift pgconf -i main edit
[postgres@srv-pg1 ~]$ pglift pgconf -i main set

Afficher la configuration

[postgres@srv-pg1 ~]$ pglift pgconf -i main show

Supprimer une configuration

[postgres@srv-pg1 ~]$ pglift pgconf -i main remove

Gestion du pg_hba.conf

  • pglift peut manipuler le pg_hba.conf avec la commande pglift pghba
  • Opérations possibles : add, remove

Maintenance des données

[postgres@srv-pg1 ~]$ pglift database -i main run "ANALYZE"
[postgres@srv-pg1 ~]$ pglift database -i main run -d postgres "VACUUM FULL"
[postgres@srv-pg1 ~]$ pglift database -i main run -x postgres "VACUUM"

Opérations sur les roles

[postgres@srv-pg1 ~]$ pglift role
tasks:
  - name: my role
    dalibo.pglift.role:
      instance: main
      name: dba
      pgpass: true
      login: true
      connection_limit: 10
      valid_until: '2025-01-01T00:00'
      memberships:
        - role: pg_read_all_stats

Opérations sur les bases de données

[postgres@srv-pg1 ~]$ pglift database
tasks:
- name: my database
  dalibo.pglift.database:
    instance: main
    name: myapp
    owner: dba

Réplication

[postgres@srv-pg1 ~]$ pglift database create --stanby-for
tasks:
  - name: Creating standby Instance
    dalibo.pglift.instance:
      name: standby
      [...]
      standby:
        primary_conninfo: "host=X.X.X.X user=replication port=5432"
        password: Passw0rd

Gestion de parc d’instances avec temBoard.

Présentation de temBoard

  • temBoard : supervision et administration de PostgreSQL
  • Un composant serveur, paquet temboard
  • Un agent pour les serveurs PostgreSQL, paquet temboard-agent

Enregistrement de l’instance

---

- name: Get instances gather facts
  hosts: database
  gather_facts: true

- name: Register instances in temBoard
  hosts: temboard
  connection: local
  gather_facts: true
  become: true
  tasks:
    - name: Register instances in temBoard
      become_user: temboard
      ansible.builtin.shell: "temboard register-instance {{ hostvars[item]['ansible_default_ipv4']['address'] }} 2345 -e default"
      loop: "{{ groups['primary'] }}"

    - name: Register instances in temBoard
      become_user: temboard
      ansible.builtin.shell: "temboard register-instance {{ hostvars[item]['ansible_default_ipv4']['address'] }} 2346 -e default"
      loop: "{{ groups['standby'] }}"
[dalibo@srv-helper1 ~/ansible]$ ansible-playbook -i inventory temboard_register.yml

Visualisation des métriques

  • Vue Dashboard : Résumé des métriques
  • Vue Activity : Activité de l’instance en temps réel
  • Vue Monitoring : Afficher des métriques sous forme de graphes
  • Vue Status : Statut des sondes de supervision
  • Vue Maintenance :
    • Informations sur l’utilisation des disques
    • Possibilité de déclencher des opérations de maintenance (VACUUM [FULL], ANALYZE, REINDEX)
  • Vue Configuration : Modifier le paramétrage de l’instance