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

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

1
задан 13 January 2021 в 17:33
1 ответ

Я написал простой сценарий-обертку на рубине вокруг 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
0
ответ дан 24 April 2021 в 01:04

Теги

Похожие вопросы