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

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 动态清单。

于 2016-04-22T10:15:46.313 回答
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 能够将节点添加到当前集群,您可以查询标记为的 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 }}"
于 2015-11-26T21:08:00.290 回答
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}}"
于 2016-10-05T00:35:29.253 回答