厨师 - Dir.exists?保护将符号链接作为目录

时间:2015-08-28 16:30:20

标签: ruby chef chef-recipe

我有一个删除空日志目录的配方,然后在下一步中用符号链接替换它。

directory "#{ENV['GS_HOME']}/logs/" do
  action :delete
  only_if { ::Dir.exists?("#{ENV['GS_HOME']}/logs/") }
end

它第一次工作但是在下一个chef-client运行时它不应该删除现在是另一个目录的链接的项目,我收到一个错误:

Errno::ENOTDIR
--------------
Not a directory @ dir_s_rmdir ...

为什么警卫似乎将链接视为dir而不是跳过,但是资源操作会正确识别它,而不是作为一个,并且失败了?围绕这个最好的方法是什么?

1 个答案:

答案 0 :(得分:2)

警卫第一次检查它是否是目录。随后运行它可以检查文件目录是否是符号链接。尝试

directory "#{ENV['GS_HOME']}/logs/" do
  action :delete
  only_if { ::Dir.exist?("#{ENV['GS_HOME']}/logs/") || !::File.symlink?("#{ENV['GS_HOME']}/logs/") }
end