Шеф-повар общий рецепт нескольких ролей

Я создал рецепт шеф-повара mongodb и переопределяю атрибуты по умолчанию в рецепте из роли.

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"] Атрибуты будут массивами, и в вашем рецепте итерируйте эти массивы и выполняйте ваши ресурсы в цикле.

Другие вопросы по тегам