【问题标题】:How to make chef run all the recipes in a cookbook without explicitly listing each one?如何让厨师在不明确列出每个食谱的情况下运行食谱中的所有食谱?
【发布时间】:2020-01-17 12:55:12
【问题描述】:

有没有办法告诉厨师节点运行食谱中的所有食谱文件,而无需手动将每个文件添加到运行列表或从工作站执行一些其他手动任务?

我怀疑可能有一种方法可以在厨师客户端执行时查询可用食谱列表,但我不知道 ruby​​ 命令/语法是什么。

【问题讨论】:

  • 目录列表保存到文件?试试find /recipes/directory -type f -maxdepth 1 >> runlist.file 或任何适合厨师的东西。
  • 我想到的第一个想法是创建一个脚本,它将 include_recipes 添加到食谱的每个食谱的默认食谱中。以“bash”的方式:for f in `ls -I default.rb -1`; do echo "include_recipe 'cookbook::$f'"; done > default.rb 这意味着默认配方应该只有这些包含,如果你在 ti 中有代码,请将其移至 anotehr 配方。 (但这听起来很糟糕)

标签: chef-infra


【解决方案1】:

没有什么特别的东西不会触及许多内部 API。不过,这可能意味着您的食谱中有太多食谱。你想做什么?

【讨论】:

  • 通过 IRC 跟进用户,但他们拒绝了进一步的帮助。
  • 我很感激你的努力,我真的很感激。请不要在我的回复中读到任何忘恩负义。你的热心帮助绝对让这个世界和这个社区变得更美好。只是我真正想要的只是对我提出的问题有针对性的回答。为您提供我的组织、基础架构和工作流程的所有详细信息,以便您为我分析我的问题,这比我想了解的要复杂得多。如果一段时间后没有“是”答案出现,我会将这个“否”答案标记为正确。
  • 当有人要求“打破 API 边界的规则”时,我需要知道这确实是正确的解决方案,然后才将代码交给他们。否则就是不负责任地让人们接触到 Chef 的内部结构。例如,我可以为您提供一个 Ruby 单线器来执行此操作,并且我可以承诺它会在 Chef 13 中中断,因为我是计划在我们更改食谱文件数据时中断它的人在内存中格式化。如果您想要简单的答案,那么不,您不能这样做。如果你想要真正的答案,你需要确保你想深入到最深处。
  • 明白了。我不会征求将来会破坏的不受支持的黑客攻击。老实说,我只是不知道支持或不支持什么。除了docs.chef.io/recipes.html 提供的内容之外,在编写食谱时还不清楚您可以使用(或禁止)什么。这些 API 边界在哪里定义?
  • 既然我们正在讨论这个主题,并且如果它是一个简单的单行,那么是否有理由让这个功能成为一个坏主意?就像一个看起来像 recipe[my_cookbook::*] 之类的 run_list 条目?
【解决方案2】:

在食谱的默认配方 (default.rb) 中添加以下行。

include_recipe "cookbook::recipe"

包括所有类似的食谱和 现在通过仅将食谱名称添加到运行列表来运行厨师客户端(不要提及食谱,或者您可以提及默认食谱。无论哪种方式都可以)

【讨论】:

    猜你喜欢
    • 2017-04-27
    • 2021-11-01
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多