Ansible:如何设置主机的序列号

Ansible:如何设置主机的序列号,ansible,jinja2,ansible-playbook,apache-zookeeper,ansible-inventory,Ansible,Jinja2,Ansible Playbook,Apache Zookeeper,Ansible Inventory,我正在尝试在EC2上配置主机,因此我正在使用Ansible动态资源清册 我想做的是;为每个节点设置序列号 例如Zookeeper的“myid”配置 Zookeeper要求每个节点都有一个名为“myid”的序列号;1表示主机A,2表示主机B,3表示主机C,依此类推 这是我的剧本中将“myid”文件复制到主机的部分 - name: Set myid sudo: yes template: src=var/lib/zookeeper/myid.j2 dest=/var/lib/zookeepe

我正在尝试在EC2上配置主机,因此我正在使用Ansible动态资源清册

我想做的是;为每个节点设置序列号

例如Zookeeper的“myid”配置

Zookeeper要求每个节点都有一个名为“myid”的序列号;1表示主机A,2表示主机B,3表示主机C,依此类推

这是我的剧本中将“myid”文件复制到主机的部分

- name: Set myid
  sudo: yes
  template: src=var/lib/zookeeper/myid.j2 dest=/var/lib/zookeeper/myid
myid.j2
应该如下所示

{{ serial_number }}

问题是:变量“{serial_number}}”应该是什么样的?

我通过在创建EC2实例时为每个实例分配一个数字作为标记来解决这个问题。然后,我在创建
myid
文件时引用该标记。下面是我用来创建EC2实例的任务,为了简洁起见,我省略了所有不重要的字段

- name: Launch EC2 instance(s)
  with_sequence: count="{{ instance_count }}"
  ec2:
    instance_tags:
      number: "{{ item }}"
然后,在这些服务器上安装ZooKeeper时,我使用动态资源清册获取标记有
ZooKeeper
的所有服务器,并使用
myid
文件中的
number
标记

- name: Render and copy myid file
  copy: >
    content={{ ec2_tag_number }}
    dest=/etc/zookeeper/conf/myid
注意:在创建EC2实例时,我需要将
与_sequence一起使用,而不是
EC2
模块中的
count
字段。否则,我就不会为标记捕获索引


如果您希望playbook能够将节点添加到当前集群中,那么可以查询标记为
zookeeper
的EC2实例的数量,并将其添加到迭代索引中。这可以正常使用,因为如果没有,则当前实例计数将为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 }}"

我找到了一个很好的方法,使用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动态资源清册。

无需使用模板,您可以直接在playbook中分配myid文件的内容。假设您已将所有ec2实例收集到组“ec2hosts”中


我不完全理解您的问题,但也许您应该使用
ec2\u facts
模块来获取每个ec2实例唯一的
实例id
值。群集中的每个Zookeeper实例都需要一个
myid
文件,该文件的唯一编号介于1和255之间。问题是:当使用动态库存时,ansible脚本如何生成唯一的数字,或从1开始计数。
- 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}}"