从目录中快速安装多个 Puppet 模块

从目录中快速安装多个 Puppet 模块

有没有办法用一个命令从一个目录安装多个 puppet 模块?
我有一个目录,其中包含从 forge 下载的 tar.gz 格式的多个 puppet 模块,我需要安装所有模块。但是,puppet module install只有一个模块需要一个参数。我最初使用 bash 循环对目录中的每个模块调用puppet module install一次。但是,我很快发现,由于 puppet 启动时间较慢(似乎是由于 ruby​​ 加载所有 gem 的速度较慢),在我的系统上安装每个模块需要 1.6 到 2 秒。随着我添加了更多要安装的模块,安装所有模块的时间就成了问题。

运行没有参数的 puppet 只puppet help需要 1.6 到 2 秒;如果模块已经安装,运行时间也一样长puppet module install。这表明安装模块的大部分时间只是 puppet 的启动时间,而不是安装模块所需的时间。当我 strace puppet 调用时,有数千个 stat 和 lstat 调用导致 ENOENT 没有这样的文件或目录,根据我的研究,我相信这是 ruby​​ 加载了一些使用共享库的 gem。

我正在安装模块的主机位于隔离网络上,无法访问 Forge,因此直接从 Forge 安装是不可能的。

我简要研究了使用 bolt,但在文档中找不到从本地目录安装模块的方法。

答案1

我编写了一个简单的 ruby​​ 包装器脚本来处理 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

相关内容