모듈을 통해 래서 피 클래스를 확장하여 동적으로 구성된 내 경로에 대한 전역 액세스를 제공하는 몇 가지 속성을 제공했습니다. 예 :주방장 조리법 - 리소스 내에서 모듈 방법을 사용할 수 없음
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
제게 이것은 요리사 특정 문제 여야합니다.
아무도 나를 설명 할 수 있습니까? 왜 이런 일이 발생하고 있습니까?
빌드를 동적으로 가져 오는 내 경로와 속성에 대한 전역 액세스에 대한 더 나은 해결책이 있습니까?
감사합니다.
속성의 문제는 그들이 역할이나 환경에서 오버라이드 (override) 값을 고려하지 않는다는 것입니다 ']} " 왜 내가 recipe에서 (또는 내가 원하는대로) – DELUXEnized
의 user_home 경로를 빌드하는 이유는 무엇인가에 따라 일부 속성이 (bash의 코드 속성과 같은) 블록 컨텍스트 내에서 평가되기 때문에 일관성없는 동작이 발생합니다. (사용자 및 그룹과 같은) 다른 것들은 특성을 정의한 래서 피 컨텍스트 내에서 평가됩니다. 어쨌든, Resource 클래스 내에 동일한 모듈을 포함하면 안됩니다. 왜냐하면 컨텍스트에서 노드를 사용할 수 없으며 다른 값을 반환하기 때문입니다. – DELUXEnized
레시피를 사용하여 노드 수준에서 속성을 설정할 수 있습니다. 노드 [ 'user_home'] = "/ home # {node [ 'user']}"그러면 opscode에 의해 배치 된 우선 순위 모델로 재생됩니다. 그 조리법이 역할의 시작 부분에 추가 될 수 있습니까? 모든 요리법은 그 속성을 활용할 수 있으며 자원으로 전달 될 수 있습니다. 어쩌면 그것은 당신이하고자하는 것에 대해 약간 펑키 한 것일 수도 있습니다 또는 환경 변수를 사용합니까? – PatrickWalker