Installieren Sie schnell mehrere Puppet-Module aus dem Verzeichnis

Installieren Sie schnell mehrere Puppet-Module aus dem Verzeichnis

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 installwird nur ein Argument für ein Modul benötigt. Ich habe zunächst eine Bash-Schleife verwendet, um puppet module installeinmal 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 helpdauert 1,6 bis 2 Sekunden; es dauert auch so lange, puppet module installwenn 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 SystemExiteine „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

verwandte Informationen