Ansible:如何为主机设置序列号
Ansible: How can I set serial numbers for hosts
我正在尝试在 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 }}”应该是什么样的?
我通过在创建它们时为每个 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 实例时,我需要使用 with_sequence
而不是 ec2
模块中的 count
字段。否则我将没有要为标签捕获的索引。
如果您希望 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 }}"
我找到了一种使用 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 动态清单。
不需要使用template,直接在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}}"
我正在尝试在 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 }}”应该是什么样的?
我通过在创建它们时为每个 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 实例时,我需要使用 with_sequence
而不是 ec2
模块中的 count
字段。否则我将没有要为标签捕获的索引。
如果您希望 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 }}"
我找到了一种使用 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 动态清单。
不需要使用template,直接在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}}"