我正在使用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
上给出的搜索如何访问角色定义中的节点属性?
答案 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