Soit une machine dont le réseau est configuré via DHCP. Cette machine est censée exécuter un puppet agent. Or, on constate que le service puppet n'est pas lancé au démarrage de la machine :
$ systemctl status puppet
mars 09 16:34:05 test systemd[1]: Starting Puppet agent...
mars 09 16:34:24 test puppet-agent[14510]: Reopening log files
mars 09 16:34:24 test puppet-agent[14510]: Could not run: Certname "\n; <<>> dig 9.10.3-p4-ubuntu <<>> -x 192.0.2.1 +short\n;; global options: +cmd\n;; connection timed out; no servers co
mars 09 16:34:24 test systemd[1]: puppet.service: PID 14510 read from file /run/puppet/agent.pid does not exist or is a zombie.
mars 09 16:34:24 test systemd[1]: Failed to start Puppet agent.
mars 09 16:34:24 test systemd[1]: puppet.service: Unit entered failed state.
mars 09 16:34:24 test systemd[1]: puppet.service: Failed with result 'resources'
Par contre, si l'on lance manuellement le service après le démarrage, celui-ci démarre sans problème.
Solution : soit le « certname » est défini dans /etc/puppet/puppet.conf, soit l'agent puppet tente de le récupérer en effectuant une requête DNS reverse avec l'outil dig… Il faut donc que le réseau soit configuré avant que le service puppet soit démarré. Or, sur cette machine, la configuration du réseau est réalisée par network-manager… qui est lancé bien après puppet. Donc la résolution DNS échoue donc l’agent puppet ne connaît pas son certname donc il refuse de démarrer.
Pour corriger ça : soit on fixe le certname dans le fichier de configuration de puppet, soit on fait en sorte que le service puppet soit démarré quand le réseau est configuré.
Pour mettre en œuvre la deuxième solution :
sudo systemctl disable puppet
sudo cp /lib/systemd/system/puppet.service /etc/systemd/system/
Dans la section « [Unit] » de notre unit (/etc/systemd/system/puppet.service), on ajoute ceci :
Wants=network-online.target
After=network-online.target
sudo systemctl enable puppet
.