2012-09-24 2 views
9

요리사 레시피에 주어진 cookbook_file이 있는지 테스트 할 수있는 방법이 있습니까? 나는 다음과 같은 것을 할 싶습니다Chef - cookbook_file 존재 여부 테스트

cookbook_file "/etc/cron.d/#{service}" do 
    source "etc/cron.d/#{service}" 
    owner "root" 
    group "root" 
    mode "0644" 
end 

를하고 떨어지지 않은 경우 파일 "등/cron.d/{SERVICE_NAME}"나는 컴퓨터에서 실행되는 많은 서비스가있을 수 있기 때문에, 존재하지 않는 , 그중 몇몇은 cron 작업과 관련이 있습니다.

나는 그것이 매우 부서지기 쉬운 것부터

['service_1', 'service_2', ...], 

같은 cron 작업을 서비스의 큰 목록을 가지고 싶지 않아. 이상적으로, 나는 그들이 필요로하는 서비스에 대한 cron 작업을 포함하는 디렉토리를 갖고 싶습니다. 그리고이 파일들이 존재하지 않으면 레시피가 실패하지 않게해야합니다. 내가 찾고있는 것이 가능한가?

답변

6

는 지금까지 내가 아는 한, cookbook_file가 존재하는 경우 이점에 테스트 할 수 없습니다. 그러나 요리사가 파일을 찾지 못하면 실패 대신 실행을 계속하도록 할 수 있습니다.

cookbook_file "/etc/cron.d/#{service}" do 
    source "etc/cron.d/#{service}" 
    owner "root" 
    group "root" 
    mode "0644" 
    ignore_failure true 
end 
+0

저에게 충분합니다. 감사합니다. – Marc

+1

어쨌든 로그에 오류가 발생합니다. – timurb

0

점수는 것 @JonathanM이 (가) answer을 사용하도록 제안하십시오.

여기하는 chef_gem에 당신이 조리법에 필요한 코드를 의존하지 않으려면. 이 코드는 Chef 11.12.8에서 테스트되었지만 Chef 11.x 버전과 호환되어야합니다.

cookbook_file의 소스 :

only_if { run_context.has_cookbook_file_in_cookbook?(cookbook_name, "etc/cron.d/#{service}") } 

template를 확인하기 '를 확인하려면의 소스 :

only_if { run_context.has_template_in_cookbook?(cookbook_name, "etc/cron.d/#{service}") } 

변수 cookbook_name 어떤 조리법 내에서 암시 적으로 사용할 수 있으며, 현재 요리 책이있다 가치로서의 이름. 다른 요리 책에 템플릿이나 파일이 있는지 확인하려면 cookbook_name을 하드 코딩 된 문자열 (예 : "java")으로 바꿉니다. 코드가 주요 릴리스 사이에 (심지어 사소한 출시 내가 생각하는 사이)을 변경할 수 있기 때문에 요리사 내부 API를 만지작 것을

참고

은 위험합니다. 그렇기 때문에 chef_gem을 사용하는 것이 좋은 생각입니다. 보석은 요리사의 여러 버전을 처리 할 수 ​​있으며, 요리법 코드의 시각적 인 혼란을 줄이고 DSL을 잘 생각하면 요리법 코드를 더 쉽게 읽을 수 있습니다.