Aller au contenu
English
English
Outils medium

envsubst : générer des configs dynamiques par variables d'environnement

11 min de lecture

envsubst remplace les variables d'environnement dans un texte ou un fichier modèle, pour générer des fichiers de configuration adaptés à chaque environnement sans les recréer à la main. Léger et sans dépendance, il fait partie de GNU gettext et brille dans les scripts shell et les pipelines CI/CD.

Ce guide s'adresse aux administrateurs système et développeurs qui veulent un templating simple. Vous allez voir la syntaxe, la substitution sélective, la génération de configs (nginx, Docker, Kubernetes), les bonnes pratiques et les limites face à des moteurs plus riches.

  • Substituer des variables d'environnement dans un fichier modèle.
  • Limiter la substitution à certaines variables avec SHELL-FORMAT.
  • Générer des configurations dans un pipeline CI/CD.
  • Éviter les pièges (variables non exportées ou non définies).
  • Choisir entre envsubst et un moteur de templates plus complet.

envsubst fait partie du paquet GNU gettext, principalement utilisé pour l’internationalisation des logiciels, mais cette commande en particulier sert surtout à injecter des valeurs dynamiques dans des fichiers texte à partir des variables d’environnement du shell.

Prenons un exemple simple :

Fenêtre de terminal
export NOM_SITE="mon-super-site.fr"
echo "Bienvenue sur \$NOM_SITE" | envsubst
Bienvenue sur mon-super-site.fr

Cela peut sembler basique, mais dans un contexte réel, comme la génération de fichiers de configuration comme nginx.conf, docker-compose.yml ou des manifestes Kubernetes, envsubst devient un outil clé pour automatiser les déploiements.

Avantages principaux :

  • Facile à intégrer dans des scripts shell ou des pipelines CI/CD.
  • Aucune dépendance externe (présent dans gettext, souvent préinstallé).
  • Permet de gérer des modèles de configuration dynamiques sans outils complexes.

C’est une solution légère, rapide et efficace pour tous les administrateurs systèmes et développeurs qui veulent automatiser la configuration sans passer par des outils de templating lourds.

La commande envsubst possède une syntaxe simple et directe, conçue pour remplacer les variables d’environnement dans une entrée texte, généralement un fichier ou un flux standard.

Fenêtre de terminal
envsubst [OPTION] [SHELL-FORMAT]

Par défaut, envsubst lit l’entrée depuis stdin (entrée standard) et écrit le résultat sur stdout (sortie standard).

Fenêtre de terminal
export HOSTNAME=serveur01
echo "Nom d'hôte : \$HOSTNAME" | envsubst
Nom d'hôte : serveur01

L’argument [SHELL-FORMAT] permet de limiter les substitutions aux variables spécifiées :

Fenêtre de terminal
envsubst '$USER $HOME' < input.txt

Cela permet d’éviter que certaines variables non voulues soient remplacées.

Utilisation simple avec des fichiers de configuration

Section intitulée « Utilisation simple avec des fichiers de configuration »

L’usage typique de envsubst concerne la génération de fichiers de configuration dynamiques à partir de modèles contenant des variables d’environnement.

Ce fichier, souvent avec une extension comme .template, contient des variables sous forme $VAR ou ${VAR} :

Fenêtre de terminal
# config.template
server {
listen 80;
server_name $SERVER_NAME;
root /var/www/$SITE_DIR;
}

Étape 2 : Définir les variables d’environnement

Section intitulée « Étape 2 : Définir les variables d’environnement »

Dans votre terminal ou script :

Fenêtre de terminal
export SERVER_NAME=example.com
export SITE_DIR=html

Utilisez la commande envsubst pour produire un fichier prêt à l’emploi :

Fenêtre de terminal
envsubst < config.template > config.conf

Le contenu du fichier config.conf :

server {
listen 80;
server_name example.com;
root /var/www/html;
}

Cette méthode est idéale pour automatiser la configuration de serveurs web (nginx, Apache), services Docker ou applications Node.js, sans dupliquer les fichiers selon les environnements. Grâce à envsubst, un seul template suffit : ce sont les variables exportées qui font toute la différence.

Par défaut, envsubst remplace toutes les variables d’environnement présentes dans le fichier ou le texte. Mais dans certains cas, vous ne souhaitez substituer que certaines variables spécifiques. C’est là qu’intervient l’argument SHELL-FORMAT.

Fenêtre de terminal
envsubst '$VAR1 $VAR2' < input.template > output.conf

Seules $VAR1 et $VAR2 seront remplacées, les autres resteront inchangées.

Exemple concret :

  • Fichier db.template :
DB_HOST=$DB_HOST
DB_USER=$DB_USER
DB_PASS=$DB_PASS
DB_PORT=$DB_PORT
  • Variables d’environnement définies :
Fenêtre de terminal
export DB_HOST=db.local
export DB_USER=admin
export DB_PASS=s3cret
export DB_PORT=5432

Les quatre variables sont bien définies, mais seules $DB_HOST et $DB_USER sont listées dans le SHELL-FORMAT ci-dessous, donc seules celles-là seront remplacées.

  • Commande :
Fenêtre de terminal
envsubst '$DB_HOST $DB_USER' < db.template > db.conf
  • Résultat :
DB_HOST=db.local
DB_USER=admin
DB_PASS=$DB_PASS
DB_PORT=$DB_PORT

Les variables non listées dans le SHELL-FORMAT ($DB_PASS et $DB_PORT) sont laissées intactes.

Cette fonctionnalité permet une plus grande maîtrise lors de la substitution, surtout quand :

  • plusieurs outils manipulent le même fichier modèle.
  • certaines variables doivent être définies plus tard ou par un autre processus.
  • on souhaite éviter de remplacer accidentellement des variables critiques.

