Ce message nous informe que le catalogue ne peut pas être construit. C'est souvent lié à Puppet qui ne parvient pas à parser le catalogue de l'ĥote et donc s'arrête sur cette erreur. Ça faisait un moment que j'avais cette erreur, Google ne m'ayant jamais donné de résultat concluant, j'ai donc décidé de traquer ce bug.

Analyse:
Ce problème ne se produit que lorsque je suis chez moi, avec mon PC personnel attaché au VPN de mon entreprise. Je n'ai jamais eu le problème avec mon portable professionnel.

Quand j'exécute la commande du classifier manuellement, aucun problème: ce qui veut dire que l'API de Foreman fonctionne correctement (ex: /etc/puppet/node.rb votre.nom.dhote)

J'ai seulement ce problème quand j'exécute l'agent puppet manuellement sur un noeud (ex: puppet agent -v --test)

Foreman récupère les facts et le catalogue du fichier yaml qui se trouve dans /var/lib/puppet/yaml. Il y a 3 sous-dossiers: facts, foreman et node.

Je tape la commande:

file node/*

Et cela me donne un grand nombre de fichiers ASCII et quelques fichiers UTF-8. Pourquoi certains d'entre eux contiennent des caractères UTF-8? J'en ai ouvert un et on peut y trouver la variable "last_run" et la valeur contenait des accents (une date en français: mardi 18 février 2014, 18:52:45 (UTC+0100)). C'est la dernière fois que Puppet s'est exécuté. Lors de son exécution, Puppet stocke la date (localisée, car il n'y a pas de forçage de la langue) et s'arrête car il ne supporte pas (encore) l'UTF-8.

Sur mon PC personnel, lors d'une connexion SSH, le client SSH envoie les variables d'environnement LANG et LC_*. Voilà pourquoi la date est affichée et stockée en français.

La solution cours-terme est de supprimer le fichier yaml qui contient de l'UTF-8.

Il est aussi possible d'empêcher l'envoi des variables d'environnement à la connexion, en modifiant le fichier /etc/ssh/ssh_client, paramètre SendEnv. Il faudra tout de même supprimer les fichier yaml.


Un autre solution, que je n'ai pas testé, si l'on doit exécuter l'agent puppet manuellement, est de forcer la variable LC_ALL:

LC_ALL=C puppet agent -v --test