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

说,我有 3 个可用区和num_masters == 5. 如何传播它们,使 zone1 包含节点 1 和 4,zone2 - 2 和 5,等等?

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

4

1 回答 1

1

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

您很少使用(我当然不会)将 Heat 与其他配置管理框架隔离开来。我将它与 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 } ] }
      ...

瞧,您现在拥有可适应任意主机和区域编号的可扩展程序。

于 2016-06-08T09:25:06.440 回答