kolla-ansible/ansible/roles/etcd/tasks/remove_deleted_members.yml
Jan Gutter ed3b27cc92 etcd: Add support for more scenarios
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
2023-11-28 18:43:56 +01:00

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