
1 つのコマンドでディレクトリから複数の Puppet モジュールをインストールする方法はありますか?
Forge からダウンロードした tar.gz 形式の複数の Puppet モジュールを含むディレクトリがあり、すべてのモジュールをインストールする必要があります。ただし、puppet module install
引数は 1 つのモジュールに対してのみ使用できます。最初は、puppet module install
ディレクトリ内の各モジュールに対して 1 回呼び出す bash ループを使用しました。しかし、Puppet の起動時間が遅いため、各モジュールのインストールにシステムで 1.6 ~ 2 秒かかることがすぐにわかりました (Ruby がすべての gem をロードするのに時間がかかるためと思われます)。インストールするモジュールを追加するにつれて、それらすべてをインストールするのにかかる時間が問題になりました。
引数なしで Puppet を実行すると、puppet help
1.6 ~ 2 秒しかかかりません。puppet module install
モジュールがすでにインストールされている場合も、実行に同じくらいの時間がかかります。これは、モジュールのインストールにかかる時間の大部分が Puppet の起動時間であり、モジュールのインストールにかかる時間ではないことを示しています。Puppet 呼び出しを strace すると、数千の stat および lstat 呼び出しがあり、ENOENT no such file or directory という結果になります。私の調査によると、これは Ruby が gem をロードしているもので、その一部は共有ライブラリを使用していると考えられます。
モジュールをインストールしているホストは分離されたネットワーク上にあり、フォージにアクセスできないため、フォージから直接インストールすることはできません。
私は簡単にboltの使用について調べましたが、ローカルディレクトリからモジュールをインストールする方法がドキュメントに見つかりませんでした。
答え1
今のところ、回避策として、puppet module install の簡単な ruby ラッパー スクリプトを作成しました。スクリプトは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