---
- name: "β
Ensure dockerd is installed before swarm bootstrap"
ansible.builtin.include_role:
name: sys-svc-container
public: false
when: run_once_sys_svc_container is not defined
- name: "β
Assert at least one host is in svc-swarm-manager"
ansible.builtin.assert:
that:
- (groups['svc-swarm-manager'] | default([]) | length) >= 1
fail_msg: |
svc-swarm-node requires AT LEAST ONE host in the
`svc-swarm-manager` group. Multi-manager (Raft-quorum HA) is
supported: list every manager host in this group, the first becomes
the bootstrap manager that runs `docker swarm init`, the rest join
as managers via the manager token.
Found: {{ groups['svc-swarm-manager'] | default([]) | length }} members.
run_once: true
- name: "β
Assert every svc-swarm-manager member is also in svc-swarm-node"
ansible.builtin.assert:
that:
- item in (groups['svc-swarm-node'] | default([]))
fail_msg: |
Host '{{ item }}' is in svc-swarm-manager but missing from
svc-swarm-node. A manager MUST also be a regular cluster member.
loop: "{{ groups['svc-swarm-manager'] | default([]) }}"
run_once: true
- name: "π₯Ύ Bootstrap manager: init swarm + publish join tokens (first manager only)"
ansible.builtin.include_tasks: 01_manager.yml
when: inventory_hostname == (groups['svc-swarm-manager'] | first)
- name: "πΈοΈ Additional managers: join cluster with manager token"
ansible.builtin.include_tasks: 02_manager_join.yml
when:
- "'svc-swarm-manager' in group_names"
- inventory_hostname != (groups['svc-swarm-manager'] | first)
- name: "π Worker: include worker-join tasks"
ansible.builtin.include_tasks: 03_worker.yml
when:
- "'svc-swarm-node' in group_names"
- "'svc-swarm-manager' not in group_names"
- name: "π Apply node labels (bootstrap manager dispatches to all nodes)"
ansible.builtin.include_tasks: 04_labels.yml
when: inventory_hostname == (groups['svc-swarm-manager'] | first)