在chef lwrp的资源定义中是否需要attr_accessor?

时间:2015-04-24 10:37:25

标签: chef lwrp

我使用chefdk创建了一个LWRP,并按照文档和一些博客文章写了这封信。

资源

actions :install
default_action :install

provides :foo

attribute :name, :kind_of => String, :name_attribute => true

提供商

provides :foo

def whyrun_supported?
  true
end

use_inline_resources

action :install do
  converge_by("install: #{@new_resource}") do
    execute "installation of: #{@new_resource.name}" do
      command "foo install #{@new_resource.name}"
    end
  end
end

def load_current_resource
  @current_resource = Chef::Resource::Foo.new @new_resource.name
  @current_resource.name = @new_resource.name
end

在食谱中使用此LWRP时,我会收到以下错误:

undefined method `name=' for Chef::Resource::Foo

我能解决的唯一方法是将attr_accessor :name添加到资源定义中。但我从来没有在任何文档中看到这一点。从文档中,我假设Chef在资源/提供程序编译期间负责在任何属性上设置attr_accessor。任何人都可以确认我发现了什么或解释了真正发生的事情吗?

感谢。

1 个答案:

答案 0 :(得分:1)

def load_current_resource
  @current_resource = Chef::Resource::Foo.new @new_resource.name
  @current_resource.name = @new_resource.name
end

你的问题在这里,name应该是不变的(对于要匹配的当前和新资源),因为它识别资源,你不应该尝试设置@current_resource.name

删除此行,没有访问者就可以了。