我需要使用所有者“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
如何创建将要展开的目录变量列表?
答案 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