gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:09:49 26 4
gpt4 key购买 nike

这是我在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com