2014-02-28 1 views
1

Zabbix Agent를 설치하기 위해 Chef 레시피를 "정리"하려고합니다. 거기에 백만 명이 있다는 것을 알고 있습니다. 그러나 이것은 나의 이해를위한 나의 테스트 케이스입니다. 나는 요리사의 지시 사항을 반으로 나눠서 완성해야하는 각 단계마다 별도의 방법을 사용합니다. 수업을 요리법 파일에 넣었습니다. 나는이 클래스 자체가 요리사를 형성 "분리"내기, 나는 더에 의해 해요Chef 레시피 안에 Ruby 클래스 작성하기

NoMethodError 
------------- 
undefined method `execute' for #<Class:0x000000030e42c0>::Recipe_Zabbix_Agent_Unix 

루비 전문가를 의미합니다, 그래서 나는 나 자신에게 생각 : 나는 조리법, linked here at GitHub을 실행할 때, 나는이 오류가 나타납니다 상속 때문에, 클래스가 < 것을 사용하여 Chef 라이브러리를 상속해야 할 필요가 있습니다. 그러나 여전히 위에 나열된 오류가 나타납니다. 내가 무엇을 놓치고 있는지, 또는 이것을 시도 할 때 이해하지 못 했는가? 나는 사람들이 기본적으로 루비 스크립트 인 라이브러리를 작성한 것을 본 적이있다. 그런 다음 레서피는 스크립트를 포함하고 거기에서 기능을 수행하지만, 나는 그것을 단순한 이해를위한 레시피에 포함시키고 자했다. 그게 가능할까요, 아니면 도서관 루트를보고있는 유일한 옵션입니까? 나는 이것을 Chef 10.24에서도 돌리고있다.

+0

당신은 중량이 무거운 업체에서 요리사 DSL에 액세스 할 수 없습니다. – sethvargo

+0

어떻게 이러한 공급자를 상속합니까? – Pred

+0

'execute = Chef :: Resource :: Execute.new (command)'클래스 폼을 사용하십시오. – sethvargo

답변

1

일반적으로 클래스 기반 리소스는 레시피가 아닌 라이브러리 파일에 있습니다. Poise를 사용하여 클래스 기반 리소스에서 LWRP DSL 요소를 가져 오는 예제는 https://github.com/poise/berkshelf-api/blob/master/libraries/berkshelf_api.rb을 참조하십시오.

+0

그래서 클래스를 라이브러리 파일로 작성한 다음이를 필요로하거나 포함시킨 다음 원하는 기능을 호출 할 수 있습니까? – Pred

+0

모든 요리 책 라이브러리 파일은 수렴의 맨 처음에 요리사에 의해 자동으로로드됩니다. – coderanger

+0

나는 당신과 @ethethvargo가 모두 정확하다고 생각한다. 왜냐하면 내가하고 싶은 일을하기 때문에, 나는 그가하고있는 것을 할 것이고, 요리사에게 물건을 실어주고 내 수업 내외부에 할당 할 것이고, 내 수업은 속한다. 도서관에서. 수업 시간에 Chef 함수를 호출하려고하므로 먼저 sethvargo의 아이디어를 시도한 다음 내 코드를 라이브러리 폴더에 넣어 봅니다. – Pred

0

레서피를 매개 변수로 사용하여 리소스 정의 메소드가 범위에 포함되는 클래스를 생성 할 수 있습니다. libraries/useful_thing.rb에서

:

다음
class UsefulThing 
    def initialize(blah) 
    @blah = blah 
    end 

    def apply(recipe) 
    # Chef resources use instance_eval for blocks, which hides self 
    outer_self = self 
    recipe.directory "/foo/#{@blah}" do 
     user ... 
     group outer_self.latest_group 
     ... 
    end 
    ... 
    end 

    ... 
end 

recipes/default.rb에서 :

ut = UsefulThing.new(...) 
ut.apply(self) 
관련 문제