No description
- Jinja 100%
| defaults | ||
| handlers | ||
| meta | ||
| static | ||
| tasks | ||
| templates | ||
| .ansible-lint | ||
| example-playbook.yml | ||
| LICENCE.md | ||
| README.md | ||

PostgreSQL Ansible Role
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âchespostgresql-validate- Validation des prérequispostgresql-user- Gestion utilisateurpostgresql-podman- Configuration Podmanpostgresql-deploy- Déploiement conteneurpostgresql-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