Skip to content

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é.

cd $HOME/git/gh/formation-ansible/atelier-04
vagrant up

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.

mkdir subdiv && cd subdiv
ansible --version

Vérification que ansible --version pointe vers le bon ansible.cfg depuis un sous-dossier

Attention

Le chemin configuré pour log_path dans ansible.cfg doit être accessible en écriture par l'utilisateur courant.

Je retiens

  • direnv charge/décharge automatiquement des variables d'environnement selon le répertoire courant.
  • expand_path dans le .envrc résout le chemin absolu vers ansible.cfg, même depuis un sous-dossier.
  • Sans direnv, ansible ne trouverait ansible.cfg que 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)


Précédent : Authentication Suite : Basic Setup