aboutsummaryrefslogtreecommitdiff
path: root/ansible/roles/etcd/tasks/lookup_leader.yml
blob: f74c5df6b772ac86202cb0b27ed003e790a61b72 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
---
# NOTE(jan.gutter): These tasks assume a cluster is running
- name: Check for the etcd leader
  vars:
    service_name: "etcd"
    service: "{{ etcd_services[service_name] }}"
  become: true
  # NOTE(jan.gutter): We need to set the ETCD environment vars here to
  # handle an upgrade scenario from older etcd containers. These can be
  # removed once the new workflow has been in place for a cycle or two.
  ansible.builtin.command: >-
    {{ kolla_container_engine }} exec
    -e ETCDCTL_API=3
    -e ETCDCTL_ENDPOINTS="{{ etcd_client_internal_endpoint }}"
    -e ETCDCTL_WRITE_OUT="json"
    {{ service.container_name }}
    etcdctl endpoint status
  changed_when: false
  when:
    - inventory_hostname in (groups.etcd_had_volume_True | default([]))
  register: etcd_endpoint_status_result

- name: Divide hosts by their etcd leader status
  vars:
    etcd_endpoint_status: >-
      {{ etcd_endpoint_status_result.stdout | default('[]') | from_json }}
    etcd_member_id: >-
      {{ etcd_endpoint_status[0]['Status']['header']['member_id']
      | default('') }}
    etcd_leader_id: >-
      {{ etcd_endpoint_status[0]['Status']['leader']
      | default('none') }}
  ansible.builtin.group_by:
    key: etcd_is_leader_{{ etcd_member_id == etcd_leader_id }}
  changed_when: false

- name: Set the etcd cluster leader
  ansible.builtin.set_fact:
    etcd_cluster_leader: "{{ groups.etcd_is_leader_True | sort | first }}"
  when: groups.etcd_is_leader_True is defined
  changed_when: false