【问题标题】:Chef "template" resource in AWS OpsWorks: test that target file existsAWS OpsWorks 中的 Chef“模板”资源:测试目标文件是否存在
【发布时间】:2015-12-19 09:08:30
【问题描述】:

我有以下问题。下面的厨师食谱代码 sn-ps 的行为并不相同,尽管它们在纯逻辑方面对我来说看起来是一样的。

template "Create a file if not exists" do
  path "#{site_docroot}/somefile.php"
  source 'somefile.php.erb'
  action :create_if_missing
end

VS.

if !File.exists? "#{site_docroot}/somefile.php"
    template "Create a file if not exists" do
      path "#{site_docroot}/somefile.php"
      source 'somefile.php.erb'
      action :create
    end
end

如果文件尚不存在,两者都应该创建一个文件。 但在 Amazon OpsWorks“设置”阶段的自定义配方的上下文中,第一个解决方案按预期工作。 但是第二个解决方案恰好在我运行配方的每一秒时都会提供“误报”。 "if" 语句返回 false,但文件最后不存在。

所以我想知道在厨师或/和红宝石中是否有任何理由在“if”块内嵌套“模板”资源。 “模板”资源是否运行某种异步?

【问题讨论】:

    标签: ruby amazon-web-services chef-infra aws-opsworks


    【解决方案1】:

    简短的回答是,厨师实际上分两个阶段运行。您有一个编译阶段和一个执行(或有时称为收敛)阶段。
    这意味着取决于模板在编译时将插入或不插入到配方中的文件的存在。

    延伸阅读:
    https://docs.chef.io/chef_client.html
    https://serverfault.com/questions/604719/chef-recipe-order-of-execution-redux

    那么在你的情况下会发生什么:

    • 首先没有文件。厨师食谱(通过编译阶段)决定应该有一个文件并在收敛阶段创建文件。
    • 在第二次运行时,有一个文件,厨师食谱决定(通过再次编译)不应该有一个文件(即缺少模板)。当节点在第二阶段收敛时,厨师会删除文件,因为它试图将节点带到所需的状态。

    这解释了你看到的来回翻转(每隔一次运行)

    【讨论】:

    • 这是一个很好的简短回答。在阅读了“only_if”、“not_if”保护和“.run_action(...)”阶段切换之后,我得到了编译和收敛的东西。但是您提供了有关文件每第二次运行就被删除的解释。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2017-09-04
    • 2017-05-05
    • 2016-05-31
    • 1970-01-01
    • 2011-01-03
    • 2014-12-19
    • 1970-01-01
    • 2017-04-24
    相关资源
    最近更新 更多