Quand on utilise le type défini Exec dans un bout de code Puppet, il est nécessaire de préciser l'attribut « path » de ce type défini ou d'indiquer le chemin absolu de la commande à exécuter.
Je veux exécuter un script qui installe un logiciel dans un environnement virtuel Python car je ne sais pas le faire directement avec Puppet et que le temps m'est trop compté pour apprendre à mal le faire dans la précipitation. Ce script utilise la version 3.7 de Python qui est installée indépendamment via miniconda (le système d'exploitation Ubuntu fourni la version 3.8.5 qui ne convient pas).
Tous mes tests avec puppet agent -t
fonctionne sur la machine de test. J'envoie en production. J'attends que CRON lance l'agent puppet. Ce dernier échoue à exécuter le script : « python3.7: command not found ». Au passage, je remercie set -e
+ trap ERR
d'avoir empêché le reste du script de se dérouler (j'explique ici comment ça fonctionne). Je lance l'agent puppet à la main : l'exécution du script se déroule très bien. Hum.
Le PATH est différent entre un agent puppet exécuté à la mano (le PATH est alors celui de l'utilisateur root, qui est modifié via /etc/profile.d pour intégrer miniconda), un agent puppet exécuté par CRON (le PATH est alors celui de CRON, /usr/bin:/bin) et un agent puppet qui s'exécute automatiquement via un service (le PATH est alors /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin).
Bref, ce qui est vrai pour une ressource Exec au sein d'un code Puppet l'est tout autant pour un script exécuté par une ressource Exec au sein de Puppet : toujours préciser le PATH.
Au fait, pourquoi utilisons-nous CRON plutôt que le service pour exécuter l'agent puppet toutes les 30 minutes ? Parce qu'on utilise Puppet sur des stations de travail. Donc, les utilisateurs peuvent interrompre Puppet à tout moment… y compris durant l'installation de paquets logiciels, ce qui détraque dpkg
. Sans compter que ces machines sont souvent toutes allumés en même temps, donc elles contactent toutes le serveur Puppet en même temps… ce qui pose de problème de charge. Notre script lancé par CRON exécute un dpkg --configure -a
et ajoute une temporisation environ aléatoire avant d'exécuter l'agent Puppet.