繁体   English   中英

AWS OpsWorks中的Chef“模板”资源:测试目标文件是否存在

[英]Chef “template” resource in AWS OpsWorks: test that target file exists

我有以下问题。 以下厨师食谱代码段的行为不尽相同,尽管就纯逻辑而言,它们在我看来是相同的。

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”块内嵌套“模板”资源。 “模板”资源是否运行某种异步?

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

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

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

  • 首先没有文件。 厨师配方(通过编译阶段)决定应该有一个文件,并在融合阶段创建该文件。
  • 在第二次运行中,有一个文件,厨师配方决定(通过再次编译)不应有一个文件(即缺少模板)。 当节点在第二阶段收敛时,chef会在尝试将节点置于所需状态时将其删除。

这就解释了您来回翻转(每次其他运行)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM