Chef用所有者递归创建目录

时间:2016-03-12 00:21:01

标签: chef

我需要使用所有者“testuser”创建一个目录树。 但是如果我指定“/ foo / bar / baz”只在“testuser”下创建“baz”,“/ foo”和“/ foo / bar”拥有“root”用户。

directory /foo/bar/baz do
  owner 'testuser'
  group 'testuser'
  recursive true
  action :create
  mode '0755'
end

基于此文档https://docs.chef.io/resource_directory.html 我们可以使用以下结构,直到我尝试将变量用作目录时才可以。

%w[ /foo /foo/bar /foo/bar/baz ].each do |path|
  directory path do
    owner 'testuser'
    group 'testuser'
    mode '0755'
  end
end

如果我在此列表中指定变量,我的目录名称为“#{node ['foo']}”等等。

%w[ #{node[‘foo’]} #{node[‘bar’]} #{node[‘baz’]} ].each do |path|
  directory path do
    owner 'testuser'
    group 'testuser'
    mode '0755'
  end
end

如何创建将要展开的目录变量列表?

4 个答案:

答案 0 :(得分:2)

如果在以下属性中具有默认值:

default["foo"]["logpath"] = "/var/log/apps"

然后在配方中定义为创建目录:

directory node["foo"]["logpath"] do
  owner 'testuser'
  group 'testuser'
  recursive true
  mode '0755'
end

答案 1 :(得分:1)

避免字符串插值

您自己的解决方案依赖于不同项目的字符串插值,您稍后会再次拆分成它们的部分。

你可以避免这种情况,例如以下列方式,虽然我不完全理解,这些属性来自哪里:

[node['foo'], node['bar'], node['baz']].each do |path|
  directory path do
    owner 'testuser'
    group 'testuser'
   mode '0755'
  end
end

避免声明完整路径

一种创建资源的简单方法,可以为完整路径directory递归创建foo/baz/bar资源,您可以使用以下代码将路径拆分为多个部分,而无需声明路径中的完整路径问题的方式(%w{foo foo/bar foo/bar/baz}):

dir = "foo/bar/baz"
[].tap{|x| Pathname(dir).each_filename{|d| x << (x.empty? ? [d] : x.last + [d])}}.each do |dir|
  directory File.join(dir) do
    owner 'testuser'
    group 'testuser'
    mode '0755'
  end
end

可能在Ruby中存在更优雅,更短的方式。

答案 2 :(得分:0)

自己找到答案。 如果要插入变量,请使用%W而不是%w

答案 3 :(得分:0)

您不需要字符串插值。你只是在直接红宝石中工作。

path = ''
path_ary = %w(foo bar baz) # or [node['foo'], node['bar'], node['baz'])
path_ary.each |path_element|
  path += "/#{path_element}"
  directory File.join(path) do
    owner 'testuser'
    group 'testuser'
    mode '0755'
  end
end