No description
Find a file
2026-02-12 18:37:13 +01:00
defaults Fix lint 2026-02-12 18:37:13 +01:00
handlers Fix lint 2026-02-12 18:37:13 +01:00
meta Fix lint 2026-02-12 18:37:13 +01:00
tasks Fix lint 2026-02-12 18:37:13 +01:00
templates Initial commit 2026-01-12 13:03:59 +01:00
tests Initial commit 2026-01-12 13:03:59 +01:00
vars Initial commit 2026-01-12 13:03:59 +01:00
LICENCE.md Initial commit 2026-01-12 13:03:59 +01:00
README.md Initial commit 2026-01-12 13:03:59 +01:00

Rôle Ansible : Traefik

Déploiement de Traefik en tant que reverse proxy dans un conteneur Podman rootless.

Prérequis

  • Rôle podman appliqué
  • 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