Puppet: Distributing external facts (facts.d)
Am Montag habe ich bereits zum dritten mal mal meine Zertifizierung zum Certified Puppet Professional verlängert.
Eine Sache an die ich während des Tests wieder erinnert wurde, ist das Facter ab Version 3.9 auch die Möglichkeit bietet externe Facts komplett automatisch via Pluginsync zu verteilen.
[root@web01 ~]# puppet agent --test Info: Using configured environment 'production' Info: Retrieving pluginfacts Notice: /File[/opt/puppetlabs/puppet/cache/facts.d/external_fact.sh]/content: --- /opt/puppetlabs/puppet/cache/facts.d/external_fact.sh 2017-11-01 23:27:31.049639111 +0100 +++ /tmp/puppet-file20171102-1070-p2fybh 2017-11-02 13:26:22.145274644 +0100 @@ -1,2 +1,3 @@ + #!/bin/bash + echo "my_external_fact=true" Notice: /File[/opt/puppetlabs/puppet/cache/facts.d/external_fact.sh]/content: content changed '{md5}5f133e40e41936739c335f63ec44537f' to '{md5}a752548b79b45d178df35d9b585e85fe' Info: Retrieving plugin
External Facts sind Facts, die nicht direkt in Ruby geschrieben wurden. Dies ist eine schöne Möglichkeit eigene Facts zu entwicklen, ohne das man Kenntnisse in der Sprache Ruby benötigt. Die Facts müssen ledeglich in einem beliebigen Modul im Ordner „facts.d“ abgelegt werden. Möglich sind dabei alle denkbaren Sprachen (*.sh, *.pl, …) sowie statische Textdateien.
Auch Structured Facts sind möglich, wenn das Script die Ausgabe z.B. im JSON Format zurückliefert.
In früheren Versionen von Puppet musste man die External Facts als Dateien händisch via File Resource auf die Systeme verteilen. Dies hat allerdings den großen Nachteil das der Fact erst ab dem zweiten Puppetlauf zur Verfügung steht.
Ab Puppet 4 kann dies noch problematischer werden werden. Puppet 4 verhält sich in vielen Dingen deutlicher strikter und zwingt den User zu sauberen Puppet Code. Der Zugriff auf eine undefinierte Variable etwa wirft einen Catalog Error beim kompilieren.
Das ist zum Beispiel der Fall, wenn man im Puppet Manifest auf einen vermeintlich verfügbaren externen Fact referenziert, der allerdings erst über Puppet ausgerollt werden muss. Damit hat man sich dann unter Puppet 4 einen Deadlock geschaffen.
Zu beachten ist natürlich das External Facts langsamer abgearbeitet werden als jene Facts, die direkt in Ruby geschrieben wurden. Der Grund hierfür ist das für jeden Fact der entsprechende Shell Interpreter als eigener Subprozess unterhalb von Puppet geöffnet werden muss.