厨师跳过食谱

Chef skip recipes

我有两个角色:

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 role

  {
    "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] 食谱[nginx]。请注意,它跳过了 Web 角色的最后一个 recipe[clean-up]。为什么?无论如何,我可以强制重新运行 recipe[clean-up]?

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

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

这是分多个阶段完成的:

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

更多详情here

主要思想是描述系统状态,如果系统处于所需状态,则能够 运行 N 次不更改系统。

您可以从您的基本角色中删除此配方,或者您可以执行一个 "closing" 角色,确保出现在每个节点 运行 列表的末尾。