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、ゾーン 2 にノード 1 と 4、ゾーン 2 と 2 と 5 などを含めるように、それらを分散する方法は?

Ansible には、オプションのリストを何度も渡すことができる loop.cycle 機能があります。OSでそれを行う方法はありますか?

4

1 に答える 1

1

OK、解決策を見つけまし。誰かが私の質問に答えてくれたので、他の誰かが解決策を探していることを理解しています。

他の構成管理フレームワークから切り離して 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 %}]

したがって、5 つのホストと 2 つのゾーンの場合、次のようになります。

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 に答える