6

モジュールを介してレシピクラスを拡張し、動的に構築されるパスへのグローバルアクセスを可能にするいくつかのプロパティを提供しました。例:

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

だから私には、これはシェフ特有の問題であるに違いないようです。

誰かが私を説明できますか、なぜこれが起こっているのですか?

動的にビルドされるパスと属性へのグローバルアクセスのためのより良いソリューションはありますか?

ありがとう。

4

2 に答える 2

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"

そうは言っても、リソース クラスの拡張機能は問題なく表示されるはずだったと思います。外部とは対照的に、リソース内で異なる動作をしたと言うとき。ディレクトリもリソースであるため、その場合、2 つのリソース間で動作が異なります

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

一貫性のない動作を引き起こしているリソースの 1 つに問題があるのではないでしょうか?

于 2012-11-09T09:40:26.597 に答える