モジュールを介してレシピクラスを拡張し、動的に構築されるパスへのグローバルアクセスを可能にするいくつかのプロパティを提供しました。例:
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:Chef :: Resource::Bashの未定義のメソッド`user_home'
奇妙な動作は、userプロパティは正常に機能しますが、コードブロック内で使用されるプロパティは機能しないことです。
この後、次のようにしてモジュールをすべてのリソースに含めました。
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
だから私には、これはシェフ特有の問題であるに違いないようです。
誰かが私を説明できますか、なぜこれが起こっているのですか?
動的にビルドされるパスと属性へのグローバルアクセスのためのより良いソリューションはありますか?
ありがとう。