Ruby 从资源中删除样板文件属性
在chef中,每个资源的定义如下:Ruby 从资源中删除样板文件属性,ruby,chef-infra,Ruby,Chef Infra,在chef中,每个资源的定义如下: directory "/home/akihiro/folder" do owner "akihiro" group "akihiro" mode 0755 end 如果这是秋野的主目录下的唯一任务,那就好了 不幸的是,我必须创建目录、复制文件和应用模板,所有这些都与所有者位于同一主目录下。因此所有者“akihiro”;必须在每个资源上设置组“akihiro”,这是非常冗余的 如果资源可以这样写 directory "/home/akihiro/f
directory "/home/akihiro/folder" do
owner "akihiro"
group "akihiro"
mode 0755
end
如果这是秋野的主目录下的唯一任务,那就好了
不幸的是,我必须创建目录、复制文件和应用模板,所有这些都与所有者位于同一主目录下。因此所有者“akihiro”;必须在每个资源上设置组“akihiro”
,这是非常冗余的
如果资源可以这样写
directory "/home/akihiro/folder" do
as_akihiro
mode 0755
end
如果因为_akihiro
是在资源之外的某个地方定义的,那么配方就会更加清晰
是否可以通过定义新方法来删除样板文件属性?这是可能的。对我来说,有效的方法是打开实现“目录”资源的类Chef::resource::directory,并添加一个方法作为_akihiro。为此,请在*your_cookbook*/libraries/as_user\u helper.rb中添加一个库
class Chef::Resource::Directory
def as_akihiro()
owner "akihiro"
group "akihiro"
end
你完成了 这里有几个选项 红润的 您可以创建定义此方法的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
车鱼 如果我理解您的用例是正确的,那么处理此问题的首选方法是使用(或HWRP)。您指出此过程会发生多次并包装核心厨师资源。这是LWRP的一个很好的用例。本质上,您可以将所有这些资源包装并参数化为一个“包装器” 然后在厨师菜谱中,您将使用此资源(假设它名为“company_user”):
我想如果你只是尝试一下,你会得到比在这里提问更快的答案。
# 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
company_user 'akihiro'