Aller au contenu
Outils medium

Utiliser envsubst pour vos configs dynamiques

10 min de lecture

La commande envsubst permet de remplacer dynamiquement des variables d’environnement dans un texte. Elle est particulièrement utile dans les contextes DevOps, où les fichiers de configuration doivent s’adapter à différents environnements sans être recréés à chaque fois.

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 Kubernetesenvsubst 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_HOST=db.local
export DB_USER=admin
  • 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@v2
- 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.

Comme vous l’aurez compris, envsubst se distingue par sa simplicité et son efficacité pour la génération dynamique de fichiers de configuration. Facile à intégrer dans un shell ou un pipeline CI/CD, il répond parfaitement aux besoins des administrateurs système et des développeurs cherchant à automatiser sans complexifier. Pour aller plus loin, d’autres outils existent, mais envsubst reste une valeur sûre dans la boîte à outil DevOps.

Ce site vous est utile ?

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

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.