【问题标题】:Is it possible to Chef `include_recipe` and indicate `only_if`/not_if` condition?是否可以厨师`include_recipe`并指示`only_if`/not_if`条件?
【发布时间】:2019-03-08 19:41:58
【问题描述】:

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

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

是否只能在某些情况下include_recipe

【问题讨论】:

    标签: chef-infra


    【解决方案1】:

    include_recipe 不是 Chef 中的普通资源,而是普通方法。因此,它会忽略传递的块以及随后指定的 only_if 条件。

    幸运的是,有一个解决方案。 #chef freenode 频道的flaccid 用户建议了以下解决方案,效果很好。

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

    只有当前运行节点的主机名是node2,上面才会执行include_recipe,这正是我想要实现的。

    【讨论】:

    • include_recipe 似乎只是一个普通的 ruby​​ 函数调用,因此您可以使用普通的 ruby​​ if <condition> <code> end
    【解决方案2】:

    这很好用:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        在所有建议的答案中

        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 无法根据具有相同厨师客户端运行的其他食谱所采取的操作来有条件地包含食谱。

        【讨论】:

        • 我认为,如果您真的想根据可能在 Chef 运行期间更改的属性来制作配方,那么您唯一的选择是使配方中的每个资源都有条件。但这是一个非常罕见的用例。更常见的是,希望将字符串传递给only_if,该字符串将由自定义解释器解释,现在必须手动执行调用该解释器并从其输出中提取布尔值的工作。不方便,但通常可以接受。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-09
        相关资源
        最近更新 更多