No description
- Jinja 100%
| defaults | ||
| handlers | ||
| meta | ||
| tasks | ||
| templates | ||
| tests | ||
| vars | ||
| LICENCE.md | ||
| README.md | ||
Rôle Ansible : Traefik
Déploiement de Traefik en tant que reverse proxy dans un conteneur Podman rootless.
Prérequis
- Rôle
podmanappliqué - Collection
ansible.posix - Collection
containers.podman
ansible-galaxy collection install ansible.posix containers.podman
Variables principales
Utilisateur et permissions
traefik_user: traefik
traefik_group: traefik
traefik_home: /home/traefik
traefik_shell: /usr/sbin/nologin
Version et image
traefik_version: "v3.2"
traefik_image: "docker.io/traefik"
Configuration statique
Option 1 : Utiliser le template par défaut (recommandé)
# Le rôle utilise templates/traefik.yml.j2
# Personnalisable via variables (dashboard, acme, logs, etc.)
Option 2 : Fournir un fichier complet
# Utiliser votre propre fichier de configuration
traefik_config_file: "{{ playbook_dir }}/files/traefik/traefik.yml"
Si traefik_config_file est défini, il remplace complètement le template.
Répertoires
traefik_config_dir: /etc/traefik
traefik_dynamic_dir: /etc/traefik/dynamic
traefik_acme_dir: /etc/traefik/acme
traefik_dynamic_local_dir: "{{ playbook_dir }}/files/traefik/dynamic"
Réseau et ports
traefik_network_mode: host
traefik_http_port: 80
traefik_https_port: 443
traefik_dashboard_port: 8080
Dashboard
traefik_dashboard_enabled: true
traefik_dashboard_insecure: false
ACME / Let's Encrypt
traefik_acme_enabled: false
traefik_acme_email: ""
traefik_acme_ca_server: "https://acme-v02.api.letsencrypt.org/directory"
Providers
traefik_providers_file: true
traefik_providers_docker: false
Utilisation
Playbook minimal
- hosts: traefik
become: true
roles:
- podman
- traefik
Avec Let's Encrypt
- hosts: traefik
become: true
vars:
traefik_acme_enabled: true
traefik_acme_email: "admin@example.com"
roles:
- podman
- traefik
Avec configuration statique personnalisée
Créer votre fichier :
# files/traefik/traefik.yml
global:
checkNewVersion: false
entryPoints:
web:
address: ":80"
websecure:
address: ":443"
api:
dashboard: true
providers:
file:
directory: /etc/traefik/dynamic
L'utiliser dans le playbook :
- hosts: traefik
become: true
vars:
traefik_config_file: "{{ playbook_dir }}/files/traefik/traefik.yml"
roles:
- podman
- traefik
Avec configuration dynamique
# Structure des fichiers
playbook_dir/
└── files/
└── traefik/
└── dynamic/
├── middlewares.yml
└── routers.yml
Exemple files/traefik/dynamic/middlewares.yml :
http:
middlewares:
security-headers:
headers:
sslRedirect: true
stsSeconds: 31536000
stsIncludeSubdomains: true
Exemple files/traefik/dynamic/routers.yml :
http:
routers:
my-app:
rule: "Host(`app.example.com`)"
service: my-app
entryPoints:
- websecure
tls:
certResolver: letsencrypt
services:
my-app:
loadBalancer:
servers:
- url: "http://192.168.1.100:8080"
Structure du rôle
roles/traefik/
├── defaults/
│ └── main.yml # Variables par défaut
├── tasks/
│ └── main.yml # Tâches principales
├── handlers/
│ └── main.yml # Handler restart
├── templates/
│ └── traefik.yml.j2 # Configuration statique
├── meta/
│ └── main.yml # Dépendances
├── README.md
└── LICENSE.md
Tags disponibles
# Installation utilisateur uniquement
ansible-playbook playbook.yml --tags "user"
# Configuration uniquement
ansible-playbook playbook.yml --tags "config"
# Conteneur uniquement
ansible-playbook playbook.yml --tags "container"
# Service uniquement
ansible-playbook playbook.yml --tags "service"
Vérification
# Status du conteneur
ssh traefik@server "podman ps"
# Logs
ssh traefik@server "podman logs traefik"
# Status du service
ssh traefik@server "systemctl --user status container-traefik"
# Dashboard (si activé)
curl http://server:8080/dashboard/
Mise à jour de Traefik
# group_vars/traefik.yml
traefik_version: "v3.3" # Nouvelle version
Puis :
ansible-playbook playbook.yml --tags "container"
Dépannage
Conteneur ne démarre pas
# Vérifier les logs
ssh traefik@server "podman logs traefik"
# Vérifier la config
ssh traefik@server "cat /etc/traefik/traefik.yml"
Ports privilégiés ne fonctionnent pas
# Vérifier sysctl
sysctl net.ipv4.ip_unprivileged_port_start
# Doit retourner: 0
Service ne démarre pas au boot
# Vérifier linger
loginctl show-user traefik | grep Linger
# Doit retourner: Linger=yes
Sécurité
- ✅ Conteneur rootless (user traefik)
- ✅ Configuration en lecture seule
- ✅ ACME storage avec permissions 600
- ✅ Dashboard désactivable
- ✅ Logs access désactivables
Licence
GPLv3 or later
Copyright (C) 2026 HUTIT
Auteur
Hutaeh - HUTIT