Я расширил класс recipe через модуль, чтобы предоставить некоторые свойства, которые дают мне глобальный доступ к моим путям, которые создаются динамически. Пример:
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' для Chef::Resource::Bash
Странное поведение заключается в том, что свойство пользователя работает нормально, но свойство a, используемое в блоке кода, не работает.
После этого я также включил модуль во все ресурсы, выполнив следующие действия:
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
Так что мне кажется, что это должна быть проблема, специфичная для шеф-повара.
Может ли кто-нибудь объяснить мне, почему это происходит?
Есть ли лучшее решение для глобального доступа к моим путям и атрибутам, которые строятся динамически?
Спасибо.