1
0
Fork 0
No description
Find a file
Mathieu Fruchet 2b5b42a46d fix lint
2026-02-12 00:50:09 +01:00
defaults Première version du rôle 2026-01-30 01:03:03 +01:00
handlers Première version du rôle 2026-01-30 01:03:03 +01:00
meta Fix collection name dependencies 2026-01-30 01:07:51 +01:00
static Minor Fix 2026-01-30 01:04:13 +01:00
tasks fix lint 2026-02-12 00:50:09 +01:00
templates Première version du rôle 2026-01-30 01:03:03 +01:00
.ansible-lint Première version du rôle 2026-01-30 01:03:03 +01:00
example-playbook.yml Première version du rôle 2026-01-30 01:03:03 +01:00
LICENCE.md Première version du rôle 2026-01-30 01:03:03 +01:00
README.md Minor Fix 2026-01-30 01:04:13 +01:00

PostgreSQL Ansible Role

Version Button: GPL v3 Static Badge Static Badge

Ce rôle Ansible déploie PostgreSQL en utilisant Podman en mode rootless.

Prérequis

  • Ansible >= 2.14
  • Collection ansible.posix
  • Collection containers.podman
  • podman
  • systemd

Variables du Rôle

Utilisateur et système

Variable Défaut Description
postgresql_user postgresql Nom de l'utilisateur système
postgresql_group postgresql Groupe de l'utilisateur
postgresql_uid UID de l'utilisateur
postgresql_gid GID du groupe
postgresql_home /home/postgresql Répertoire home
postgresql_subuid_start 10000 Début de la plage SetUID de l'utilisateur
postgresql_subuid_range 65536 Taille de la plage SetUID de l'utilisateur
postgresql_subgid_start 10000 Début de la plage SetGID du groupe
postgresql_subgid_range 65536 Taille de la plage SetGID du groupe

Image et conteneur

Variable Défaut Description
postgresql_version 18-trixie Version/tag de l'image
postgresql_image docker.io/library/postgres:{{ postgresql_version }} Image complète
postgresql_container_name postgresql Nom du conteneur

Point de montage

Variable Défaut Description
postgresql_data_dir {{ postgresql_home }}/data Répertoire contenant les données PostgreSQL
postgresql_init_dir {{ postgresql_home }}/initdb.d Répertoire contenant les scripts d'initialisation (optionnel)

Scripts d'initialisation

Variable Défaut Description
postgresql_init_scripts [] Liste des scripts d'initialisation (.sql, .sql.gz, .sh) à copier dans /docker-entrypoint-initdb.d

Réseau

Variable Défaut Description
postgresql_podman_network host Réseau utilisé par le conteneur
postgresql_port 5432 Port PostgreSQL exposé
postgresql_bind_address 0.0.0.0 Adresse d'écoute

Ressources

Variable Défaut Description
postgresql_container_memory 512m Limite mémoire
postgresql_container_cpus 1 Limite CPU

Service

Variable Défaut Description
postgresql_service_enabled true Active le lancement du conteneur au démarrage
postgresql_enable_lingering true Active le lingering systemd pour l'utilisateur

PostgreSQL Configuration

L'ensemble de la configuration peut être défini sous la forme de variables d'environnement. Voir la documentation officielle : https://hub.docker.com/_/postgres (section "Environment Variables")

Variable Défaut Description
postgresql_env_config {} Dictionnaire contenant les variables d'environnement de configuration PostgreSQL (ex: POSTGRES_PASSWORD, POSTGRES_USER, POSTGRES_DB)

Exemple d'utilisation

Playbook simple

---
- name: Déployer PostgreSQL
  hosts: database_servers
  become: true

  roles:
    - role: postgresql
      vars:
        postgresql_port: 5432
        postgresql_env_config:
          POSTGRES_PASSWORD: "secure_password"
          POSTGRES_USER: "postgres"
          POSTGRES_DB: "postgres"

Playbook avec scripts d'initialisation

---
- name: Déployer PostgreSQL avec base terraform
  hosts: database_servers
  become: true

  roles:
    - role: postgresql
      vars:
        postgresql_env_config:
          POSTGRES_PASSWORD: "secure_password"
        postgresql_init_scripts:
          - init-terraform-backend.sh

Exemple de script files/init-terraform-backend.sh :

#!/usr/bin/env bash
set -e

psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
    CREATE DATABASE terraform_backend;
    CREATE USER terraform WITH PASSWORD 'terraform_password';
    GRANT ALL PRIVILEGES ON DATABASE terraform_backend TO terraform;
EOSQL

Inventaire exemple

[database_servers]
db01.example.com

[database_servers:vars]
ansible_user=deploy
ansible_become=true

Structure du déploiement

/home/postgresql/
├── .config/
│   ├── containers/
│   │   ├── storage.conf
│   │   └── registries.conf
│   └── systemd/user/
│       └── container-postgresql.service
├── .local/share/containers/
├── data/                    # Données PostgreSQL
└── initdb.d/               # Scripts d'initialisation (si configurés)

Gestion du service

Le service est géré via systemd utilisateur:

# Connexion en tant que postgresql
sudo machinectl -q shell postgresql@
# Vérifier le statut
systemctl --user status container-postgresql.service

# Redémarrer
systemctl --user restart container-postgresql.service

# Voir les logs
journalctl --user -u container-postgresql.service -f

# Ou via podman
sudo -u postgresql podman logs -f postgresql

Connexion à PostgreSQL

# Depuis l'hôte
psql -h localhost -p 5432 -U postgres

# Depuis le conteneur
sudo -u postgresql podman exec -it postgresql psql -U postgres

Sauvegarde

Les données importantes sont dans:

  • {{ postgresql_data_dir }} - Base de données PostgreSQL

Exemple de sauvegarde:

# Dump de toutes les bases
sudo -u postgresql podman exec postgresql pg_dumpall -U postgres > backup.sql

# Dump d'une base spécifique
sudo -u postgresql podman exec postgresql pg_dump -U postgres -d mydb > mydb_backup.sql

Tags Ansible

  • postgresql - Toutes les tâches
  • postgresql-validate - Validation des prérequis
  • postgresql-user - Gestion utilisateur
  • postgresql-podman - Configuration Podman
  • postgresql-deploy - Déploiement conteneur
  • postgresql-systemd - Configuration service
# Exemple: seulement redéployer
ansible-playbook site.yml --tags postgresql-deploy

Dépannage

Le conteneur ne démarre pas

# Connexion en tant que postgresql
sudo machinectl -q shell postgresql@
# Vérifier les logs
podman logs postgresql

# Vérifier la configuration
podman inspect postgresql

Problèmes de permissions

# Vérifier les subuid/subgid
grep postgresql /etc/subuid /etc/subgid

# Réinitialiser le stockage si nécessaire
sudo -u postgresql podman system reset

Lingering non actif

# Activer manuellement
sudo loginctl enable-linger postgresql

# Vérifier
loginctl show-user postgresql --property=Linger

Problèmes de connexion

# Vérifier que PostgreSQL écoute
sudo -u postgresql podman exec postgresql psql -U postgres -c "SELECT version();"

# Vérifier les logs de connexion
sudo -u postgresql podman logs postgresql | grep "database system is ready"

Licence

GPL-3.0-or-later

Auteur

Hutaeh - HUTIT