70 lines
2.9 KiB
YAML
70 lines
2.9 KiB
YAML
|
---
|
||
|
- name: Check cluster swarm status
|
||
|
run_once: true
|
||
|
block:
|
||
|
- name: Fetch cluster server swarm info
|
||
|
delegate_to: "{{ item }}"
|
||
|
ansible.builtin.command:
|
||
|
cmd: !unsafe docker info --format '{{json .Swarm}}'
|
||
|
changed_when: false
|
||
|
register: _docker_cluster_swarm_state_raw
|
||
|
loop: "{{ groups.cluster }}"
|
||
|
|
||
|
- name: Process cluster server swarm info
|
||
|
vars:
|
||
|
_docker_cluster_swarm_state: {}
|
||
|
ansible.builtin.set_fact:
|
||
|
_docker_cluster_swarm_state: "{{ _docker_cluster_swarm_state | combine({item.item: (item.stdout | from_json)}) }}"
|
||
|
loop: "{{ _docker_cluster_swarm_state_raw.results }}"
|
||
|
loop_control:
|
||
|
label: "{{ item.item }}"
|
||
|
|
||
|
- name: Identify swarm managers
|
||
|
vars:
|
||
|
_docker_cluster_swarm_managers: []
|
||
|
when: item.value.LocalNodeState == 'active' and item.value.ControlAvailable
|
||
|
ansible.builtin.set_fact:
|
||
|
_docker_cluster_swarm_managers: "{{ _docker_cluster_swarm_managers + [item.key] }}"
|
||
|
loop: "{{ _docker_cluster_swarm_state | dict2items }}"
|
||
|
loop_control:
|
||
|
label: "{{ item.key }}"
|
||
|
|
||
|
- name: Check that swarm managers were discovered
|
||
|
ansible.builtin.assert:
|
||
|
that:
|
||
|
- _docker_cluster_swarm_managers
|
||
|
fail_msg: >-
|
||
|
ERROR: None of the member cluster servers ({{ groups.cluster | join(', ') }}) are joined to
|
||
|
a docker swarm or is a swarm manager. Please join at least one cluster server to a swarm and
|
||
|
promote it to swarm manager
|
||
|
success_msg: >-
|
||
|
Identified {{ _docker_cluster_swarm_managers | count }} swarm managers
|
||
|
({{ _docker_cluster_swarm_managers | join(', ') }})
|
||
|
|
||
|
- name: Determine swarm manager cluster IDs
|
||
|
vars:
|
||
|
_docker_cluster_swarm_manager_cluster_ids: []
|
||
|
ansible.builtin.set_fact:
|
||
|
_docker_cluster_swarm_manager_cluster_ids: "{{ _docker_cluster_swarm_manager_cluster_ids + [_docker_cluster_swarm_state[item].Cluster.ID] }}"
|
||
|
loop: "{{ _docker_cluster_swarm_managers }}"
|
||
|
|
||
|
- name: Check swarm managers are part of the same swarm
|
||
|
ansible.builtin.assert:
|
||
|
that:
|
||
|
- _docker_cluster_swarm_manager_cluster_ids | unique | count == 1
|
||
|
fail_msg: >-
|
||
|
ERROR: Swarm managers ({{ _docker_cluster_swarm_managers | join(', ') }}) appear to be
|
||
|
joined to different swarms
|
||
|
(IDs {{ _docker_cluster_swarm_manager_cluster_ids | join(', ') }})
|
||
|
success_msg: >-
|
||
|
Swarm managers are joined to swarm with ID
|
||
|
{{ _docker_cluster_swarm_manager_cluster_ids[0] }}
|
||
|
|
||
|
- name: Determine swarm manager to use for host configuration
|
||
|
ansible.builtin.set_fact:
|
||
|
_docker_swarm_manager: "{{ _docker_cluster_swarm_managers[0] }}"
|
||
|
|
||
|
- name: Determine whether host needs to be added to the swarm
|
||
|
ansible.builtin.set_fact:
|
||
|
_docker_swarm_needs_join: "{{ not _docker_cluster_swarm_state[inventory_hostname].Cluster.ID | default('') == _docker_cluster_swarm_manager_cluster_ids[0] }}"
|