我已经创建了一个 mongodb chef 食谱,并且我正在从角色中覆盖食谱上的默认属性。
name 'mongo_datanode_jackey'
description 'this module is currently under testing...'
override_attributes(
susemongodb: {
node_type: 'datanode',
node_nickname: 'jackey',
port: '27018',
is_replicaset_node: true,
is_cluster_node: true,
replicaset_name: 'myreplica',
clusterRole: 'configsvr',
}
)
run_list(
"recipe[susemongodb::setupmachine]",
"recipe[susemongodb::datanode]"
)
现在,我想在同一个虚拟机中启动多个数据节点,因此我创建了另一个与上述类似但具有不同属性值的角色。
name 'mongo_datanode_meerkat'
description 'this module is currently under testing...'
override_attributes(
susemongodb: {
node_type: 'datanode',
node_nickname: 'meerkat',
port: '27019',
is_replicaset_node: true,
is_cluster_node: true,
replicaset_name: 'myreplica',
clusterRole: 'configsvr',
}
)
run_list(
"recipe[susemongodb::setupmachine]",
"recipe[susemongodb::datanode]"
)
如果你注意到他们使用相同的配方,通过属性,
我正在调用客户端中的角色,
{
"name": "mongo1",
"chef_environment": "development",
"normal": {
"tags": [
]
},
"run_list": [
"role[mongo_datanode_jackey]",
"role[mongo_datanode_meerkat]",
"role[mongo_datanode_zebra]"
]
}
然而,当 chef 运行时,它会在 run_list 上的最后一个角色上运行......知道为什么吗?
[2016-02-11T16:51:35+00:00] INFO: Forking chef instance to converge...
[2016-02-11T16:51:35+00:00] INFO: *** Chef 12.6.0 ***
[2016-02-11T16:51:35+00:00] INFO: Chef-client pid: 14010
[2016-02-11T16:51:40+00:00] INFO: Run List is [role[mongo_datanode_jackey], role[mongo_datanode_meerkat], role[mongo_datanode_zebra]]
[2016-02-11T16:51:40+00:00] INFO: Run List expands to [susemongodb::setupmachine, susemongodb::datanode]
[2016-02-11T16:51:40+00:00] INFO: Starting Chef Run for mongo1
我希望每个角色都能在服务器上应用并使用通用配方......?
答案1
一个节点对于给定的属性只能有一个值(例如node["susemongodb"]["node_nickname"]
),并且该值在编译阶段确定(参见“阶段”这里)。
因此,在你的情况下,假设没有覆盖更高优先级,将使用运行列表中最后一个角色的值。
此外,在开始收敛阶段之前,初始运行列表将扩展为单个配方。一个配方只能在扩展的运行列表中出现一次,这就是为什么您会得到:
INFO: Run List expands to [susemongodb::setupmachine, susemongodb::datanode]
我不知道你的食谱是如何设置的,但为了实现你想要的,可以将node["susemongodb"]["node_nickname"]
和node["susemongodb"]["port"]
属性作为数组,并在你的食谱中遍历这些数组并在循环中执行你的资源。