
Есть ли способ установить несколько модулей 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