Chef infra 是否可以“包括食谱”并在条件下注明“仅当条件”或“不当条件”?

Chef infra 是否可以“包括食谱”并在条件下注明“仅当条件”或“不当条件”?,chef-infra,Chef Infra,仅当满足某些条件时,我才想包括配方。下面的代码不会引发任何错误,但它也不关心仅当条件时的情况,因此在任何情况下都会执行: include_recipe "cubrid" do only_if "hostname | grep 'blahblahshouldnotmatch'" end 只有在某些条件下才可以包含食谱吗?包含食谱在Chef中不是一种正常的资源,而是一种正常的方法。因此,它将忽略传递的块,并随后忽略指定的条件 幸运的是,有一个解决方案flaccid来自#chef freen

仅当满足某些条件时,我才想
包括配方
。下面的代码不会引发任何错误,但它也不关心
仅当
条件时的情况,因此在任何情况下都会执行:

include_recipe "cubrid" do
    only_if "hostname | grep 'blahblahshouldnotmatch'"
end

只有在某些条件下才可以
包含食谱
吗?
包含食谱
在Chef中不是一种正常的资源,而是一种正常的方法。因此,它将忽略传递的块,并随后忽略指定的
条件

幸运的是,有一个解决方案flaccid来自#chef freenode频道的用户建议了以下解决方案,效果非常理想

此\u节点\u是\u shard\u broker=node[“hostname”]。是否包括?“节点2”
如果此\u节点\u是\u碎片\u代理,则包含\u配方“cubrid”

仅当当前运行节点的主机名为
node2
时,上述操作才会执行
include\u recipe
,这正是我想要实现的目标。

上述操作对我不起作用,但以下操作确实起到了作用:

if node["hostname"].include? "node2"
  include_recipe "cubrid"
end
这很好:

include_recipe "foo" if node['bar'] == 'baz'

所有的答案都表明

include_recipe "foo" if node['bar'] == 'baz'
您忘记了一件极为重要的事情—此if在编译阶段进行计算,如果节点['bar']在执行过程中发生更改,则此if将提供错误的结果,因为它将基于原始值,而不是更改后的值

有人可能会说,这是一种不好的做法,但在这样做之前要三思。举个例子: 在chef客户端运行中安装软件包是一种常见做法。在此之后重新加载ohai插件包可以被视为一种良好的做法,但代码会发生什么情况:

include_recipe "my_cookbook::install" unless node['packages'].key?('mypackage')
如果mypackage安装在cookbook中的某个地方,而该cookbook在同一客户机运行的早期执行?正确的答案是,配方将被包括在内,而从代码中可以清楚地看到,期望值是它不是


不幸的是,我至少不知道如何解决这个问题,因为include_配方和可能的条件都是在编译阶段评估的。抱歉,没有办法根据其他烹饪书在同一个厨师客户端运行时所采取的操作来有条件地包含食谱。

include\u recipe
似乎只是一个普通的ruby函数调用,因此您可以使用普通ruby
if
end
。我想如果您真的想让食谱有条件地包含在属性,在厨师运行期间可能会更改,您唯一的选择是使配方中的每个资源都有条件。但这是一个非常罕见的用例。更常见的情况是,只在
由自定义解释器解释的情况下才将字符串传递给
,现在必须手动调用该解释器并从其输出中提取布尔值。不方便,但一般可以接受。