La commande envsubst s’intègre parfaitement dans les pipelines de déploiement CI/CD, car elle permet de générer à la volée des fichiers de configuration adaptés à l’environnement cible (développement, staging, production...).

Exemple avec un manifeste Kubernetes :

  • Fichier deployment.yaml.template :
apiVersion: apps/v1
kind: Deployment
metadata:
name: $APP_NAME
spec:
replicas: $REPLICAS
template:
spec:
containers:
- name: $APP_NAME
image: $IMAGE_NAME
  • Variables exportées dans le pipeline :
Fenêtre de terminal
export APP_NAME=mon-app
export REPLICAS=3
export IMAGE_NAME=registry.example.com/mon-app:latest
  • Intégration dans un pipeline Github :
jobs:
deploy:
runs-on: ubuntu-24.04
steps:
- name: Checkout code
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Generate deployment file
run: |
envsubst < .k8s/deployment.yaml.template > deployment.yaml
kubectl apply -f deployment.yaml
deploy:
script:
- envsubst < .k8s/deployment.tpl.yaml > deployment.yaml
- kubectl apply -f deployment.yaml

Cette commande remplace les variables, puis transmet le résultat à kubectl.

  • Génération de fichiers docker-compose.yml
  • Configuration automatique d’applications Node.js, Python, PHP
  • Déploiement via Ansible ou Terraform avec des modèles simples

Avec envsubst, vos pipelines deviennent plus souples et moins dépendants de fichiers statiques, vous permettant de gérer facilement différents environnements sans duplicata de configuration.

L'utilisation de envsubst peut sembler triviale, mais quelques erreurs courantes peuvent causer des comportements inattendus. Voici les bonnes pratiques à suivre pour éviter les pièges les plus fréquents.

Utilisez des guillemets simples autour des variables

Section intitulée « Utilisez des guillemets simples autour des variables »

Lorsque vous passez des variables à envsubst, utilisez des guillemets simples (') pour empêcher leur expansion prématurée par le shell.

Fenêtre de terminal
# Correct
envsubst '$DB_USER $DB_PASS'
# Incorrect : le shell remplace déjà les variables
envsubst "$DB_USER $DB_PASS"

envsubst ne remplace que les variables déjà exportées. Si une variable n’est pas exportée, elle ne sera pas substituée.

Fenêtre de terminal
export API_KEY=abc123
envsubst '$API_KEY' < config.template > config.yaml

Sans export, la variable restera vide dans le fichier final.

Si une variable mentionnée dans le template n’est pas définie, envsubst la remplacera par une chaîne vide, ce qui peut casser un fichier de configuration :

Fenêtre de terminal
# config.template
api_key=$API_KEY
# Résultat si API_KEY n’est pas définie
api_key=

Utilisez des valeurs par défaut en Bash :

Fenêtre de terminal
export API_KEY=${API_KEY:-defaultkey}

Ou vérifiez explicitement la présence des variables :

Fenêtre de terminal
: "${API_KEY:?Variable API_KEY non définie}"

Avant d’appliquer une configuration générée, affichez-la dans le terminal :

Fenêtre de terminal
envsubst < config.template

Ou validez le fichier via des outils comme nginx -t, kubectl apply --dry-run=client, etc.

Respecter ces bonnes pratiques garantit une utilisation fiable et prévisible de envsubst, notamment dans des scripts automatisés où chaque détail compte.

Bien que envsubst soit léger et pratique, il présente aussi des limites qui peuvent le rendre insuffisant pour certains cas d’usage avancés. Connaître ses alternatives permet de choisir l’outil le mieux adapté selon vos besoins.

  • Pas de logique conditionnelle : impossible d’ajouter des blocs if, else, ou de tester la présence de variables.
  • Pas de boucles : on ne peut pas générer dynamiquement des sections répétitives.
  • Pas de gestion d’erreurs native : aucune alerte si une variable est absente ou vide.
  • Remplacement simple uniquement : pas de support pour les fonctions ou les transformations de variables.
  1. Jinja2 (Python)

Permet d’utiliser une syntaxe expressive avec des conditions, boucles, et filtres :

{% if DEBUG %}
debug = true
{% endif %}

Idéal pour les projets complexes, souvent utilisé avec des templates Ansible ou dans des scripts Python.

  1. envplate (Go)

Utilitaire très rapide et conçu pour les containers Docker. Il peut injecter les variables dans plusieurs fichiers.

https://github.com/kreuzwerker/envplate

  1. mustache / handlebars (JavaScript)

Systèmes de templating simples, orientés substitution de données JSON dans des fichiers modèles. Disponibles dans de nombreux langages.

  1. gomplate (Go)

Plus avancé que envsubst, avec des fonctions intégrées, des sources multiples (fichiers, API, Vault...), et des conditions.

https://github.com/hairyhenderson/gomplate

Conclusion : utilisez envsubst pour des substitutions simples et rapides dans vos fichiers de configuration. Mais pour des besoins plus dynamiques ou structurés, tournez-vous vers Jinja2, gomplate ou d’autres moteurs de templates adaptés aux workflows DevOps modernes.

  1. envsubst remplace les variables d'environnement dans un texte ou un fichier modèle.
  2. Seules les variables exportées sont substituées ; une variable non définie devient une chaîne vide.
  3. SHELL-FORMAT (envsubst '$VAR1 $VAR2') limite la substitution aux variables listées.
  4. En CI/CD, il génère des configs nginx, Docker ou Kubernetes à partir d'un seul modèle.
  5. Pour de la logique (conditions, boucles), préférez Jinja2 ou gomplate.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens ce site gratuitement, sans publicité, sans profilage et sans compte à créer. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn