有没有办法用一个命令从一个目录安装多个 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