Быстрая установка нескольких модулей puppet из каталога

Быстрая установка нескольких модулей puppet из каталога

Есть ли способ установить несколько модулей puppet из каталога одной командой?
У меня есть каталог, содержащий несколько модулей puppet в формате tar.gz, загруженных с forge, и мне нужно установить все модули. Однако puppet module installаргумент принимается только для одного модуля. Сначала я использовал цикл bash для вызова puppet module installодного модуля в каталоге. Однако я быстро обнаружил, что на моей системе установка каждого модуля занимает от 1,6 до 2 секунд из-за медленного времени запуска puppet (похоже, это из-за того, что ruby ​​медленно загружает все gems). Поскольку я добавил больше модулей для установки, время их установки стало проблемой.

Запуск puppet без аргументов или puppet helpзанимает от 1,6 до 2 секунд; столько же времени требуется для запуска, puppet module installкогда модуль уже установлен. Это показывает, что большую часть времени установки модуля занимает только время запуска puppet, а не время, необходимое для установки модуля. Когда я просматриваю вызов puppet, там есть тысячи вызовов stat и lstat, приводящих к ENOENT, нет такого файла или каталога, который, как я полагаю, основываясь на моих исследованиях, является загрузкой ruby ​​gems, некоторые из которых используют общие библиотеки.

Хосты, на которые я устанавливаю модули, находятся в изолированной сети и не имеют доступа к Forge, поэтому установка напрямую из Forge невозможна.

Я недолго рассматривал возможность использования Bolt, но не смог найти в документации способ установки модулей из локального каталога.

решение1

Я написал простой скрипт-обертку Ruby вокруг установки модуля puppet в качестве временного решения на данный момент. Это не идеальное решение, поскольку скрипт перехватывает SystemExitи вызывает "внутренний" тестовый метод, и поскольку мне нужно поддерживать этот дополнительный скрипт. Я надеялся вызвать команду, предоставляемую puppet, которая обеспечивает поведение установки нескольких модулей, но этот скрипт-обертка должен мне помочь на данный момент.

#!/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

Связанный контент