我正在尝试在EC2上配置主机,因此我正在使用Ansible Dynamic Inventory。
我想做的是;设置每个节点的序列号。
例如:" myid" Zookeeper的配置
Zookeeper需要名为" myid"的序列号。对于每个节点; 1为hostA,2为hostB,3为hostC,等等。
这是我的剧本中复制" myid"归档给主持人。
- name: Set myid
sudo: yes
template: src=var/lib/zookeeper/myid.j2 dest=/var/lib/zookeeper/myid
myid.j2
应该是这样的。
{{ serial_number }}
问题是:变量应该是什么" {{serial_number}}"是吗?
答案 0 :(得分:7)
我使用Ansible的with_index_items语法找到了一个很好的干净方法:
tasks:
- name: Set Zookeeper Id
set_fact: zk_id={{item.0 + 1}}
with_indexed_items: "{{groups['tag_Name_MESOS_MASTER']}}"
when: item.1 == "{{inventory_hostname}}"
然后可以将/ etc / zookeeper / conf / myid模板设置为
{{zk_id}}
这假设您使用的是AWS动态广告资源。
答案 1 :(得分:2)
我通过在创建它们时为每个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能够处理能够将节点添加到当前群集,您可以查询标记为zookeeper
的EC2实例的数量,并将其添加到迭代索引中。通常情况下这是正常的,因为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 }}"
答案 2 :(得分:1)
无需使用模板,您可以直接在playbook中分配myid文件的内容。假设您已将所有ec2实例收集到组" ec2hosts"。
中- hosts: ec2hosts
user: ubuntu
sudo:Trues
tasks:
- name: Set Zookeeper Id
copy: >
content={{ item.0 + 1 }}
dest=/var/lib/zookeeper/myid
with_indexed_items: "{{groups['ec2hosts']}}"
when: item.1 == "{{inventory_hostname}}"