Chef infra Chef run_state-在运行时获取目录列表并将其删除
我希望在运行时获得特定路径下的目录列表,并删除属性文件中列表以外的所有目录 因此,如果我的属性中包含以下内容:Chef infra Chef run_state-在运行时获取目录列表并将其删除,chef-infra,chef-recipe,Chef Infra,Chef Recipe,我希望在运行时获得特定路径下的目录列表,并删除属性文件中列表以外的所有目录 因此,如果我的属性中包含以下内容: default[:dir_list] = ['a', 'b', 'c'] 我有以下目录结构: /path/to/dir/{a,b,c,d,e,f} 它是在运行时打开一个包含{a,b,c,d,e,f}的tar文件创建的 在厨师长跑之后,我想要: /path/to/dir/{a,b,c} 我尝试了以下方法,但无效: ruby_block 'get list of directorie
default[:dir_list] = ['a', 'b', 'c']
我有以下目录结构:
/path/to/dir/{a,b,c,d,e,f}
它是在运行时打开一个包含{a,b,c,d,e,f}的tar文件创建的
在厨师长跑之后,我想要:
/path/to/dir/{a,b,c}
我尝试了以下方法,但无效:
ruby_block 'get list of directories to remove' do
block do
# get list of all dirs
all_dirs = Dir.entries("/path/to/dir")
# get list of all non-required dirs
node.run_state["dirs_to_delete"] = all_dirs - node[:dir_list] - [".", ".."]
end
end
node.run_state["dirs_to_delete"].each do | mydir |
directory "/path/to/dir/#{mydir}" do
recursive true
action :delete
end
end
上述方法不起作用的原因是
node.run_state["dirs_to_delete"].each do | dir |
在编译时求值,且为null
Chef允许使用“lazy{block}”,但只能在资源块内部使用,而不能在外部循环中使用
有什么想法吗?您的属性返回的是nil值,因为ruby块在编译模式下加载属性时没有运行,所以我修改了ruby块,使其在编译模式下运行,而在converge模式下不执行任何操作
ruby_block 'get list of directories to remove' do
block do
# get list of all dirs
all_dirs = Dir.entries("/path/to/dir")
# get list of all non-required dirs
node.run_state["dirs_to_delete"] = all_dirs - node[:dir_list] - [".",
".."]
:nothing
end
end.run_action(:run)
node.run_state["dirs_to_delete"].each do | mydir |
directory "/path/to/dir/#{mydir}" do
recursive true
action :delete
end
end
你看过报纸了吗?