默认的run_list和' _default'之间有什么区别?大厨的环境run_list?

时间:2013-06-21 06:11:56

标签: chef

我对如何在厨师中使用环境运行列表感到困惑。 正如您可以看到以下role.json。在env_run_lists中,您有_default,然后我们已经有了默认的run_list。有什么不同?并且在运行环境run_list之前每次都会运行默认值吗?

{
  "name": "webserver",
  "default_attributes": {
  },
  "json_class": "Chef::Role",
  "env_run_lists": {
    "_default": [

    ],
    "production": [

    ],
    "dev": [
      "role[base]",
      "recipe[apache]",
      "recipe[apache::copy_dev_configs]"
    ]
  },
  "run_list": [
    "role[base]",
    "recipe[apache]"
  ],
  "description": "The webserver role",
  "chef_type": "role",
  "override_attributes": {
  }
}

2 个答案:

答案 0 :(得分:3)

我同意这很令人困惑,特别是因为documentation似乎与我通过查看来源可以看到的行为不一致。

从阅读source我们可以看到,当构造Role对象时,它会根据_default环境键入run_list属性的内容,然后将哈希与内容合并env_run_lists属性的值(覆盖_default键的值)。

这在实践中意味着,如果您指定run_list属性,则需要在env_run_list属性中包含_default环境。如果您选择在env_run_list属性中包含_default环境,那么它将覆盖run_list属性中定义的任何内容。

要指出的另一个显而易见的事情是,如果您的节点不属于角色中定义的任何环境(_default或其他)it will fall back to using the run_list for the _default environment

答案 1 :(得分:2)

  

这在实践中意味着如果指定run_list属性,则不需要在env_run_list属性中包含_default环境。

我没有50个声誉所以我不能评论Jared Russell的答案,但如果我在我的角色定义中有这个:

common_run_list = ["recipe[something]", "recipe[something_else]"]

run_list(common_run_list)

env_run_lists(
    "dev" => common_run_list + ["recipe[another_thing]"]
)

然后我收到以下错误:

  

[2014-02-04T16:38:57-08:00]错误:env_run_lists中需要_default键。

所以我必须在env_run_lists中指定_default键,即使我指定了run_list。