3

我正在使用厨师版本 10.16.2
我有一个角色(红宝石格式)。我需要访问其中一本食谱中的属性集

例如。

name "basebox"
description "A basic box with some packages, ruby and rbenv installed"

deployers = node['users']['names'].find {|k,v| v['role'] == "deploy" }

override_attributes {
  {"rbenv" => {
      "group_users" => deployers
    }
  }
}

run_list [ 
          "recipe[users]",
          "recipe[packages]",
          "recipe[nginx]",
          "recipe[ruby]"
         ]

我正在使用 chef-solo,所以我不能使用http://wiki.opscode.com/display/chef/Search#Search-FindNodeswithaRoleintheExpandedRunList上给出的搜索

如何访问角色定义中的节点属性?

4

2 回答 2

2

角色是 JSON 数据。

也就是说,当你用knife将角色Ruby文件上传到服务器时,它们会被转换为JSON。考虑这个角色:

name "gaming-system"
description "Systems used for gaming"
run_list(
  "recipe[steam::installer]",
  "recipe[teamspeak3::client]"
)

当我用 上传它时knife role from file gaming-system.rb,我在服务器上有这个:

{
  "name": "gaming-system",
  "description": "Systems used for gaming",
  "json_class": "Chef::Role",
  "default_attributes": {
  },
  "override_attributes": {
  },
  "chef_type": "role",
  "run_list": [
    "recipe[steam::installer]",
    "recipe[teamspeak3::client]"
  ],
  "env_run_lists": {
  }
}

Ruby DSL 的原因是它比 JSON “更好”或“更容易”编写。比较行和语法,很容易看出哪个更适合新用户(可能不熟悉 JSON)。

该数据通过 API 使用。如果您需要对节点上的属性执行任何逻辑,请在配方中执行。

于 2012-12-06T16:12:49.050 回答
0

不确定我是否 100% 遵循,但如果您想访问由配方中的角色设置的属性,那么您只需像任何其他节点属性一样调用它。例如,在您介绍的情况下,假设节点在其 run_list 中具有 basebox 角色,您只需调用:

node['rbenv']['group_users']

角色属性合并到节点中。

高温高压

于 2012-12-05T18:53:36.107 回答