3

EC2 でホストをプロビジョニングしようとしているので、Ansible Dynamic Inventory を使用しています。

私がやりたいことは次のとおりです。各ノードのシリアル番号を設定します。

例: Zookeeper の「myid」構成

Zookeeper には、各ノードに「myid」という名前のシリアル番号が必要です。hostA の場合は 1、hostB の場合は 2、hostC の場合は 3 などです。

これは、「myid」ファイルをホストにコピーする私のプレイブックの一部です。

- name: Set myid
  sudo: yes
  template: src=var/lib/zookeeper/myid.j2 dest=/var/lib/zookeeper/myid

そしてmyid.j2、以下のようになるはずです。

{{ serial_number }}

問題は、変数 "{{ serial_number }}" はどのようにすべきかということです。

4

3 に答える 3

2

これを解決するには、EC2 インスタンスを作成するときに、各 EC2 インスタンスにタグとして番号を割り当てます。次に、ファイルを作成するときにそのタグを参照しmyidます。以下は、簡潔にするためにすべての重要でないフィールドを省略して EC2 インスタンスを作成するために使用したタスクです。

- name: Launch EC2 instance(s)
  with_sequence: count="{{ instance_count }}"
  ec2:
    instance_tags:
      number: "{{ item }}"

次に、これらのサーバーに ZooKeeper をインストールするときに、動的インベントリを使用してタグ付けされたすべてのサーバーを取得し、ファイル内のタグzookeeperを使用します。numbermyid

- name: Render and copy myid file
  copy: >
    content={{ ec2_tag_number }}
    dest=/etc/zookeeper/conf/myid

注: EC2 インスタンスを作成するときは、モジュール内のフィールドではwith_sequenceなく使用する必要がありました。そうしないと、タグをキャプチャするためのインデックスがありません。countec2


Playbook で現在のクラスターにノードを追加できるようにしたい場合は、タグ付けされた EC2 インスタンスの数を照会し、zookeeperそれを反復インデックスに追加できます。何もない場合は 0 になるので、通常はこれで問題current_instance_countありません。

- name: Determine how many instances currently exist
  shell: echo "{{ groups['tag_zookeeper'] | length }}"
  register: current_instance_count
- name: Launch EC2 instance(s)
  with_sequence: count="{{ instance_count }}"
  ec2:
    instance_tags:
      number: "{{ item|int + current_instance_count.stdout|int }}"
于 2015-11-26T21:08:00.290 に答える