如何在可用区域内散布实例数量?

时间:2016-05-27 12:46:26

标签: configuration openstack openstack-heat

我有以下几行的实例资源:

ScrollViewer

创建 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 。现在,我想保证这些主人将在不同的可用区域中创建(这样当其中一个失败时,另一个将继续工作)。

说,我有3个AZ和num_masters。如何传播它们,以便zone1包含节点1和4,zone2-2和5,依此类推?

Ansible有loop.cycle的东西,你可以一遍又一遍地传递一个选项列表。任何想法如何在操作系统中做到这一点?

1 个答案:

答案 0 :(得分:1)

好的,我找到了一个解决方案。我看到有人勾选了我的问题,所以我知道还有其他人正在寻找解决方案,所以我最好与我分享。

您很少使用(我当然不会)将其与其他配置管理框架隔离开来。我和Ansible一起使用它。因此,为了在可用区域(AZ)之间传播节点,您可以考虑自己准备此传播。首先,我在我的Ansible vars文件中列出了所有可用的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,您现在拥有可扩展的程序,可以容纳任意主机和区号。