2014-04-11 3 views
4

저는 헬퍼 라이브러리에서 일반적인 루비 로직을 수집하여 요리사의 요리법을 체계적으로 정리하려고합니다. 내부에서 몇 가지 재사용 가능한 메서드를 사용하여 라이브러리 (예 : 클래스 Chef :: Recipe :: MyHelper)에 클래스를 선언하는 예제를 보았습니다. 유사한 방식으로 모듈을 사용하는 예제도 보았습니다. 제 경우에는 몇 가지 방법으로 리소스를 사용하고 싶었습니다.라이브러리 모듈에서 Chef 리소스를 어떻게 사용할 수 있습니까? (아니면 내가 ...)?

예를 들어 서비스 이름을 사용하고 서비스 리소스를 사용하여 각 서비스 이름을 중지하여 루프를 수행하는 도우미 메서드를 제공하고 싶다고 가정 해 보겠습니다. 레시피 파일을 최대한 정리하고 "stopServices (serviceList)"메소드를 호출하여 일부 논리를 유지하려고합니다. 내가 정의하는 경우

은 도우미 라이브러리처럼 내 레시피 그런

class Chef::Recipe::MyHelper 
    def self.stopServices(serviceList) 
    serviceList.each do |svc| 
     service "#{svc}" do 
     action :stop 
     end 
    end 
    end 
end 

내가 사용 요리사에 대한 "정의되지 않은 메서드 '서비스':: 레시피 :

MyHelper.stopServices(serviceList) 

내가 오류가 발생합니다 : : MyHelper : 클래스 ".

그런 라이브러리에서 리소스를 쉽게 사용할 수 있습니까? (라이브러리에 MyHelper가 클래스 또는 모듈로 포함되어 있는지 여부)? 이게 내가 위반하는 나쁜 습관 일 뿐이야? 나는 많은 검색을했는데 비슷한 것을 묻는 사람을 찾을 수 없기 때문에 어떤 대안을 제시해도 아마 내가 뭔가 다른 일을하고 있다고 믿게된다.

답변

1

Libraries은 요리 책 레시피에서 복잡한 루비 코드를 추상화하는 방법입니다.

그룹 자원에

(요리사 DSL 코드)를 사용해야 하나

당신이 당신의 조리법에 정기적 요리사 자원처럼 사용할 수 있습니다
  • Definitions (간단한 방법); 또는 더 복잡하지만 서로 다른 작업을 지원
  • LWRPs는 (또는 package 자원 할 수 있습니다 :install, :upgrade, :remove 등을 할 수 있습니다 :start, :stop, :restartservice 자원을 생각한다).

업데이트

귀하의 예제 문제를 해결할 정의입니다 : 다음

# cookbooks/common/definitions/common_stop_services.rb 
define :common_stop_services, :services => [] do 
    params[:services].each do |svc| 
    service svc do 
     action :stop 
    end 
    end 
end 

를 같이 사용 :

# my_cookbook/recipes/my_recipe.rb 
common_stop_services "my_recipe_services" do 
    services [ 'svc1', 'svc2' ] 
end 

것을 제외 : 그것은 probabl입니다 일반적인 방법으로 여러 서비스 정지를 실제로 감추고 싶다면 스스로에게 물어볼 가치가 있습니다. 일반적으로 서비스 작업은 다른 리소스 (예 : 재구성 된 서비스에 다시 시작하도록 알리는 구성 파일 변경이지만 다른 패턴도 적용됨)에 의해 통지됩니다.

Obs2 : CamelCase는 Ruby 코드에서 ClassesModules에만 사용됩니다. style guide을 읽는 것이 좋습니다.

Obs3 : 라이브러리에 해당 코드를 구현하는 경우에도 Class을 사용하지 않으려 고합니다. MyHelper을 인스턴스화하지 않으므로 대신 원하는 것은 Module입니다.

+0

답장을 보내 주셔서 감사합니다. LWRP가 제가 장기간 사용할 수있는 방법이라고 생각합니다. 단기간에 나는 아직도 내가하려고하는 것이 가능한지 궁금해하고 있습니다. 조리법을 정리하기 위해이 방법을 "일반적인"요리 책의 라이브러리 파일로 옮기고 그 요리 책에 의존해야하는 다른 요리 책을 만들었습니다. 클래스 또는 모듈에서 메서드를 래핑하는 데 신경 쓰지 않았고 클래스 줄 (및 "self.")없이 위와 똑같이 작성되었지만 여전히 라이브러리의 메서드에서 리소스를 호출하면 올바르게 작동합니다. – user3525074

+0

기본 네임 스페이스를 오염시키지 않고 "stopServices"대신 "MyHelper.stopServices"를 사용하여 다른 네비게이션에서 메서드가 나오는 위치를 더 명확히하는 것이 가장 좋습니다. 유일한 문제는 클래스에서 랩핑 할 때 서비스 리소스가 해당 클래스의 일부라고 가정한다는 것입니다. 그래서 그것은 단순한 네임 스페이스 문제처럼 보입니다. 리소스 이름을 완전히 한정 할 수있는 방법이 있습니까? 그렇지 않으면이 방법으로 리소스 이름을 지정하는 방법이 있습니까? – user3525074

+0

다시 말하지만, Chef DSL 호출을하기 위해 라이브러리의 사용을 방해하고 있습니다. 이름이 어디에서 왔는지에 대한 단서를 제공하지 않는 클래스를 선언함으로써 클래스를 더 명확하게 만들지는 않습니다 (아마도 'Common'은 더 나은 이름이 될 것입니다). 문제점에 대한 정의를 구현하는 방법을 보여주기 위해 내 대답을 편집했습니다. 장기적으로 당신을 도울 수있는 몇 가지 관찰을 추가했습니다. – cassianoleal

관련 문제