Есть ли способ установить несколько модулей puppet из каталога одной командой?
У меня есть каталог, содержащий несколько модулей puppet в формате tar.gz, загруженных из forge, и мне нужно установить все модули. Однако puppet module install
принимает аргумент только для одного модуля. Сначала я использовал цикл bash для вызова puppet module install
по одному разу для каждого модуля в каталоге. Однако я быстро обнаружил, что на моей системе установка каждого модуля занимает от 1,6 до 2 секунд из-за медленного времени запуска puppet (похоже, это связано с тем, что ruby медленно загружает все драгоценные камни). Поскольку я добавил больше модулей для установки, время установки всех модулей стало проблемой.
Запуск puppet без аргументов или только puppet help
занимает от 1,6 до 2 секунд; столько же времени требуется для запуска puppet module install
, когда модуль уже установлен. Это показывает, что большая часть времени на установку модуля - это время запуска puppet, а не время, необходимое для установки модуля. Когда я прослеживаю вызов puppet, есть тысячи вызовов stat и lstat, приводящих к ENOENT no such file or directory, что, как я полагаю, основываясь на моих исследованиях, является загрузкой ruby gems, некоторые из которых используют разделяемые библиотеки.
Хосты, на которых я устанавливаю модули, находятся в изолированной сети и не имеют доступа к forge, поэтому установка непосредственно из forge не является вариантом.
Я кратко рассмотрел возможность использования bolt, но не смог найти в документации способ установки модулей из локальной директории.
Я написал простой сценарий-обертку на рубине вокруг puppet module install в качестве обходного пути. Это не идеальное решение, поскольку сценарий перехватывает 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