Gérer les variables de projet avec Direnv
Objectif de cet atelier pratique
- Prise en main de l'outil direnvpour gérer les variables d'environnement
Dans cet atelier pratique, nous allons voir de plus près un composant qui ne
fait pas partie d'Ansible à proprement parler, mais qui va nous faciliter la
vie dans l'organisation et la gestion de nos configurations : l'outil
direnv.
Là comme ailleurs, nous allons préférer la pratique à la théorie. Placez-vous dans le répertoire du quatrième atelier pratique :
Voici les deux machines virtuelles de cet atelier :
| Machine virtuelle | Adresse IP | 
|---|---|
| debian | 192.168.56.10 | 
| rocky | 192.168.56.20 | 
Démarrez les machines virtuelles :
Direnv sous Debian
Connectez-vous à la VM sous Debian :
- 
direnvest une extension du shell qui permet de définir ou de modifier des variables d'environnement en fonction du répertoire de travail en cours.
- 
L'opération se fait de manière automatique, simplement en changeant de répertoire. 
- 
Dès que vous quittez le répertoire en question, les modifications spécifiques sont supprimées. 
Mettez à jour les informations sur les paquets :
direnv est fourni par les dépôts officiels de la distribution :
Pour intégrer direnv au shell Bash, ajoutez une ligne au fichier de
configuration ~/.bashrc :
Activez direnv sans passer par une reconnexion :
Pour utiliser direnv, il suffit de créer un fichier .envrc avec une
définition de variable dans un répertoire donné :
$ mkdir -v monprojet
mkdir: created directory 'monprojet'
$ cd monprojet/
$ pwd
/home/vagrant/monprojet
À présent, créez le fichier .envrc suivant dans ce répertoire :
Chaque fois que vous créez ou modifiez un tel fichier .envrc, direnv vous
affiche une demande d'autorisation qu'il faudra confirmer explicitement :
direnv: error /home/vagrant/monprojet/.envrc is blocked.
Run `direnv allow` to approve its content
$ direnv allow
direnv: loading ~/monprojet/.envrc
direnv: export +TESTVAR
Partant de là, la définition de la variable TESTVAR dépendra du répertoire où
vous vous trouvez :
$ echo $TESTVAR
Yatahongaga
$ cd
direnv: unloading
$ echo $TESTVAR
$ cd monprojet/
direnv: loading ~/monprojet/.envrc
direnv: export +TESTVAR
$ echo $TESTVAR
Yatahongaga
À présent, nous allons modifier .envrc pour utiliser expand_path, une
fonction qui transforme un chemin relatif en chemin absolu :
$ echo 'export ANSIBLE_CONFIG=$(expand_path ansible.cfg)' > .envrc
direnv: error /home/vagrant/monprojet/.envrc is blocked.
Run `direnv allow` to approve its content
$ direnv allow
direnv: loading ~/monprojet/.envrc
direnv: export +ANSIBLE_CONFIG
La valeur de la variable ANSIBLE_CONFIG correspondra au chemin absolu du
fichier ansible.cfg en argument :
$ echo $ANSIBLE_CONFIG
/home/vagrant/monprojet/ansible.cfg
$ mkdir -v sousrepertoire
mkdir: created directory 'sousrepertoire'
$ cd sousrepertoire/
$ echo $ANSIBLE_CONFIG
/home/vagrant/monprojet/ansible.cfg
À quoi ça sert ?
Peut-être bien que vous ne voyez pas exactement à quoi tout cela peut nous
servir. Je vous conseille de suspendre votre jugement et d'attendre la mise
en place de nos premiers playbooks Ansible. Vous verrez alors toute
l'utilité de direnv.
Quittez la VM :
Direnv sous Rocky Linux
Connectez-vous à la VM sous Rocky Linux :
Red Hat Enterprise Linux et les clones comme Rocky Linux ne fournissent pas
direnv, ni dans les dépôts officiels ni même dans les dépôts tiers comme
EPEL.  Il faut donc procéder à une installation manuelle depuis la page du
projet :
$ VER="2.35.0"
$ sudo wget \
  https://github.com/direnv/direnv/releases/download/v$VER/direnv.linux-amd64 \
  -O /usr/local/bin/direnv
$ sudo chmod 0755 /usr/local/bin/direnv
$ echo 'eval "$(direnv hook bash)"' >> ~/.bashrc
$ source ~/.bashrc
Maintenant que direnv est installé, je peux tester son bon
fonctionnement :
$ mkdir test
$ cd test/
$ pwd
/home/vagrant/test
$ echo "export TESTVAR=Yatahongaga" > .envrc
direnv: error /home/vagrant/test/.envrc is blocked.
Run `direnv allow` to approve its content
$ direnv allow
direnv: loading ~/test/.envrc
direnv: export +TESTVAR
$ echo $TESTVAR
Yatahongaga
$ cd
direnv: unloading
Quittez la VM :
Supprimez les deux VM :
