2014-01-08 3 views
6

How to Write Reusable Chef Cookbooks, Gangnam Style에서 영감을 얻어 래퍼 요리 책을 구현하려고합니다. 관리자 노드없이 Tomcat 7을 내 노드에 설치하고 싶습니다. 나는 다음과 같은 attributes/default.rb 파일 래퍼 요리 책을 만들었습니다 tomcat/attributes/default.rb에서 제공요리사 요리 책의 속성 우선 순위

default["tomcat"]["base_version"] = 7 
default["tomcat"]["deploy_manager_apps"] = false 

기본 특성은 다음과 같습니다

default["tomcat"]["base_version"] = 6 
#other attributes 
default["tomcat"]["deploy_manager_apps"] = true 
default["tomcat"]["user"] = "tomcat#{node["tomcat"]["base_version"]} 

내가 모든 속성을 통해이 값을 무시하고 싶습니다. 그러나 ["tomcat"]["user"]과 같은 속성은 오버라이드되지 않습니다. 위의 값은 여전히 ​​tomcat6이고 node["tomcat"]["user"]입니다.

["tomcat"]["base_version"]}"을 참조하는 모든 속성을 무시해야합니까? tomcat 요리 책 default.rb 앞에 내 attributes/default.rb이로드 된 경우 정상적으로 작동했을 것입니다.

저는 Berkshelf, Vagrant 및 Chef solo를 개발 용으로 사용하고 있습니다. 내 요리 책의 metadata.rb에서 나는 depends "tomcat"을 언급했다.

내 맞춤 요리 책은 https://github.com/vaibhavguptaIITD/hcentive-ops/tree/master/hc-tomcat이며 톰캣 커뮤니티 요리 책은 https://github.com/opscode-cookbooks/tomcat입니다.

답변

9

이것은 요리사가 실행하는 동안 루비 코드가 평가되는 방법 /시기 때문입니다. 일반적인 Chef 실행에서, 속성 파일은 먼저 여기에 언급 된 run_list에 의해 지정된 종속 순서대로 평가됩니다 (Chef 11 In-Depth: Attributes Changes).

요리사가 tomcat 요리 책에 대한 의존성을 감지하고 먼저 그것의 속성을로드/평가합니다. 그래서 default["tomcat"]["user"] = "tomcat#{node["tomcat"]["base_version"]} 때문에 시간에 tomcat6로 설정되어, node["tomcat"]["base_version"]의 값은 그러나 node["tomcat"]["user"]는 재평가되지 않습니다, 요리사 래퍼 요리 책을 평가하고 적절하게 7에 node["tomcat"]["base_version"] 속성을 설정, 6

나중에입니다.

랩퍼 요리 책에서 값을 변경하려면 node["tomcat"]["user"]의 값을 설정해야합니다.

+0

감사합니다. 궁금해서 그냥 래퍼 요리 책을 쓰는 동안이 절차가 약간 성가시다. 포장 된 요리 책 앞에 래퍼 요리 책의 속성을 먼저로드하는 것이 합리적이지 않아야합니다. – Vaibhav

+1

https://tickets.opscode.com/browse/CHEF-4837에서이 동작에 대한 토론이 있습니다 –

+0

이 블로그 게시물은 잘 정의되어 있습니다 http://www.getchef.com/blog/2013/12/03/doing -wrapper-cookbooks-right/잘하면 다음 클라이언트에서 수정합니다. 이 문제는 2 줄 속성 파일을 50 줄 + 속성 파일로 바꿉니다. –

1

동일한 문제가 발생했습니다. /var/www/webapp1 지적했다

으로, 무슨 일하는 요리사 당신이 요리 책을 따라 자신의로드 찾을 수 있습니다 :

default["apache"]["apache_docroot"] = '/var/www' 

#other attributes: 
default['apache']['webapp1_docroot'] = "#{node['apache']['apache_docroot']/webapp1}" 

는 얻을 : 그것은 또한 같은 기본 변수를 설정하고 그것에서 다른 변수를 설정하는 나에게 의미가 있습니다 먼저 속성. 어떤 의미에서는 잘못된 것처럼 보입니다. 왜 부모님을 불러 들이지 않을까요

override["apache"]["apache_docroot"] = '/net1/websites' 

먼저 의존성이 잘 작동합니다. 그들은 더 낮고 무시되지 않을 것입니다.

이 문제를 해결하는 방법을 찾았습니다. 그것은 훌륭하지 않지만 작동합니다. 당신이 일을 끝낼 :

  • 로드 바람둥이 * .rb
  • 로드 부모 래퍼 * .rb를 따라
  • 다시로드는 바람둥이 특정 따라 달라집니다.경우 rb
당신은 다른 파일에서 특성을 다시로드하려면이 명령 node.from_file을 사용할 수 있습니다

:이 cookbook: bundle-apache-java-tomcat, attribs file: default.rb

보조 노트를로드

puts "*** RUNNING bundle-apache-java-tomcat-example default.rb" 

# Reload bundle-apache-java-jboss::default attributes to reset var's depending on apache_docroot value 
node.from_file(run_context.resolve_attribute("bundle-apache-java-tomcat", "default")) 

: 내 요리 책이 떠나 결국 그러나 나는 싶었 해시를 사용하여 웹 사이트 속성을 '더 간단하게'설정합니다. 동시에 해시를 초기화하는 동안 다른 속성을 설정할 수는 없지만 여전히 필요한 경우를 대비하여 해당 코드를 남겨 두었습니다.

여러 개의 웹 사이트를 쉽게 설정할 수 있도록 2 개의 새로운 번들 요리 책을 만들었습니다. 아파치와 tomcat 사이의 프록시 링크를 설정하거나 설정하지 않을 수도 있습니다.

https://github.com/stant/bundle-apache-java-tomcat-example (주 하나를 사용하는 방법) https://github.com/stant/bundle-apache-java-tomcat (주 일) 당신의 응답을

관련 문제