D10.2 Δημιουργία Swarm Cluster ⚙️

Inventory για Swarm

# hosts.ini
[swarm_managers]
manager-01 ansible_host=192.168.1.10
manager-02 ansible_host=192.168.1.11
manager-03 ansible_host=192.168.1.12

[swarm_workers]
worker-01  ansible_host=192.168.1.20
worker-02  ansible_host=192.168.1.21
worker-03  ansible_host=192.168.1.22

[swarm:children]
swarm_managers
swarm_workers

Playbook: Αρχικοποίηση Swarm

---
# setup-swarm.yml

- name: Install Docker on all nodes
  hosts: swarm
  become: true

  roles:
    - role: docker_install    # ← υπάρχον role

# ─────────────────────────────────────────────────────
- name: Initialize Swarm on primary manager
  hosts: manager-01          # ← ΜΟΝΟ ο πρώτος!
  become: true
  gather_facts: true

  tasks:

    - name: "🐝 Init Swarm"
      community.docker.docker_swarm:
        state:            present
        advertise_addr:   "{{ ansible_host }}"
      register: swarm_info

    - name: Manager join token
      ansible.builtin.set_fact:
        swarm_manager_token: "{{ swarm_info.swarm_facts.JoinTokens.Manager }}"
        swarm_worker_token:  "{{ swarm_info.swarm_facts.JoinTokens.Worker }}"
        swarm_manager_addr:  "{{ ansible_host }}:2377"

    - name: Save tokens για άλλα plays
      ansible.builtin.add_host:
        name:                 swarm_primary
        swarm_manager_token:  "{{ swarm_manager_token }}"
        swarm_worker_token:   "{{ swarm_worker_token }}"
        swarm_manager_addr:   "{{ swarm_manager_addr }}"

# ─────────────────────────────────────────────────────
- name: Join additional managers
  hosts: swarm_managers:!manager-01    # ← όλοι ΕΚΤΟΣ πρώτου
  become: true
  gather_facts: false

  tasks:

    - name: "🐝 Join as manager"
      community.docker.docker_swarm:
        state:           join
        advertise_addr:  "{{ ansible_host }}"
        join_token:      "{{ hostvars['swarm_primary'].swarm_manager_token }}"
        remote_addrs:
          - "{{ hostvars['swarm_primary'].swarm_manager_addr }}"

# ─────────────────────────────────────────────────────
- name: Join workers
  hosts: swarm_workers
  become: true
  gather_facts: false

  tasks:

    - name: "🐝 Join as worker"
      community.docker.docker_swarm:
        state:           join
        advertise_addr:  "{{ ansible_host }}"
        join_token:      "{{ hostvars['swarm_primary'].swarm_worker_token }}"
        remote_addrs:
          - "{{ hostvars['swarm_primary'].swarm_manager_addr }}"

# ─────────────────────────────────────────────────────
- name: Verify Swarm
  hosts: manager-01
  become: true
  gather_facts: false

  tasks:

    - name: Swarm node list
      ansible.builtin.command: docker node ls
      register:     nodes
      changed_when: false

    - name: "📊 Cluster Status"
      ansible.builtin.debug:
        msg: "{{ nodes.stdout_lines }}"
# Εκτέλεση
ansible-playbook setup-swarm.yml -v

# Αποτέλεσμα:
# ID         HOSTNAME    STATUS  AVAILABILITY  MANAGER STATUS
# xxx  *     manager-01  Ready   Active        Leader
# yyy        manager-02  Ready   Active        Reachable
# zzz        manager-03  Ready   Active        Reachable
# aaa        worker-01   Ready   Active
# bbb        worker-02   Ready   Active
# ccc        worker-03   Ready   Active

Σύνοψη D10.2

Swarm Setup:
│
├── community.docker.docker_swarm
├── state: present   → init (manager-01)
├── state: join      → join (managers + workers)
├── join_token: Manager ή Worker token
└── advertise_addr: host IP για Swarm traffic