Chef infra 默认运行列表和'_默认值';chef中的环境运行列表?

Chef infra 默认运行列表和'_默认值';chef中的环境运行列表?,chef-infra,Chef Infra,对于如何在chef中使用环境运行列表,我有点困惑。 如您所见,下面是role.json。在env_run_列表中,您有默认值,然后我们已经有了默认的run_列表。有什么区别?在运行环境run_list之前,是否每次都会运行缺省值 { "name": "webserver", "default_attributes": { }, "json_class": "Chef::Role", "env_run_lists": { "_default": [ ],

对于如何在chef中使用环境运行列表,我有点困惑。 如您所见,下面是role.json。在env_run_列表中,您有默认值,然后我们已经有了默认的run_列表。有什么区别?在运行环境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": {
  }
}

我同意这是相当令人困惑的,尤其是因为通过查看来源,我所看到的行为似乎不正确

从阅读中,我们可以看到,当构建
角色
对象时,它会根据默认环境对
运行列表
属性的内容进行键控,然后将哈希与
环境运行列表
属性的内容合并(覆盖默认键的值)

这在实践中意味着,如果指定
run\u列表
属性,则不需要在
env\u run\u列表
属性中包含默认环境。如果选择在
env\u run\u列表
属性中包含默认环境,则它将覆盖
run\u列表
属性中定义的任何内容

需要指出的另一件显而易见的事情是,如果您的节点不是角色中定义的任何环境的一部分(_default或其他)

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

我没有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_列表中指定_default键,即使指定了我的run_列表