在chef中,每个资源的定义如下:
directory "/home/akihiro/folder" do
owner "akihiro"
group "akihiro"
mode 0755
end
如果这是akihiro
主目录下的唯一任务,那很好。
不幸的是,我必须创建目录,复制文件和应用模板,所有这些都在与所有者相同的主目录下。因此,必须在每个资源上设置owner "akihiro"; group "akihiro"
,这非常多余。
如果资源可以这样写,
directory "/home/akihiro/folder" do
as_akihiro
mode 0755
end
其中as_akihiro
定义在资源之外的某处,配方会更加清晰。
是否可以通过定义新方法来删除样板属性?
答案 0 :(得分:2)
这里有几个选项。
您可以创建一个定义此方法的Ruby模块:
module Impersonator
def as(person, perms = '0755')
send(:owner, person)
send(:group, person)
send(:mode, perms)
end
end
然后在资源中包含此模块:
Chef::Resource.send(:include, Impersonator)
然后使用它:
directory '/foo/bar' do
as 'akihiro' # or as 'akihiro', '0644'
end
如果我理解您的用例是正确的,那么处理此问题的首选方法是使用LWRP(或HWRP)。您表示此过程多次发生并包装核心Chef资源。这是LWRP的一个很好的用例。基本上,您将所有这些资源包装并参数化为一个“包装器”。
# providers/default.rb
action :run do
user new_resource.username do
# ...
end
directory "/home/#{new_resource.username}" do
owner new_resource.username
group new_resource.group
mode new_resource.mode
end
# Other resources, using the `new_resource` object
end
然后在Chef配方中,您将使用此资源(假设它被命名为“company_user”):
company_user 'akihiro'
答案 1 :(得分:1)
这是可能的。对我有用的是打开实现“目录”资源的类,Chef :: Resource :: Directory并添加方法as_akihiro。为此,请将库添加到* your_cookbook * / libraries / as_user_helper.rb
class Chef::Resource::Directory
def as_akihiro()
owner "akihiro"
group "akihiro"
end
你已经完成了。