
Gibt es eine Möglichkeit, mehrere Puppet-Module aus einem Verzeichnis mit einem Befehl zu installieren?
Ich habe ein Verzeichnis mit mehreren Puppet-Modulen im Tar.gz-Format, die ich von Forge heruntergeladen habe, und ich muss alle Module installieren. Allerdings puppet module install
wird nur ein Argument für ein Modul benötigt. Ich habe zunächst eine Bash-Schleife verwendet, um puppet module install
einmal für jedes Modul im Verzeichnis aufzurufen. Ich habe jedoch schnell festgestellt, dass es auf meinem System 1,6 bis 2 Sekunden dauert, jedes Modul zu installieren, da Puppet langsam startet (es scheint daran zu liegen, dass Ruby zu langsam ist, um alle Gems zu laden). Da ich weitere Module zur Installation hinzugefügt habe, ist die Zeit, die zum Installieren aller Module benötigt wird, zum Problem geworden.
Das Ausführen von Puppet ohne Argumente oder nur puppet help
dauert 1,6 bis 2 Sekunden; es dauert auch so lange, puppet module install
wenn das Modul bereits installiert ist. Dies zeigt, dass die meiste Zeit, die zum Installieren des Moduls benötigt wird, nur die Startzeit von Puppet ist und nicht die Zeit, die zum Installieren des Moduls benötigt wird. Wenn ich den Puppet-Aufruf überprüfe, gibt es Tausende von Stat- und Lstat-Aufrufen, die zu ENOENT führen, keine solche Datei oder kein solches Verzeichnis, von dem ich aufgrund meiner Recherche glaube, dass es sich bei Ruby um das Laden der Gems handelt, von denen einige gemeinsam genutzte Bibliotheken verwenden.
Die Hosts, auf denen ich die Module installiere, befinden sich in einem isolierten Netzwerk und haben keinen Zugriff auf die Forge. Daher ist die direkte Installation aus der Forge keine Option.
Ich habe mir kurz die Verwendung von Bolt angesehen, konnte in der Dokumentation jedoch keine Möglichkeit finden, Module aus einem lokalen Verzeichnis zu installieren.
Antwort1
Als Workaround habe ich ein einfaches Ruby-Wrapper-Skript für die Installation des Puppet-Moduls geschrieben. Das ist keine ideale Lösung, da das Skript SystemExit
eine „interne“ Testmethode abfängt und aufruft und ich dieses zusätzliche Skript pflegen muss. Ich hatte gehofft, einen von Puppet bereitgestellten Befehl aufrufen zu können, der das Verhalten der Installation mehrerer Module bereitstellt, aber dieses Wrapper-Skript sollte fürs Erste ausreichen.
#!/opt/puppetlabs/puppet/bin/ruby
begin
require 'puppet/util/command_line'
ARGV.each { |arg|
begin
Puppet::Util::Commandline.new('puppet', ['module', 'install', arg]).execute
rescue SystemExit => e
if e.success?
$stderr.puts e.message
else
raise
end
end
Puppet.settings.send(:clear_everything_for_tests) # needed after each puppet Commandline call to clear the global variables in order to call Commandline execute again
}
rescue LoadError => e
$stderr.puts e.message
exit(1)
end