Chef run_state - 获取运行时的目录列表并将其删除

时间:2018-03-15 12:00:11

标签: chef 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 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}”,但仅限于资源块内部而不是外部循环。

有什么想法吗?

1 个答案:

答案 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