主厨`include_recipe`是否可以指示`only_if` / not_if`条件?

时间:2013-04-12 01:12:36

标签: chef

我希望include_recipe only_if满足某些条件。以下代码不会引发任何错误,但它也不关心only_if条件,因此在任何情况下都会执行:

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

仅在某些条件下才能include_recipe吗?

4 个答案:

答案 0 :(得分:19)

include_recipe不是Chef中的常规资源,而是一种常规方法。因此,它会忽略传递的块,然后忽略那里指定的only_if条件。

幸运的是,有一个解决方案。来自#chef freenode频道的松弛用户提出了以下解决方案,该方案运行良好。

this_node_is_shard_broker = node["hostname"].include? "node2"
include_recipe "cubrid" if this_node_is_shard_broker

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

答案 1 :(得分:5)

这很好用:

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

答案 2 :(得分:2)

上述内容对我不起作用,但以下情况确实如此:

if node["hostname"].include? "node2"
  include_recipe "cubrid"
end

答案 3 :(得分:0)

在所有建议的答案中

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

您会忘记一件非常重要的事情-如果if在编译阶段进行评估,并且如果在执行过程中更改了node ['bar'],那么if将产生错误的结果,因为它是基于原始的,并且而不是更改后的值。

有人会说这是一种不好的做法,但在这样做之前请三思。只是一个例子: 在chef-client运行中安装软件包是一种常见的做法。在那之后重新加载ohai插件包可以被视为一种很好的做法,但是代码会发生什么:

include_recipe "my_cookbook::install" unless node['packages'].key?('mypackage')

如果mypackage安装在同一客户运行中较早执行的菜谱中的某处?正确的答案是,将包括配方,虽然从代码中可以清楚地看到,但期望不是。

不幸的是,我至少不知道如何解决此问题,因为include_recipe和可能的条件都经过编译阶段评估。 AFAIK无法根据其他厨师在相同厨师-客户运行的情况下采取的措施,有条件地包含食谱。