2016-05-27 10 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。如何傳播它們,以便zone1包含節點1和4,區域2-2和5,等等?

Ansible有loop.cycle的東西,你可以一遍又一遍地傳遞選項列表。任何想法如何在操作系統中做到這一點?

回答

1

好的,我找到了a解決方案。我看到有人在我的問題上打勾,所以我明白還有其他人在尋找解決方案,所以我最好分享一下。

你很少使用(而且我當然不會)與其他配置管理框架隔離。我和Ansible一起使用它。因此,爲了在可用區域(AZ)之間傳播節點,您可以考慮自己準備這種傳播。首先,我在我的Ansible瓦爾文件中所有可用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 } ] } 
     ... 

瞧,你現在有可擴展的過程,適應任意的主機和區域號碼。

+0

如果熱支持一些基本的數學函數,如mod函數,則不需要重複AZ。相反,索引可以是當前的索引mod number_of_azs。 –

+0

在這種情況下它可能更容易:你只需將你的區域名稱作爲模板並填入區域號碼作爲索引mod az_number''' – Undespairable