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

时间:2015-06-12 01:33:39

标签: ansible jinja2 ansible-playbook apache-zookeeper ansible-inventory

我正在尝试在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}}"是吗?

3 个答案:

答案 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}}"