符号 link 无法使用厨师食谱

symbolic link not working with chef recipe

我想创建符号 link 只有当它不存在时

我在下面写了菜谱

link '/home/user1/veera' do
    to '/usr/local/veera-10.0'
    only_if {test -L /home/user1/veera}
end

我在食谱中尝试了以下条件

only_if {test -L /home/user1/veera}

但是下次厨师 运行 时它会更新 symlink(如果它改变了)。但我不想要那个。

如果 symlink 存在,我想跳过这个,只有当 symlink 不存在时才创建。

也试过这个

link '/home/user1/veera' do
    to '/usr/local/veera-10.0'
    not_if { File.symlink?('/home/user1/veera') }
end

但在下一位厨师 运行

更改时,它仍在更新符号link

link resource 本质上是幂等的,如果 link 已经存在,则不应更改。

但是,出于某种原因,如果您想跳过这一步,我们可以使用 Ruby 的 File class 中的 symlink? 方法。此方法returnstrue/false根据目标路径是否link

喜欢:

File.symlink?('/home/user1/veera')

我注意到并在下面的示例中更正的另一个潜在问题是您的源路径 - usr/local/veera-10.0 很可能与您当前的工作目录相关。可以肯定的是,使用 /usr/local/veera-10.0.

所以在食谱中:

link '/home/user1/veera' do
  to '/usr/local/veera-10.0'
  not_if { File.symlink?('/home/user1/veera') }
end

更新

正如@lamont 在他的评论中建议的那样,尝试使用 File.exist? 测试,因为如果此路径存在(无论是文件、目录还是 symlink),您想跳过该步骤。

not_if { File.exist?('/home/user1/veera') }