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