我通过在创建它们时为每个 EC2 实例分配一个数字作为标签来解决这个问题。myid
然后我在创建文件时引用该标签。以下是我用来创建 EC2 实例的任务,为简洁起见,所有不重要的字段都被省略了。
- name: Launch EC2 instance(s)
with_sequence: count="{{ instance_count }}"
ec2:
instance_tags:
number: "{{ item }}"
然后在这些服务器上安装 ZooKeeper 时,我使用动态清单来获取所有带有标签的服务器zookeeper
并使用文件number
中的标签myid
。
- name: Render and copy myid file
copy: >
content={{ ec2_tag_number }}
dest=/etc/zookeeper/conf/myid
注意:创建 EC2 实例时,我需要使用with_sequence
而不是模块count
中的字段。ec2
否则我将没有索引来捕获标签。
如果您希望 playbook 能够将节点添加到当前集群,您可以查询标记为的 EC2 实例的数量zookeeper
并将其添加到迭代索引中。正常情况下这很好,因为current_instance_count
如果没有,则为 0。
- 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 }}"