从资源中删除样板属性

时间:2014-01-31 04:35:18

标签: ruby chef

在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定义在资源之外的某处,配方会更加清晰。

是否可以通过定义新方法来删除样板属性?

2 个答案:

答案 0 :(得分:2)

这里有几个选项。

Rubyish

您可以创建一个定义此方法的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

Chefish

如果我理解您的用例是正确的,那么处理此问题的首选方法是使用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

你已经完成了。