2012-11-08 8 views
5

모듈을 통해 래서 피 클래스를 확장하여 동적으로 구성된 내 경로에 대한 전역 액세스를 제공하는 몇 가지 속성을 제공했습니다. 예 :주방장 조리법 - 리소스 내에서 모듈 방법을 사용할 수 없음

module Variables 
    def user 
    "user_name" 
    end 
    def user_home 
    "/home/#{node['user']}" 
    end 
end 

class Chef::Recipe 
    include Variables 
end 

문제는 자원 블록 내에서이 방법을 사용할 수없는 것이있다.

bash "do_something_with_property" do 
    user user 
    code "somecommand #{user_home}" 
end 

NoMethodError : 정의되지 않은 메서드`사용자 속성이 잘 작동하는지 요리사 :: 자원 :: 배쉬

이상한 행동은 대한 USER_HOME ',하지만 코드 블록 내에서 사용되는 속성이 작동하지 않습니다 .

이 후 나는이 작업을 수행하여 모든 자원에 모듈을 포함 :

class Chef::Resource 
    include Variables 
end 

지금 내 USER_HOME 속성은 의미 "외부"사용할 때보다 자원 블록 내에서 다르게 작동 :

directory "#{user_home}/new_dir" do 
    action :create 
end 

/home/user_name/new_dir을 만듭니다.

bash "create_dir" do 
    code "mkdir #{user_home}/new_dir" 
end 

결과는/home // new_ dir

나는 이것을 약간의 테스트 스크립트로 테스트했으며 모든 것이 잘 동작한다.

module MyModule 
def module_method 
    puts "blablalba" 
end 
end 

class A 
def block_method (&block) 
    block.call 
end 
end 

class B 
include MyModule 

def doit 
    a = A.new 
    a.block_method { module_method } 
end 
end 

B.new.doit 

제게 이것은 요리사 특정 문제 여야합니다.

아무도 나를 설명 할 수 있습니까? 왜 이런 일이 발생하고 있습니까?

빌드를 동적으로 가져 오는 내 경로와 속성에 대한 전역 액세스에 대한 더 나은 해결책이 있습니까?

감사합니다.

답변

1

경로를 속성으로 추가 할 수 있습니까?

환경 레벨 또는 노드 레벨 중 하나입니까?

우리는 설치 지침을 작성하기 위해 요리 책 속성과 비슷한 작업을 수행합니다. 이 경우 우리는 databag 내가 자원 클래스의 확장이 잘 당신을 봤어야 생각하십니까 말했다 모두와 함께

default['splunk']['server'] = Chef::DataBagItem.load('Splunk', 'Install')["Server"] 
default['splunk']['install_args'] = Chef::DataBagItem.load('Splunk', 'Install')["Arguments"] 

default['splunk']['installcommands'] = "RECEIVING_INDEXER=\"#{default['splunk']['server']}\" #{default['splunk']['install_args']} /quiet" 

에서 설치 지침을 구축 할 수 있습니다. 외부에서와 달리 자원 내부에서 다르게 행동한다고 ​​말하면됩니다. 디렉토리는이 경우에 두 개의 자원

http://wiki.opscode.com/display/chef/Resources#Resources-Directory

그래서 아마도이 일치하지 않는 행동을 일으키는 자원 중 하나에 문제가있어

사이에 다르게 행동 그래서뿐만 아니라 자원입니까?

+0

속성의 문제는 그들이 역할이나 환경에서 오버라이드 (override) 값을 고려하지 않는다는 것입니다 ']} " 왜 내가 recipe에서 (또는 내가 원하는대로) – DELUXEnized

+0

의 user_home 경로를 빌드하는 이유는 무엇인가에 따라 일부 속성이 (bash의 코드 속성과 같은) 블록 컨텍스트 내에서 평가되기 때문에 일관성없는 동작이 발생합니다. (사용자 및 그룹과 같은) 다른 것들은 특성을 정의한 래서 피 컨텍스트 내에서 평가됩니다. 어쨌든, Resource 클래스 내에 동일한 모듈을 포함하면 안됩니다. 왜냐하면 컨텍스트에서 노드를 사용할 수 없으며 다른 값을 반환하기 때문입니다. – DELUXEnized

+0

레시피를 사용하여 노드 수준에서 속성을 설정할 수 있습니다. 노드 [ 'user_home'] = "/ home # {node [ 'user']}"그러면 opscode에 의해 배치 된 우선 순위 모델로 재생됩니다. 그 조리법이 역할의 시작 부분에 추가 될 수 있습니까? 모든 요리법은 그 속성을 활용할 수 있으며 자원으로 전달 될 수 있습니다. 어쩌면 그것은 당신이하고자하는 것에 대해 약간 펑키 한 것일 수도 있습니다 또는 환경 변수를 사용합니까? – PatrickWalker

0

다음과 같이 나는 자원의 범위에 성공 주입 방법이 있었다 :

libraries/helper.rb :

module MyCookbook 
    module Helper 
    def my_method 
     "foobar" 
    end 
    end 
end 

Chef::Resource.send(:include, MyCookbook::Helper) 

recipes/default.rb :

file 'foo' do 
    content my_method 
end 
여기서 핵심은 Chef::Resource.send(:include, ...)입니다

이 모듈을 주입 Chef::Resource 클래스에 직접 추가하면 모든 리소스에 모듈 메서드를 사용할 수 있습니다. = "/ 홈 # {노드 [ '사용자
기본 ['사용자 '] ='_ 이름 ' 기본 ['USER_HOME '] :