ruby - 在 Ruby + Chef 中检查现有目录失败

标签 ruby chef-infra

这是我在 Chef Recipe 中的一 block Ruby:

# if datadir doesn't exist, move over the default one
if !File.exist?("/vol/postgres/data")
    execute "mv /var/lib/postgresql/9.1/main /vol/postgres/data"
end

结果是:

Executing mv /var/lib/postgresql/9.1/main /vol/postgres/data
mv: inter-device move failed: `/var/lib/postgresql/9.1/main' to `/vol/postgres/data/main'; unable to remove target: Is a directory

我知道 /vol/postgres/data 存在并且是一个目录,但它仍然尝试执行 mv。为什么?

可以肯定的是,在同一台机器上运行以下独立的 Ruby 脚本会输出“nomv”:

if !File.exist?("/vol/postgres/data")
print "mv"
else
print "nomv"
end

最佳答案

我之前没那么专心,我以为你是在 not_ifonly_if block 中检查文件是否存在。您的问题类似于此问题中的问题:Chef LWRP - defs/resources execution order .请参阅此处的详细说明。

您的问题是 !File.exist?("/vol/postgres/data") 代码会立即执行 -(因为它是纯 ruby​​),在执行任何资源之前,因此在执行之前已安装 postgress。

解决方案应该是将检查移动到 not_if block 。

execute "mv /var/lib/postgresql/9.1/main /vol/postgres/data" do
  not_if { File.exist?("/vol/postgres/data") }
end

关于ruby - 在 Ruby + Chef 中检查现有目录失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17596304/

相关文章:

ruby - Nanoc布局编译规则

arrays - 如何检查任何子数组是否不包含其他子数组中的项目? ruby

python - 在 Chef 服务器中,如何确定节点何时完全引导

linux - 如何让 Chef 重新加载全局路径

chef-infra - Vagrant : how to get hostonly ip address from within chef recipe?

ruby - 执行名称中带 * 的 ls 命令

ruby-on-rails - url 助手在 Capybara 功能测试中不使用主机名

Ruby 语言好奇的整数运算 : (-5/2) ! = -(5/2)

bash 资源似乎没有加载我的 .bashrc 文件

ruby-on-rails - 在运行包更新时避免 RSA key 指纹