Я хочу получить список каталогов по определенному пути во время выполнения и удалить все каталоги, которых нет в списке в моем файле атрибутов.
поэтому, если у меня есть следующие атрибуты:
default[:dir_list] = ['a', 'b', 'c']
и у меня есть следующая структура каталогов:
/path/to/dir/{a,b,c,d,e,f}
который создается во время выполнения путем открытия файла tar с {a,b,c,d,e,f} внутри.
После шеф-пробега я хотел бы иметь:
/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 позволяет использовать «ленивый {блок}», но только внутри блока ресурсов, а не во внешнем цикле.
Любые идеи?