【问题标题】:Specifying which cookbooks to run with Chef Solo指定使用 Chef Solo 运行哪些食谱
【发布时间】:2012-03-29 04:05:44
【问题描述】:

我正在使用 chef-solo 在本地测试我的食谱,但我希望能够只运行我正在测试的食谱。目前,似乎 chef-solo 将运行 solo.rb 中指定的食谱目录中的所有食谱。我已经在 json 属性文件中指定了运行列表,并在 solo.rb 中指定了 json 文件的位置,但这似乎没有帮助。它至少会解析所有其他说明书的属性,因为我有一个不适用于我的本地配置并且它会导致整个运行失败。

到目前为止,我发现的最佳解决方案是将测试所需的说明书移动到不同的目录并在 solo.rb 中指定。有没有更好的方法?

【问题讨论】:

    标签: chef-infra


    【解决方案1】:

    更新:chef-solo 不再是 Chef-client 之外的“独立”工具。来自documentation

    chef-solo 是一个执行 chef-client 的命令,它不需要 Chef 服务器来聚合食谱。 chef-solo 使用 chef-client 的 Chef 本地模式,不支持 chef-client / server 配置中存在的以下功能

    此更改在Chef version 12.11 中实现,它满足community RFC。这是在 2016 年 6 月 8 日发布的。下面描述的旧行为(尽管此时是 4 年前的)可通过 --legacy-mode 参数提供给 chef-solo

    有关 Chef Solo 的最新信息,请阅读the official documentation

    我原来的答案如下:

    厨师(单独或客户)不会“运行”所有食谱。

    加载以下目录中的所有食谱的 Ruby 文件,顺序如下:

    • 库/*.rb
    • providers/*.rb
    • 资源/*.rb
    • 属性/*.rb
    • 定义/*.rb

    然后,它会加载节点扩展运行列表中的所有配方。对于chef-solo,这来自-j 提供的 JSON 文件,或者可以在属性文件中完成 - 但是后者已被弃用且不推荐使用。

    通过include_recipe 包含在扩展运行列表中的任何配方也会被加载。 Chef 通过将食谱评估为 Ruby 代码来加载食谱。当它遇到它识别为资源或定义的 ruby​​ 代码时,它会将资源添加到资源集合中,这是所有资源的数字排序索引散列。定义是特殊的,因为 Chef 将它们包含的资源而不是定义本身添加到资源集合中。通过include_recipe 包含的菜谱资源被插入到位,然后厨师继续包含菜谱。

    一旦 Chef 处理了所有资源的所有配方,它就会遍历资源集合,按照添加到集合中的顺序对每个资源集合采取指定的操作。

    我强烈建议您阅读有关此过程的文档。适用于Chef Solo;仅跳过从服务器下载食谱的部分。

    为确保仅测试您要测试的配方,请通过 JSON 文件将它们包含在节点的运行列表中。它看起来像这样:

    { "run_list": ["recipe[mything]", "recipe[anotherthing]"] }
    

    运行列表只是一个数组,项目可以是recipe[cookbookname]role[somerole]。您可以在 Chef Solo 文档中阅读有关如何在 Chef Solo 中使用角色的更多信息。

    如果您在 Chef 加载食谱组件(每个食谱中的 ruby​​ 文件)时进行了系统更改,那么“您做错了”(tm)并且应该重构这些事情以在名为的资源中完成来自食谱。

    【讨论】:

    • 所有链接都坏了
    【解决方案2】:

    另外值得注意的是,在测试时您可以轻松覆盖运行列表

    chef-solo --override-runlist "role["somerole"],recipe[mycookbook::recipe]"
    

    【讨论】:

    • 如果您的食谱是在/etc.chef-solo.rb 中定义的,您也可以这样简写它$ sudo chef-solo -o nginx::start
    • 这个命令给了我以下错误:没有这样的食谱。菜谱名字没问题,菜谱名字也没问题。
    【解决方案3】:

    遗憾的是,我认为没有。 Chef 以两遍模式运行:首先,它解析并构建您的说明书的模型(“编译”阶段),然后仅运行您在运行列表中指定的那些说明书。我相信它这样做是为了确保它在编译阶段捕获说明书之间的依赖关系。编译阶段必须一致,否则会出错。

    要真正理解这一点,请查看ruby block 资源。任何在你的配方中浮动的红宝石都将在编译时进行评估;您想在 评估 时间运行的任何 ruby​​ 都必须放置在 ruby​​ 块资源中。一旦你理解了这一点,两遍评估的本质就会变得很明显。

    我认为您唯一的选择是像您正在做的那样一次引入一本食谱,或者修复您的属性。

    【讨论】:

      【解决方案4】:

      您需要创建一个 JSON 文件。在那里你可以指定应该运行什么食谱:

      {
        "run_list": [ "recipe[hello-chef]" ]
      }
      

      在这个循序渐进的教程中有很好的解释:http://codeflex.co/creating-and-running-your-first-chef-cookbook/

      【讨论】:

        【解决方案5】:
        最近更新 更多