
하나의 명령으로 디렉터리에서 여러 꼭두각시 모듈을 설치하는 방법이 있습니까?
Forge에서 다운로드한 tar.gz 형식의 여러 puppet 모듈이 포함된 디렉토리가 있고 모든 모듈을 설치해야 합니다. 그러나 puppet module install
하나의 모듈에 대해서만 인수를 사용합니다. 처음에는 bash 루프를 사용하여 puppet module install
디렉토리의 각 모듈을 한 번씩 호출했습니다 . 그러나 나는 느린 인형 시작 시간으로 인해 내 시스템에서 각 모듈을 설치하는 데 1.6~2초가 걸린다는 사실을 곧 발견했습니다(이는 Ruby가 모든 보석을 로드하는 속도가 느리기 때문인 것으로 보입니다). 설치할 모듈을 추가하다 보니 다 설치하는 데 걸리는 시간이 문제가 되었습니다.
인수 없이 인형을 실행하거나 puppet help
1.6~2초 정도 소요됩니다. puppet module install
모듈이 이미 설치된 경우에도 실행하는 데 시간이 오래 걸립니다 . 이는 모듈 설치에 소요되는 시간의 대부분이 모듈 설치에 소요되는 시간이 아니라 Puppet의 시작 시간일 뿐이라는 것을 보여줍니다. 꼭두각시 호출을 추적하면 수천 개의 stat 및 lstat 호출이 발생하여 ENOENT에서는 내 연구에 따르면 공유 라이브러리를 사용하는 일부 보석을 Ruby 로드하는 것으로 생각되는 파일이나 디렉토리가 없습니다.
모듈을 설치하는 호스트는 격리된 네트워크에 있고 Forge에 액세스할 수 없으므로 Forge에서 직접 설치하는 것은 옵션이 아닙니다.
Bolt 사용에 대해 간략히 살펴봤지만 문서에서 로컬 디렉터리에서 모듈을 설치하는 방법을 찾을 수 없었습니다.
답변1
지금은 해결 방법으로 꼭두각시 모듈 설치에 관한 간단한 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