gpt4 book ai didi

chef-infra - Chef 与所有者递归创建目录

转载 作者:行者123 更新时间:2023-12-05 00:19:26 28 4
gpt4 key购买 nike

我需要创建一个所有者为“testuser”的目录树。
但是,如果我指定“/foo/bar/baz”,则只有在“testuser”、“/foo”和“/foo/bar”下创建的“baz”归“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

如何创建将被扩展的目录变量列表?

最佳答案

避免字符串插值

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

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

[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 中存在一种更优雅、更短的方法来做到这一点。

关于chef-infra - Chef 与所有者递归创建目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35952170/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com