2017-10-24 9 views
0

배경 : 우리 시스템은 Chef 로그를 볼 수 있고 Chef 서버 콘솔이나 다른 sysadmin 권한에 액세스 할 수 없도록 설정되었습니다. 따라서 나는 무엇인가가 실패했는지 또는 왜 실패했는지보고 싶다면 지역적으로 기록 할 필요가있다.가변 조건을 기반으로 요리사가 운영하는 설치 블록

나는 "당신이 그것을 올바르게 설치하기 위해 군중이나 주방장을 신뢰하지 않는다면 ..."라고 묻는 말을들을 수 있습니다. 제 대답은 당신이 옳은 동안 나는 가끔 예외적으로 다루기를 원합니다.

내 목표는 pkg을 설치하고 다음 pkg으로 설치하는 것보다 pkg가 올바르게 설치되었는지 확인하는 것입니다. 질문에에

:

나는 다음과 같은 코드를 사용하여 첫 번째 패키지에 의해 생성 된 디렉토리의 존재 여부를 확인하는 변수를 설정하려는 :

mycond = ::File.directory?('/opt/MyPkg/conf') 
    Chef::Log.fatal("MyPkg package not installed ? conf dir is missing") unless mycond 

다음 단계를 수령인은 다음 설치 블록을 실행하여 변수가 설정되었는지 확인합니다.

yum_package 'OtherPkg' do 
    action :install 
    only_if { mycond } 
end 

내 질문은 only_if 길을 내가 mycond 변수를 설정하고에 문제가 있다면 궁금 해서요, 실패 때문에입니까? perhapes {} 괄호는 코드 어딘가에 필요합니까?

총 요리사 초보자 그래서 구체적인 답변을하십시오.

감사합니다. 아래

전체 코드 :

yum_package 'MyPkg' do 
     flush_cache [ :before ] 
     action :install 
    end 

    mycond = ::File.directory?('/opt/MyPkg/conf') 
    Chef::Log.fatal("MyPkg package not installed ? conf dir is missing") unless mycond 

    yum_package 'OtherPkg' do 
     action :install 
     only_if { mycond } 
    end 

답변

2

문제는 요리사의 2 단계 모델입니다. only_if { ::File.directory?('/opt/MyPkg/conf') }까지 지연되기 때문에 only_if 블록 자체로 조건 확인을 이동하기 만하면되는 자세한 설명은 https://coderanger.net/two-pass/을 참조하십시오.

로그 레벨을 사용하면 실제로는 치명적인 오류가 아니므로 로그 수준을 사용하는 것은 좋지 않습니다.

+0

어떻게하면 로컬 로그에도 쓸 수 있습니까? – eramm

+0

아마도 로그 리소스를 사용할 것입니다. – coderanger

2

요리사 실행의 흐름을 제어 precidance의 순서를 갖는다.

리소스 블록 안의 코드 (예 : 'yum_package')가 요리법의 느슨한 코드 이후에 실행됩니다.

다음 줄

은 'yum_package'블록 전에 먼저 실행되고있다 :

mycond = ::File.directory?('/opt/MyPkg/conf') 
Chef::Log.fatal("MyPkg package not installed ? conf dir is missing") unless mycond 

나는 당신이 할 수있는 둥지 자원 블록 생각합니다. 'ruby_block'에서이 모든 코드를 조합 할 수 있으면 예상대로 순서대로 실행해야합니다.

+0

루비 블록의 변수 세트는 다음 설치 블록에서 보존/사용 가능합니까? – eramm

+0

중첩 된 블록에 대한 설명서를 찾을 수 없었지만 근본 원인을 파악하는 데는 정확했습니다. – eramm