
This commit addresses a few shortcomings in the etcd service: * Adding or removing etcd nodes required manual intervention. * The etcd service would have brief outages during upgrades or reconfigures because restarts weren't always serialised. This makes the etcd service follow a similar pattern to mariadb: * There is now a distiction between bootstrapping the cluster and adding / removing another member. * This more closely follows etcd's upstream bootstrapping guidelines. * The etcd role now serialises restarts internally so the kolla_serial pattern is no longer appropriate (or necessary). This does not remove the need for manual intervention in all failure modes: the documentation has been updated to address the most common issues. Note that there's repetition in the container specifications: this is somewhat deliberate. In a future cleanup, it's intended to reduce the duplication. Change-Id: I39829ba0c5894f8e549f9b83b416e6db4fafd96f
40 lines
1.3 KiB
YAML
40 lines
1.3 KiB
YAML
---
|
|
- name: List the etcd members
|
|
vars:
|
|
service_name: "etcd"
|
|
service: "{{ etcd_services[service_name] }}"
|
|
become: true
|
|
command: >-
|
|
{{ kolla_container_engine }} exec {{ service.container_name }}
|
|
etcdctl member list
|
|
changed_when: false
|
|
run_once: true
|
|
delegate_to: "{{ etcd_cluster_leader | default(groups[service.group][0]) }}"
|
|
register: etcd_member_list_result
|
|
|
|
- name: Remove deleted members from the etcd cluster
|
|
vars:
|
|
service_name: "etcd"
|
|
service: "{{ etcd_services[service_name] }}"
|
|
etcd_members_from_inventory: >-
|
|
{{ groups['etcd']
|
|
| map('extract', hostvars, 'ansible_facts')
|
|
| map(attribute='hostname')
|
|
| list }}
|
|
etcd_deleted_members: >-
|
|
{{ etcd_member_list_result.stdout | from_json
|
|
| json_query('members[].name')
|
|
| difference(etcd_members_from_inventory) }}
|
|
etcd_member_id: >-
|
|
{{ etcd_member_list_result.stdout | from_json
|
|
| json_query('members[].{key: name, value: ID}') | items2dict }}
|
|
become: true
|
|
command: >-
|
|
{{ kolla_container_engine }} exec {{ service.container_name }}
|
|
etcdctl member remove {{ '%x' % etcd_member_id[etcd_deleted_member] }}
|
|
run_once: true
|
|
delegate_to: "{{ etcd_cluster_leader | default(groups[service.group][0]) }}"
|
|
loop: "{{ etcd_deleted_members }}"
|
|
loop_control:
|
|
loop_var: etcd_deleted_member
|