2016-05-27 3 views
2

У меня есть ресурс экземпляра вдоль этих линий:Как распространять количество экземпляров в зонах доступности в режиме обогрева?

masters: 
type: OS::Heat::ResourceGroup 
properties: 
    count: { get_param: num_masters } 
    resource_def: 
    type: heat_stack_server.yaml 
    properties: 
     name: 
     str_replace: 
      template: cluster_id-k8s_type-%index% 
      params: 
      cluster_id: { get_param: cluster_id } 
      k8s_type: master 
     cluster_env: { get_param: cluster_env } 
     cluster_id: { get_param: cluster_id } 
     type:  master 
     image:  { get_param: master_image } 
     flavor:  { get_param: master_flavor } 
     key_name: { get_resource: keypair } 
     net:   { get_resource: net } 
     subnet:  { get_resource: subnet } 
     secgrp: 
     - { get_resource: master-secgrp } 
     - { get_resource: node-secgrp } 
     floating_network: { get_param: external_net } 
     net_name: 
     str_replace: 
      template: openshift-ansible-cluster_id-net 
      params: 
      cluster_id: { get_param: cluster_id } 
depends_on: 
    - interface 

Это создает num_masters. Теперь я хочу гарантировать, что эти мастера будут созданы в разных зонах доступности (так что, когда один из них не работает, другой будет продолжать работать).

Скажите, у меня есть 3 AZ и num_masters == 5. Как их распространять, так что зона 1 содержит узлы 1 и 4, zone2 - 2 и 5 и т. Д.?

У Ansible есть этот объект loop.cycle, где вы могли бы переходить список вариантов снова и снова. Любые идеи, как это сделать в ОС?

ответ

1

ОК, я нашел a решение. Я вижу, что кто-то пометил мой вопрос, поэтому я понимаю, что есть кто-то другой, кто ищет решение, поэтому лучше поделиться своим.

Вы редко пользуетесь (и, конечно же, нет) Тепло в изоляции от других структур управления конфигурацией. Я использую его вместе с Ansible. Поэтому, чтобы распространять узлы между зонами доступности (AZ), вы можете подумать о том, чтобы подготовить это распространение самостоятельно. Во-первых, у меня есть в моих анзибль вары файл список всех доступных AZ (извините за каламбур):

zones: 
- 'zone1' 
- 'zone2' 

В качестве альтернативы, вы можете запросить OpenStack для этого списка. Когда у вас есть, вы заполняете его в файл среды вашего стека, как это:

{% set zone_cycler = cycler(*zones) %} 
master_availability_zones: [{% for n in range(1,master_number+1) %}"{{ zone_cycler.next() }}"{% if not loop.last %}{{','}} {% endif %}{% endfor %}] 

Так за пять хостов и две зоны, вы получите это:

master_availability_zones: ["zone1","zone2","zone1","zone2","zone1"] 

Затем вы проходите этот список в хост-группы ресурсов, как это:

master_availability_zones: 
    type: comma_delimited_list 
    label: Master Availability zones 
    description: Availability zone mapping for masters 

    master_nodes: 
    type: OS::Heat::ResourceGroup 
    properties: 
     count: { get_param: master_number } 
     resource_def: 
     type: master_template.yaml 
     properties: 
      ... 
      availability_zones: { get_param: master_availability_zones } 
      index: "%index%" 
      ... 

не забудьте пройти по index переменной, а также, вы будете нуждаться в этом, с другой стороны, в master_template.yaml:

master_node: 
    type: OS::Nova::Server 
    properties: 
     ... 
     availability_zone: { get_param: [ availability_zones, { get_param: index } ] } 
     ... 

Voila, теперь у вас есть масштабируемая процедура размещения для произвольного номера хоста и зоны.

+0

Если тепло поддерживает некоторые основные математические функции, такие как функция мод, нет необходимости повторять AZ. Вместо этого индекс может быть текущим индексом mod number_of_azs. –

+0

В этом случае это может быть проще: вы просто указываете название своей зоны и заполняете номер зоны как '' 'index mod az_number''' – Undespairable