ruby - Chef - Dir.exists? guard 将符号链接(symbolic link)视为目录

标签 ruby chef-infra chef-recipe

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

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 ...

为什么守卫似乎将链接视为目录而不是跳过,但资源操作正确识别它,而不是一个,并失败?解决这个问题的最佳方法是什么?

最佳答案

第一次,守卫检查它是否是一个目录。随后运行它可以检查文件目录是否是符号链接(symbolic link)。尝试

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

关于ruby - Chef - Dir.exists? guard 将符号链接(symbolic link)视为目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32275732/

相关文章:

ruby - 压缩 {|n1, n2| Ruby 中的 n1 ^ n2}

apache - 如何以编程方式查询 Windows 上 Apache TomCat 7 的当前内存设置?

linux - 使用数据包对资源 `install` 执行操作 'newrelic_agent_infrastructure[Install]' 时出错

chef-infra - 获取菜谱中 Chef 搜索返回的节点IP地址

Git 使用 Chef git 资源部署主分支或特定提交或标记

ruby-on-rails - 如何在 ruby​​ on rails 中正确执行 "where"子句?

ruby-on-rails - "Or"语句在 Rails 查询中不起作用

ruby-on-rails - 使用 Carrierwave 下载多个文件

python - 如何修复 ruby 错误: sh: 1: make: not found

apache - 如何更改chef nginx默认http端口80?