chef recipe - 资源中不可用的模块方法

DEL*_*zed 5 chef-infra

我通过一个模块扩展了配方类,以提供一些属性,这些属性使我可以全局访问我的路径,这些路径是动态构造的.例:

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

class Chef::Recipe
  include Variables
end
Run Code Online (Sandbox Code Playgroud)

问题是,在资源块中,这些方法不可用.

bash "do_something_with_property" do
  user user
  code "somecommand #{user_home}"
end
Run Code Online (Sandbox Code Playgroud)

NoMethodError:Chef :: Resource :: Bash的未定义方法`user_home'

奇怪的行为是,用户属性工作正常,但代码块中使用的属性不起作用.

在此之后,我还将模块包含在所有资源中:

class Chef::Resource
  include Variables
end
Run Code Online (Sandbox Code Playgroud)

现在,我的user_home属性在资源块中的行为与在"outside"中使用时的行为不同,这意味着:

directory "#{user_home}/new_dir" do
  action :create
end
Run Code Online (Sandbox Code Playgroud)

创建/ home/user_name/new_dir

bash "create_dir" do
   code "mkdir #{user_home}/new_dir"
end
Run Code Online (Sandbox Code Playgroud)

结果在/ 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
Run Code Online (Sandbox Code Playgroud)

所以对我而言,这似乎必须是特定于厨师的问题.

任何人都可以解释我,为什么会发生这种情况?

有没有更好的解决方案来全局访问我的路径和属性动态构建?

谢谢.

Pat*_*ker 0

你能把你的路径作为属性吗?

是在环境层面还是在节点层面?

我们对说明书属性做了类似的事情来构建安装说明。在本例中,我们从数据包构建安装指令

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"
Run Code Online (Sandbox Code Playgroud)

话虽如此,我确实认为资源类的扩展应该已经让你满意了。当您说资源内部的行为与外部的行为不同时。目录也是一种资源,因此在这种情况下,两个资源之间的行为有所不同

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

那么,也许是其中一种资源的问题导致了不一致的行为?