【问题标题】:symbolic link not working with chef recipe符号链接不适用于厨师食谱
【发布时间】:2021-10-31 19:29:14
【问题描述】:

我只想在符号链接不存在时创建它

我已经写了下面的食谱

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}

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

如果符号链接存在,我想跳过这个,仅在符号链接不存在时创建。

也试过了

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

但在下一次厨师运行更改时它仍在更新符号链接

【问题讨论】:

    标签: chef-infra chef-client


    【解决方案1】:

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

    但是,出于某种原因,如果您想跳过该步骤,我们可以使用 Ruby 的 File class 中的 symlink? 方法。该方法根据目标路径是否为链接返回true/false

    喜欢:

    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? 测试,因为如果此路径存在(无论是文件、目录还是符号链接),您想跳过该步骤。

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

    【讨论】:

    • 我试过了,但它会在下次运行时更新符号链接(如果用户修改了符号链接)。我的要求是在下次厨师运行时不更新符号链接。它应该只运行这个当符号链接不存在时
    • 在我的测试中,它正在跳过任务。甚至test -L /home/user1/veera 也可以使用,但守卫应该是not_if。此外,在您的示例中,您有 usr/local/...,它不完全是 /usr/local/...
    • 如果我使用not_if test -L /home/user1/veera ,如果它不存在则不会创建符号链接
    • 通过将源路径更正为/usr/... 并使用File.symlink? 来检查
    • 你想要not_if { File.exist?('/home/user1/veera') }吗?
    猜你喜欢
    • 1970-01-01
    • 2021-11-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    相关资源
    最近更新 更多