AWS OpsWorks 中的 Chef "template" 资源:测试目标文件是否存在
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 "setup" 阶段的自定义配方的上下文中,第一个解决方案按预期工作。
但是第二种解决方案在我 运行 食谱时恰好每隔一秒提供一个 "false positive"。
"if" 语句返回 false 但最后文件不存在。
所以我想知道厨师 or/and ruby 在 "if" 块中嵌套 "template" 资源是否有任何原因。 "template" 资源是否 运行 某种异步?
简短的回答是,厨师实际上 运行 分两个阶段。您有一个编译阶段和一个执行(或有时称为收敛)阶段。
这意味着取决于模板将在编译时插入或不插入到配方中的文件的存在。
进一步阅读:
https://docs.chef.io/chef_client.html
https://serverfault.com/questions/604719/chef-recipe-order-of-execution-redux
那么你的情况会怎样:
- 首先没有文件。厨师食谱(通过编译阶段)决定应该有一个文件并在收敛阶段创建该文件。
- 2 日 运行,有一个文件,厨师食谱决定(通过再次编译)不应该有一个文件(即缺少模板)。当节点在第二阶段收敛时,chef 会删除文件,因为它试图将节点置于所需状态。
这解释了你看到的来回翻转(每隔 运行)
我有以下问题。下面的厨师食谱代码片段虽然在纯逻辑方面对我来说看起来相同,但表现并不相同。
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 "setup" 阶段的自定义配方的上下文中,第一个解决方案按预期工作。 但是第二种解决方案在我 运行 食谱时恰好每隔一秒提供一个 "false positive"。 "if" 语句返回 false 但最后文件不存在。
所以我想知道厨师 or/and ruby 在 "if" 块中嵌套 "template" 资源是否有任何原因。 "template" 资源是否 运行 某种异步?
简短的回答是,厨师实际上 运行 分两个阶段。您有一个编译阶段和一个执行(或有时称为收敛)阶段。
这意味着取决于模板将在编译时插入或不插入到配方中的文件的存在。
进一步阅读:
https://docs.chef.io/chef_client.html
https://serverfault.com/questions/604719/chef-recipe-order-of-execution-redux
那么你的情况会怎样:
- 首先没有文件。厨师食谱(通过编译阶段)决定应该有一个文件并在收敛阶段创建该文件。
- 2 日 运行,有一个文件,厨师食谱决定(通过再次编译)不应该有一个文件(即缺少模板)。当节点在第二阶段收敛时,chef 会删除文件,因为它试图将节点置于所需状态。
这解释了你看到的来回翻转(每隔 运行)