ruby - 从资源中删除样板属性

标签 ruby chef-infra

在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/

相关文章:

chef-infra - Chef Windows - 要求 block 失败

ruby - 如何在 ruby​​/rspec 中卸载 'require'?

Ruby 在数组中查找下一个

chef-infra - 设置独特 Chef 节点属性的最佳实践

chef-infra - Opsworks Chef 11.10 和 yum 5.0 冲突

vagrant - 我可以将部分 Chef.json 移动到数据包吗?

ruby-on-rails - 向 Rails collection_select 添加额外的 html 属性

ruby - digest/hmac 是 ruby​​ 标准库的一部分

Ruby 关联数组计算

chef-infra - 发送到 Chef 服务器的黑名单属性