我希望在运行时获取某个路径下的目录列表,并删除属性文件中不在列表中的所有目录。
所以如果我的属性中有以下内容:
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}”,但仅限于资源块内部而不是外部循环。
有什么想法吗?
答案 0 :(得分:0)
你的属性返回nil值,因为在编译模式下加载属性时ruby块没有运行,我修改了ruby块以在编译模式下运行,并且在聚合模式下什么都不做。
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