2014-07-15 3 views
13

문제점 : 속성이 "참"인 경우에만 실행해야하는 요리사 문장이 있습니다. 그러나 매번 실행됩니다.요리사 only_if 속성이 참일 경우

예상되는 동작 :default[:QuickBase_Legacy_Stack][:dotNetFx4_Install] = "false" dotnet4를 설치하지 않아야합니다.

실제 동작 : 속성의 설정에 관계없이 dotnet4를 설치합니다.

내 코드 :

속성 파일 :

default[:QuickBase_Legacy_Stack][:dotNetFx4_Install] = "false" 

조리법 파일 :

windows_package "dotnet4" do 
    only_if node[:QuickBase_Legacy_Stack][:dotNetFx4_Install]=='true' 
    source "#{node[:QuickBase_Legacy_Stack][:dotNetFx4_URL]}" 
    installer_type :custom 
    action :install 
    options "/quiet /log C:\\chef\\installLog4.txt /norestart /skipmsuinstall" 
end 
+2

질문의 형식이 마음에 듭니다. 당신은 문제, 주어진 결과 및 원하는 결과를 분명히 확인했습니다. 당신은 엔지니어 여야합니다 :) – sethvargo

+1

예, 아마 당신은 upvote로 보상 할 수 있습니다 ... :) – tbenz9

답변

15

Guards Ruby는 블록으로 묶어야합니다. {} 그렇지 않으면 Chef는 기본 인터프리터 (대개 bash)에서 문자열을 실행하려고 시도합니다. 당신은 또한 부울 true 대신

"true"의 필요 당신이 문자열을 인용와 다른 데이터를 보간 필요가없는 (source의 경우) 일반 변수 이름을 사용하는 경우

windows_package "dotnet4" do 
    only_if  { node[:QuickBase_Legacy_Stack][:dotNetFx4_Install] == 'true' } 
    source   node[:QuickBase_Legacy_Stack][:dotNetFx4_URL] 
    installer_type :custom 
    action   :install 
    options  "/quiet /log C:\\chef\\installLog4.txt /norestart /skipmsuinstall" 
end 

체크.

+0

소스의 팁 주셔서 감사합니다. 내 코드를 업데이트했습니다. – tbenz9

6

당신이 당신의 not_if에 대한 블록을 사용할 필요가 있으므로, 루비 조건입니다 :

only_if { node[:QuickBase_Legacy_Stack][:dotNetFx4_Install]=='true' } 

(추가 사항은 {}입니다. 또한 여러 조건의 do..end 구문을 사용할 수 있습니다 :

only_if do 
    node[:QuickBase_Legacy_Stack][:dotNetFx4_Install]=='true' 
end 

마지막으로, 값이 문자열 "true" 아닌 값 true (차이 참조) 확인하십시오. Ruby에서 true은 (false과 같은) 부울이지만 "true"은 문자열입니다 ("foo"처럼) true == "true"false을 반환하는지 확인합니다.

+0

나는 비슷한 문제가 있습니다 .. 나는''sync_db ":"true "'json config와 in 요리사 요리법'only_if {sub_site [ 'sync_db']! = nil}'을 확인하지 않고 속성에서 제거하지 않으면 제대로 작동하지 않습니다. 'only_if {sub_site [ 'sync_db'] == "true"}'또는'true'가 작동하지 않습니다. 어떤 생각? – awm

관련 문제