Paris, le 28 août 2025

Ceci est le second article dans la série sur l’industrialisation de PostgreSQL. Nous allons voir dans celui-ci comment installer pglift et les composants additionnels requis. Nous allons ensuite déployer une instance accompagnée d’un exporter prometheus pour sa supervision.

pglift est le composant au cœur de la plateforme, il permet le déploiement industriel des instances. Il peut être manipulé en ligne de commande, ou par le biais d’un module Ansible, ce qui sera la méthode favorisée dans le reste de cet article.

Installation de pglift, PostgreSQL et ses outils satellites

L’outil pglift, développé en Python, requiert une version 3.10 ou plus de Python sous une distribution Linux. Quant à PostgreSQL, la version officielle est supporté sur plusieurs distributions Linux (Debian, Red Hat/Rocky, Ubuntu…). L’installation présentée ici sera réalisé à l’aide d’Ansible et des collections Dalibo publiques sur une machine virtuelle Rocky Linux 9. Cela nécessite donc quelques prérequis à installer sur cette machine virtuelle.

Prérequis

Sur le nœud managé :

  • Python >=3.10
  • Une connexion SSH sur un utilisateur avec les droits sudo

Sur le nœud de contrôle Ansible :

  • Ansible Core >=2.13.0
  • Python >=3.9

De plus, il est nécessaire d’installer les collections Ansible sur le nœud de contrôle qui seront utilisés au sein des playbooks. Pour faciliter l’installation des différentes collections, nous allons les consigner au sein d’un fichier :

$ cat requirements.yaml
collections:
  - dalibo.pglift
  - dalibo.essential
  - dalibo.extras

Puis procéder à l’installation avec la commande suivante :

$ ansible-galaxy install -r requirements.yaml 

Le fichier d’inventaire

Dans l’exemple de cet article, l’inventaire Ansible sera relativement simple étant donné que nous allons déployer pglift et PostgreSQL au sein d’une seule machine virtuelle :

$ cat inventory 
srv-pg1 ansible_host=192.168.122.19 ansible_user=ansible

[database]
srv-pg1

Nous ajoutons donc notre hôte srv-pg1 dans un groupe nommé database.

Un playbook simple

Voici un exemple de playbook simple pour la partie installation (setup.yaml):

---

- name: Install Repos, pglift and PostgreSQL
  hosts: database
  gather_facts: true
  become: true
  vars:
    postgresql_major_version: 17
    pglift_lingering_mode: true
    pglift_configure_shell_completion: true
    pglift_settings_content:
      systemd: {}
      postgresql:
        default_version: '17'
        datadir: '/var/lib/pgsql/{version}/{name}/data'
        waldir: '/var/lib/pgsql/{version}/{name}/wal'
  pre_tasks:
    - name: Ensure the crb repository is enabled
      community.general.dnf_config_manager:
        name: crb
        state: enabled
  roles:
    - dalibo.extras.repo_epel
    - dalibo.extras.repo_dalibo_labs
    - dalibo.essential.repo_pgdg
    - dalibo.essential.postgresql
    - dalibo.essential.prometheus_postgres_exporter
    - dalibo.essential.pglift

Avec ce playbook, le groupe d’hôtes database est ciblé. Plusieurs rôles seront alors exécutés afin d’installer les dépôts de paquets nécessaires à l’installation de PostgreSQL et quelques outils satellites.

Par la suite, l’installation de PostgreSQL et de l’exporter prometheus postgres-exporter est réalisée à l’aide du rôle dalibo.essential.postgresql et dalibo.essential.prometheus_postgres_exporter. La version de PostgreSQL est déterminée par la variable Ansible postgresql_major_version.

Le rôle dalibo.essential.pglift se chargera d’installer pglift, en utilisant pip et d’appliquer une configuration initiale. Cette configuration est assurée par la variable pglift_settings_content, au format YAML.

Nous pouvons désormais exécuter ce playbook avec l’inventaire créé précédemment :

$ ansible-playbook -i inventory setup.yaml

