厨师"模板" AWS OpsWorks中的资源:测试目标文件是否存在

时间:2015-09-22 11:46:39

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

我有以下问题。下面的厨师食谱代码片段表现不尽相同,尽管它们在纯逻辑方面看起来与我相同。

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

如果文件尚不存在,它们都应该创建一个文件。 但是在亚马逊OpsWorks的定制配方环境中,#34; setup"阶段,第一个溶剂按预期工作。 但是第二种溶剂可以产生假阳性"我每次运行食谱时都会这样。 "如果"语句传递错误但文件最后不存在。

所以我想知道是否有任何理由在厨师或/和红宝石中使用嵌套"模板"内部资源"如果"块。是"模板" ressource运行某种异步?

1 个答案:

答案 0 :(得分:1)

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

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

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

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

这解释了你看到(每隔一次跑步)来回翻转