【问题标题】:Chef Recipe How To Check If File Exists厨师食谱如何检查文件是否存在
【发布时间】:2016-07-08 08:02:07
【问题描述】:

我刚开始使用 Chef,我正在尝试弄清楚如何在做任何事情之前先检查文件是否存在。

我为我当前的用例准备了文件部分,我正在删除生产服务器的登录文件,例如:

file '/var/www/html/login.php' do
    action :delete
end

但是,我希望能够首先检查文件是否存在,例如。

if (file_exists === true)
    file '/var/www/html/login.php' do
        action :delete
    end
end

【问题讨论】:

  • 为什么需要这个能力? Chef 不会检查系统的所需状态是否等于您描述的状态,并且仅在所需状态不同时才进行更改?您现在要解决什么实际问题或错误消息?
  • 嘿@DavidGrayson 感谢您的回复。我是新来的厨师,所以你的想法可能是对的。我目前没有遇到任何错误或问题,但是我已经习惯于编写条件语句,这似乎是正确的做法——这可能是我思维中的一个缺陷,因为我仍在了解最佳实践Chef 的运作方式。在这种情况下我不需要检查文件是否存在吗?这意味着如果文件不存在并且我仍在执行试图删除它的配方,我不会收到任何错误?
  • 我通常不使用 Chef 删除文件,但我知道当我创建它们时我不需要 "if" 语句,所以我不明白你为什么需要 " if" 删除时的语句。

标签: ruby if-statement chef-infra chef-recipe


【解决方案1】:

如 cmets 中所述,对于删除操作,if 语句是不必要的,如前所述,因为如果 chef 没有找到要删除的文件,它将假定它已被删除。

否则,您通常希望在资源中使用guard properties(适用于所有资源),而不是将资源包装在 if-then 中。

file '/var/www/html/login.php' do
    only_if { ::File.exist?('/var/www/html/login.php') }
    action :touch
end

您可能还想熟悉the Ruby File class methods

【讨论】:

  • 谢谢凯伦,这很有帮助。
  • 这是多余的,如下所述。如果文件不存在,file 资源对于 :delete 操作没有任何作用。
【解决方案2】:

Chef 的基本思想是您声明系统的所需状态,然后 Chef 将其与实际状态进行比较,并进行所需的任何更改以使系统进入所需状态。在删除文件之前,您不需要使用 if 语句来检查文件是否存在;如果我没记错的话,厨师本身应该检查文件是否存在。

【讨论】:

  • 感谢您的澄清。看来我需要继续转变我的思维方式,即 Chef 是对您希望基础设施所处状态的声明性描述,所以这是一个很好的提醒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
相关资源
最近更新 更多