Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 从资源中删除样板文件属性_Ruby_Chef Infra - Fatal编程技术网

Ruby 从资源中删除样板文件属性

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

在chef中,每个资源的定义如下:

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'