我使用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
。任何人都可以确认我发现了什么或解释了真正发生的事情吗?
感谢。
答案 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
。
删除此行,没有访问者就可以了。