如何使用 ansible 在 docker 中 运行 etcd 集群?
How to run etcd cluster in docker using ansible?
我正在尝试通过 ansible 在 docker 中 运行 etcd 集群。
我使用 docker_container ansible 模块,这就是我所拥有的:
- name: Run etcd KV node
docker_container:
name: "etcd0"
image: quay.io/coreos/etcd
network_mode: host
command: [ "/usr/local/bin/etcd", \
"-name etcd0", \
"-advertise-client-urls http://{{ ansible_default_ipv4['address'] }}:2379,http://{{ ansible_default_ipv4['address'] }}:4001", \
"-listen-client-urls http://0.0.0.0:2379,http://0.0.0.0:4001", \
"-initial-advertise-peer-urls http://{{ ansible_default_ipv4['address'] }}:2380", \
"-initial-cluster etcd0=http://{{ ansible_default_ipv4['address'] }}:2380", \
"-initial-cluster-token etcd-cluster", \
"-listen-peer-urls http://0.0.0.0:2380", \
"-initial-cluster-state new" ]
这在单一模式下工作,但超过 1 个节点会出现问题,因为有 etcd 参数 -initial-cluster
应该包含所有节点,例如,在 3 个节点的情况下:
-initial-cluster etcd0=http://192.168.12.50:2380,etcd1=http://192.168.12.51:2380,etcd2=http://192.168.12.52:2380
我不知道如何遍历所有节点并将此字符串构建到 运行 一个 docker 容器。可能吗?
hostvars 魔法变量为您服务:
- name: Generate useful facts for current node 1
set_fact:
ip_addr: "{{ ansible_default_ipv4.address }}"
etcd_name: "etcd{{ ansible_play_hosts.index(inventory_hostname) }}"
- name: Generate useful facts for current node 2
set_fact:
etcd_uri: "{{ etcd_name }}=http://{{ ip_addr }}:2380"
- name: Run etcd KV node
docker_container:
name: "{{ etcd_name }}"
image: quay.io/coreos/etcd
network_mode: host
command:
- /usr/local/bin/etcd
- -name {{ etcd_name }}
- -advertise-client-urls http://{{ ip_addr }}:2379,http://{{ ip_addr }}:4001
- -listen-client-urls http://0.0.0.0:2379,http://0.0.0.0:4001
- -initial-advertise-peer-urls http://{{ ip_addr }}:2380
- -initial-cluster {{ ansible_play_hosts | map('extract',hostvars,'etcd_uri') | list | join(',') }}
- -initial-cluster-token etcd-cluster
- -listen-peer-urls http://0.0.0.0:2380
- -initial-cluster-state new
P.S。我还重新格式化了你的 command
参数。
我正在尝试通过 ansible 在 docker 中 运行 etcd 集群。
我使用 docker_container ansible 模块,这就是我所拥有的:
- name: Run etcd KV node
docker_container:
name: "etcd0"
image: quay.io/coreos/etcd
network_mode: host
command: [ "/usr/local/bin/etcd", \
"-name etcd0", \
"-advertise-client-urls http://{{ ansible_default_ipv4['address'] }}:2379,http://{{ ansible_default_ipv4['address'] }}:4001", \
"-listen-client-urls http://0.0.0.0:2379,http://0.0.0.0:4001", \
"-initial-advertise-peer-urls http://{{ ansible_default_ipv4['address'] }}:2380", \
"-initial-cluster etcd0=http://{{ ansible_default_ipv4['address'] }}:2380", \
"-initial-cluster-token etcd-cluster", \
"-listen-peer-urls http://0.0.0.0:2380", \
"-initial-cluster-state new" ]
这在单一模式下工作,但超过 1 个节点会出现问题,因为有 etcd 参数 -initial-cluster
应该包含所有节点,例如,在 3 个节点的情况下:
-initial-cluster etcd0=http://192.168.12.50:2380,etcd1=http://192.168.12.51:2380,etcd2=http://192.168.12.52:2380
我不知道如何遍历所有节点并将此字符串构建到 运行 一个 docker 容器。可能吗?
hostvars 魔法变量为您服务:
- name: Generate useful facts for current node 1
set_fact:
ip_addr: "{{ ansible_default_ipv4.address }}"
etcd_name: "etcd{{ ansible_play_hosts.index(inventory_hostname) }}"
- name: Generate useful facts for current node 2
set_fact:
etcd_uri: "{{ etcd_name }}=http://{{ ip_addr }}:2380"
- name: Run etcd KV node
docker_container:
name: "{{ etcd_name }}"
image: quay.io/coreos/etcd
network_mode: host
command:
- /usr/local/bin/etcd
- -name {{ etcd_name }}
- -advertise-client-urls http://{{ ip_addr }}:2379,http://{{ ip_addr }}:4001
- -listen-client-urls http://0.0.0.0:2379,http://0.0.0.0:4001
- -initial-advertise-peer-urls http://{{ ip_addr }}:2380
- -initial-cluster {{ ansible_play_hosts | map('extract',hostvars,'etcd_uri') | list | join(',') }}
- -initial-cluster-token etcd-cluster
- -listen-peer-urls http://0.0.0.0:2380
- -initial-cluster-state new
P.S。我还重新格式化了你的 command
参数。