【问题标题】:Chef skip recipes厨师跳过食谱
【发布时间】:2015-04-07 17:18:44
【问题描述】:

我有两个角色:

base.json

{
  "chef_type": "role",
  "default_attributes": {},
  "description": "Base Machine",
  "env_run_lists": {},
  "json_class": "Chef::Role",
  "name": "base",
  "override_attributes": {},
  "run_list": [
    "recipe[apt]",
    "recipe[clean-up]"
  ]
}

web.json,其中包括 base 角色

  {
    "chef_type": "role",
    "default_attributes": {},
    "description": "Web Machine",
    "env_run_lists": {},
    "json_class": "Chef::Role",
    "name": "web",
    "override_attributes": {},
    "run_list": [
      "role[base]",
      "recipe[nginx]",
      "recipe[clean-up]"
    ]
  }

当我运行时,run_list 会扩展为:recipe[apt]recipe[clean-up]recipe[nginx]。请注意,它跳过了网络角色的最后一个recipe[clean-up]。为什么?无论如何我可以强制重新运行 recipe[clean-up]

【问题讨论】:

    标签: chef-infra chef-recipe chef-solo


    【解决方案1】:

    不,Chef 是一个配置管理系统,而不是脚本运行器。

    每个配方都应该运行一次并使系统处于特定状态。

    这是分多个阶段完成的:

    1. 同步运行列表(展开后,每个配方按它们出现的顺序一次)
    2. 编译每个配方中的资源,制作资源集合(按它们出现的顺序)
    3. 收敛:运行每个资源的代码(提供者代码),如果所需状态与当前状态不同,则执行某些操作。
    4. 运行更新资源触发的延迟通知。

    更多详情here

    主要思想是描述一个系统状态,如果它处于期望的状态,并且能够运行N次而不改变系统。

    你可以从你的基本角色中删除这个配方,或者你可以做一个“关闭”角色,确保出现在每个节点运行列表的末尾。

    【讨论】:

    • 感谢您的反馈,您提到的“关闭”角色我该怎么做?
    • 当你扮演你的基本角色时,你必须确保自己在最后(有刀插件可以帮助你)
    • 啊.. ic。所以如果我将 recipe[clean-up] 添加到 web 角色,那么我需要从 中删除 recipe[clean-up]基础 角色。我说的对吗?
    • 根据您的问题,配方已经在您的网络角色中。因此,仅将其从基础中删除就足够了(但在不了解您的基础架构的其余部分的情况下,我无法判断对其他节点的影响)