Chef Resource들이 이상한 순서로 동작할 때
- The chef-client Run
- chef client 실행 단계에서 크데 2가지 단계가 중요 합니다.
- Compile Phase
- 모든 언어 및 특히 ruby에 해당하는 Resource Loading
- Attributes Loading
- Definitions Loading
- Loading 된 Resources를 모두 실행 순서데로 정렬
- Execution(Converge) Phase
- Compile 단계에서 정리된 모든 사항을 실행 순서 데로 처리
-
Resource 외부에 정의되어 있는 항목들의 실행 순서
-
example.rb
- 위 Recipe는 apache2 를 install 하고, 이후 "Apache2 installed"라는 메시지가 출력 되는 것으로 보입니다.
그러나 실제 실행 결과는 "Apache2 installed"라는 메시지가 출력된 후에 apache2 라는 resource가 실행 됩니다.
이것은 compile phase에서 log가 출력되고 execution phase단계에서 apache package가 실행 되기 때문입니다.
package 'apache2' do
action :install
end
Chef::Log.info("Apache2 installed")
-
위 사항을 작성 순서데로 동작 시키기 위해서는 로그를 출력하는 단계에서 Ruby Blocks 를 사용 합니다.
-
example2.rb
- 위와 같이 실행을 하데 되면 compile phase에서 모든 리소스들(ruby block포함)을 load하고 run-list를 생성합니다.
이후 execution 단계에서 run-list에 순서데로 처리를 하게 되어 초기 의도데로 동작을 하게 됩니다.
package 'apache2' do
action :install
end
ruby_block 'ruby_logstuff' do
block do
Chef::Log.info("Apache2 installed")
end
end
- 결론
- Shell 처리를 위해 Mixlib::ShellOut 사용하거나 ruby를 집접 사용하고자 할때, 가급적 ruby_block resource 안에 작성하여, Compile 이후 Runtime 단계에서 동작이 되도록 Recipe를 작성 합니다.
- Compile 단계에서는 모든 Recipe 동작 순서에 상관이 없거나 Runtime 전에 꼭 처리되어야 하는 전처리 사항만 기술 합니다.
-
Reference