Chef infra Chef使用所有者递归创建目录

Chef infra Chef使用所有者递归创建目录,chef-infra,Chef Infra,我需要创建一个拥有者为“testuser”的目录树。 但如果我指定“/foo/bar/baz”,则只指定在“testuser”下创建的“baz”,“/foo”和“/foo/bar”属于“root”用户 基于此文档 我们可以使用下面的结构,在我尝试使用变量作为目录之前,它是正常的 %w[ /foo /foo/bar /foo/bar/baz ].each do |path| directory path do owner 'testuser' group 'testuser'

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

基于此文档 我们可以使用下面的结构,在我尝试使用变量作为目录之前,它是正常的

%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
如何创建要展开的目录变量列表?

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

避免字符串插值 您自己的解决方案依赖于不同项的字符串插值,稍后您会再次将其拆分为多个部分

您可以通过以下方式避免这种情况,虽然我不完全了解这些属性的来源:

[node['foo']、node['bar']、node['baz']。每个do |路径|
目录路径
所有者“testuser”
组“testuser”
模式“0755”
结束
结束
避免声明完整路径 创建资源的一种更简单的方法是递归地为完整路径创建
目录
资源
foo/baz/bar
,您可以使用以下代码,将路径拆分为多个部分,而无需以问题的方式声明完整路径(
%w{foo-foo/bar-foo/bar/baz}
):

dir=“foo/bar/baz”

[]点击{| x |路径名(dir)。每个|文件名{| d | x如果在以下属性中具有默认值:

default["foo"]["logpath"] = "/var/log/apps"
然后在配方中定义为创建目录:

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

您不需要字符串插值。您只需要在纯ruby中工作

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

这里没有插入的理由。您使用的是ruby,所以@StephenKing的答案是正确的。
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