À la fin de cette exécution, nous pourrons alors déployer notre première instance à l’aide du module dalibo.pglift.instance de la collection dalibo.pglift.

Déploiement de l’instance avec le module Ansible pglift

Maintenant que pglift est installé et configuré, il est possible de déployer des instances.

Le déploiement de l’instance PostgreSQL peut se faire à l’aide d’un playbook. Celui-ci appelle le module dalibo.pglift.instance dans une tâche à destination de notre groupe d’hôtes database :

---
- name: Deploy PostgreSQL instance
  hosts: database
  become: true
  become_user: postgres
  become_flags: "-i"
  tasks:
    - name: Instance main
      dalibo.pglift.instance:
        name: main
        port: 5432
        settings:
          shared_buffers: 1GB
        roles:
          - name: alice
            login: true
        databases:
          - name: db1
            owner: alice

Contrairement au playbook d’installation qui contenait seulement une clause become: true, ce playbook contient également la clause become_user: postgres pour spécifier que les actions sont à exécuter en tant que postgres sur le serveur. On ajoute également become_flags: "-i" pour que le PATH de l’utilisateur postgres soit bien chargé lors de l’exécution, ce qui permet de s’assurer de la disponibilité du binaire de pglift.

Le module accepte des options de configuration pour PostgreSQL. Ici, nous configurons un cache disque (shared_buffers) de 1GB.

Il est également possible de créer des rôles et bases de données dès le déploiement de l’instance en les spécifiant lors de l’appel du module. La base de données db1 et le rôle alice sont ainsi créés sur notre instance sans action supplémentaire.

Exécuter le playbook pour procéder au déploiement de l’instance :

$ ansible-playbook -i inventory instance_main.yaml

Depuis le serveur PostgreSQL, en tant que postgres, on peut vérifier la présence de notre nouvelle instance :

[postgres@srv-pg1 ~]$ pglift instance list
┏━━━━━━┳━━━━━━━━━┳━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━┓
┃ name ┃ version ┃ port ┃ datadir                     ┃ status  ┃
┡━━━━━━╇━━━━━━━━━╇━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━┩
│ main │ 17      │ 5432 │ /var/lib/pgsql/17/main/data │ running │
└──────┴─────────┴──────┴─────────────────────────────┴─────────┘

Pour obtenir une instance similaire avec l’interface de ligne de commande de pglift, on aurait exécuté les commandes suivantes :

$ pglift instance create main --port 5432
$ pglift pgconf set shared_buffers=1GB
$ pglift role create alice --login
$ pglift database create db1 --owner alice

Administration de l’instance PostgreSQL

Gestion de l’état de l’instance

Pour arrêter, démarrer, ou redémarrer l’instance via Ansible, on peut jouer sur la clause state du module dalibo.pglift.instance. Pour un état arrêté, on lui passe la valeur stopped. Pour l’état démarré, la valeur started. Enfin, pour la redémarrer, la valeur restarted.

Ainsi, à chaque exécution du playbook suivant, l’instance est redémarée :

- name: Deploy PostgreSQL instance
  hosts: database
  become: true
  gather_facts: true
  become_flags: "-i"
  become_user: postgres
  tasks:
    - name: Instance main
      dalibo.pglift.instance:
        name: main
        port: 5432
        settings:
          shared_buffers: 1GB
        roles:
          - name: alice
            login: true
        databases:
          - name: db1
            owner: alice
        state: restarted

En ligne de commande, la gestion d’état se fait avec les commandes pglift suivantes :

$ pglift instance stop main
$ pglift instance start main
$ pglift instance restart main

Gestion du paramètrage

Pour faire évoluer le paramétrage de l’instance avec Ansible, il est possible de modifier la configuration dans notre playbook, et le re-exécuter.

Ainsi, le playbook suivant peut être exécuté pour modifier la valeur du cache disque (shared_buffers), tout en définissant une valeur pour work_mem.

