14

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

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

是否可以include_recipe仅在某些条件下进行?

4

4 回答 4

24

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,这正是我想要实现的。

于 2013-04-12T01:55:59.727 回答
8

这工作得很好:

include_recipe "foo" if node['bar'] == 'baz'
于 2015-05-14T02:09:00.743 回答
3

以上对我不起作用,但以下对我有用:

if node["hostname"].include? "node2"
  include_recipe "cubrid"
end
于 2015-04-24T11:45:55.577 回答
0

在所有建议的答案中

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

您忘记了一件极其重要的事情 - if 在编译阶段进行评估,如果 node['bar'] 在执行过程中发生更改, this if 将提供错误的结果,因为它将基于原始而不是更改价值。

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

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

如果 mypackage 安装在同一客户端运行中较早执行的食谱中的某处?正确的答案是配方将被包括在内,而从代码中可以清楚地看出,期望它不是。

不幸的是,我至少不知道如何解决这个问题,因为 include_recipe 和可能的条件都是编译阶段评估的。AFAIK 没有办法根据其他食谱在相同的厨师客户端运行中所采取的操作来有条件地包括食谱。

于 2019-03-08T11:41:58.967 回答