bootstrap_cluster.ymlΒΆ

---
- 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)