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

问题描述 投票:10回答:4

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

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

是否有可能只在某些条件下include_recipe

chef
4个回答
21
投票

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


6
投票

这很好用:

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

2
投票

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

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

0
投票

在所有提出的答案中

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

你忘记了一个非常重要的事情 - 如果在编译阶段进行评估,如果在执行过程中更改了节点['bar'],这将导致错误的结果,因为它将基于原始,而不是更改值。

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

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

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

不幸的是,我至少不知道如何解决这个问题,因为include_recipe和可能的条件都是编译阶段评估的。 AFAIK没有办法条件包括基于其他烹饪书采取相同厨师 - 客户运行的行动的配方。

© www.soinside.com 2019 - 2024. All rights reserved.