我希望include_recipe
only_if
满足某些条件。以下代码不会引发任何错误,但它也不关心only_if
条件,因此在任何情况下都会执行:
include_recipe "cubrid" do
only_if "hostname | grep 'blahblahshouldnotmatch'"
end
仅在某些条件下才能include_recipe
吗?
答案 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无法根据其他厨师在相同厨师-客户运行的情况下采取的措施,有条件地包含食谱。