- name: Deploy PostgreSQL instance
  hosts: database
  become: true
  gather_facts: true
  become_flags: "-i"
  become_user: postgres
  tasks:
    - name: Instance main
      dalibo.pglift.instance:
        name: main
        port: 5432
        settings:
          shared_buffers: 500MB
          work_mem: 20MB
        roles:
          - name: alice
            login: true
        databases:
          - name: db1
            owner: alice
        state: restarted

Nous conservons la clause state: restarted ajoutée à l’étape précédente, ici elle nous rend même service. En effet, le paramètre shared_buffers nécessite un redémarrage de l’instance pour être pris en compte. Lors de l’exécution de ce playbook ainsi modifié, l’instance est redémarrée après la mise à jour des paramètres.

Après l’exécution du playbook, la nouvelle valeur pour shared_buffers est donc directement effective, en plus de celle du work_mem :

[17/main] postgres@~=# show shared_buffers;
 shared_buffers
----------------
 500MB
(1 row)

[17/main] postgres@~=# show work_mem;
 work_mem
----------
 20MB
(1 row)

En ligne de commande, la modification des paramètres se fait avec la commande pglift pgconf, de la façon suivante :

$ pglift pgconf set work_mem=20MB
$ pglift pgconf set shared_buffers=500MB

Lorsque le paramètre modifié peut être pris en compte à chaud, la configuration de l’instance est simplement rechargée, mais lorsque le paramètre nécessite un redémarrage, comme par exemple le shared_buffers, la commande propose de redémarrer l’instance via un prompt interactif :

$ pglift pgconf set shared_buffers=500MB;
INFO     configuring PostgreSQL
WARNING  instance 17/main needs restart due to parameter changes: shared_buffers
> PostgreSQL needs to be restarted; restart now? [y/n] (n): y
INFO     restarting systemd unit pglift-postgresql@17-main.service
shared_buffers: 1GB -> 500MB

Bases de données et rôles

Nous avons vu que le module dalibo.pglift.instance était capable de déployer pour nous des bases de données et rôles lors de la création d’instance. On pourrait imaginer gérer ces derniers dans le playbook de création d’instance, mais pglift fournit aussi des modules dédiés à la gestion des bases de données (dalibo.pglift.database) et des rôles (dalibo.pglift.role).

Il est ainsi possible d’éxecuter le playbook suivant pour ajouter un rôle bob et la base de données db2, dont il sera propriétaire, et qui sera initalisée avec un schéma s1 :

- name: Deploy role and database
  hosts: database
  become: true
  gather_facts: true
  become_flags: "-i"
  become_user: postgres
  tasks:
    - name: Role bob
      dalibo.pglift.role:
        name: bob
        instance: main
        login: true
        createdb: true
    - name: Database db2
      dalibo.pglift.database:
        name: db2
        instance: main
        owner: bob
        schemas:
          - name: s1
            owner: bob

En ligne de commande, il est possible de créer des rôles et bases de données avec les commandes suivantes :

$ pglift role create bob --login --createdb
$ pglift database create db2 --owner bob --schema s1

Ressources utiles

Pour aller plus loin dans l’utilisation de pglift et des collections Ansible, voici une sélection de ressources :

D’autres fonctionnalités utiles de pglift seront également abordées dans cette serie d’article sur l’industrialisation de PostgreSQL.

Conclusion

Avec l’aide des collections Ansible ainsi que du module pglift, l’installation et la configuration d’une instance PostgreSQL sont simplifiées et intégrables dans une démarche d’industrialisation. Avec quelques fichiers déclaratifs et une commande Ansible, on obtient une instance avec ses bases de données et rôles, fonctionnelle tout en suivant les bonnes pratiques.

Ce second article est une introduction à l’utilisation de pglift. Les prochains articles couvriront des sujets plus avancés comme la sauvegarde logique ou physique, la supervision ou encore la haute-disponibilité.


DALIBO

DALIBO est le spécialiste français de PostgreSQL®. Nous proposons du support, de la formation et du conseil depuis 2005.