如何查询厨师角色内的属性?

时间:2012-12-05 10:21:33

标签: deployment chef

我正在使用chef版本10.16.2
我有一个角色(红宝石格式)。我需要访问其中一个cookbook中的attrubute

例如。

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]"
         ]

我正在使用大厨独奏,所以我不能使用http://wiki.opscode.com/display/chef/Search#Search-FindNodeswithaRoleintheExpandedRunList

上给出的搜索

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

2 个答案:

答案 0 :(得分:2)

角色是JSON数据。

也就是说,当您使用刀将角色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消费。如果您需要在节点上使用属性执行任何逻辑,请在配方中执行此操作。

答案 1 :(得分:0)

不确定我是否100%关注,但如果您想要访问由配方中的角色设置的属性,那么您只需将其称为任何其他节点属性。例如,在您提供的情况下,假设节点在其run_list中具有basebox角色,您只需调用:

node['rbenv']['group_users']

将角色属性合并到节点中。

HTH