在chef中,每个资源都是这样定义的:
directory "/home/akihiro/folder" do
owner "akihiro"
group "akihiro"
mode 0755
end
如果这是 akihiro
主目录下的唯一任务,那很好。
不幸的是,我必须在与所有者相同的主目录下创建目录、复制文件和应用模板。因此 所有者“akihiro”; group "akihiro"
必须在每个资源上设置,这是非常多余的。
如果资源可以这样写,
directory "/home/akihiro/folder" do
as_akihiro
mode 0755
end
as_akihiro
定义在资源外部的某处,配方会变得更加清晰。
是否可以通过定义新方法来删除样板属性?
最佳答案
这里有几个选项。
ruby 色
您可以创建一个定义此方法的 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 Recipe 中,您将使用此资源(假设它被命名为“company_user”):
company_user 'akihiro'
关于ruby - 从资源中删除样板属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21472475/