direnv¶
Objectif
Découvrir direnv pour charger automatiquement la variable d'environnement $ANSIBLE_CONFIG lorsqu'on navigue dans un projet ansible, afin de pouvoir travailler librement dans les sous-dossiers.
Durée
~15 minutes
direnv sera utilisé pour corriger l'emplacement de la configuration ansible.cfg, en la mettant dans une variable d'environnement $ANSIBLE_CONFIG pour bouger librement dans un projet avec un emplacement personnalisé.
Protocole d'essai sur la VM.
vagrant ssh debian << 'EOF'
set -e
sudo apt install -y direnv ansible-core
echo 'eval "$(direnv hook bash)"' >> $HOME/.bashrc
source $HOME/.bashrc
mkdir $HOME/test_direnv && cd $HOME/test_direnv
echo 'export ANSIBLE_CONFIG=$(expand_path ansible.cfg)' > .envrc
direnv allow
touch ansible.cfg
EOF
Puis le vérifier avec un sous-dossier.

Attention
Le chemin configuré pour log_path dans ansible.cfg doit être accessible en écriture par l'utilisateur courant.
Je retiens
direnvcharge/décharge automatiquement des variables d'environnement selon le répertoire courant.expand_pathdans le.envrcrésout le chemin absolu versansible.cfg, même depuis un sous-dossier.- Sans
direnv,ansiblene trouveraitansible.cfgque dans le répertoire courant ou dans~/.ansible.cfg//etc/ansible/ansible.cfg.
Cheatsheet¶
| Symptôme | Cause probable | Correction |
|---|---|---|
direnv: error .envrc is blocked. Run 'direnv allow' to approve its content |
Sécurité direnv : tout nouveau .envrc doit être explicitement autorisé |
Lancer direnv allow dans le dossier contenant le .envrc |
Le cd dans le dossier n'exporte rien ($ANSIBLE_CONFIG vide) |
Le hook direnv n'est pas chargé dans le shell courant |
Vérifier eval "$(direnv hook bash)" dans ~/.bashrc puis source ~/.bashrc (ou ouvrir un nouveau shell) |
ansible --version continue de pointer vers /etc/ansible/ansible.cfg |
La variable $ANSIBLE_CONFIG n'est pas exportée, ou le chemin n'est pas absolu |
Utiliser expand_path dans le .envrc pour garantir un chemin absolu ; vérifier avec echo $ANSIBLE_CONFIG |
ERROR! Unable to retrieve log file au lancement d'une commande ansible |
log_path pointe vers un chemin non inscriptible par l'utilisateur courant |
Changer log_path dans ansible.cfg vers un dossier écrit par l'utilisateur (ex : ~/journal/ansible.log) |
direnv n'est pas reconnu après apt install |
Le binaire est installé mais le hook shell n'a jamais été ajouté | Ajouter eval "$(direnv hook bash)" à ~/.bashrc puis rouvrir un shell |
Sources (principales)¶
- Docs
ansibleansible.cfgconfiguration settings - Docs
ansiblePrécédence de chargement d'ansible.cfg - Docs
ansibleANSIBLE_CONFIGenv var - direnv Site officiel
- direnv Hook into your shell
- direnv
.envrcreference (expand_path) - direnv
direnv allow/direnv deny - Docs
ansibleansible-configCLI (inspecter la config active)
Précédent : Authentication Suite : Basic Setup