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
你看过报纸了吗?