prole/infrastructure/roles/k3s/tasks/main.yml
2026-01-21 10:27:27 -08:00

78 lines
2.5 KiB
YAML

---
- name: Check if k3s is already installed
ansible.builtin.stat:
path: /usr/local/bin/k3s
register: k3s_bin
- name: Verify bind interface exists
ansible.builtin.assert:
that:
- "'ansible_' + k3s_bind_interface in hostvars[inventory_hostname]"
fail_msg: "Interface {{ k3s_bind_interface }} not found on {{ inventory_hostname }}"
- name: Get wired IP address
ansible.builtin.set_fact:
k3s_node_ip: "{{ hostvars[inventory_hostname]['ansible_' + k3s_bind_interface]['ipv4']['address'] }}"
- name: Install k3s dependencies
ansible.builtin.package:
name:
- curl
state: present
- name: Download k3s install script
ansible.builtin.get_url:
url: https://get.k3s.io
dest: /tmp/k3s_install.sh
mode: "0755"
- name: Initialize first k3s server node
ansible.builtin.command:
cmd: /tmp/k3s_install.sh
environment:
INSTALL_K3S_VERSION: "{{ k3s_version }}"
K3S_TOKEN: "prole-k3s-ha-token" # In a real prod environment, use a secret
INSTALL_K3S_EXEC: "server --cluster-init --bind-address {{ k3s_node_ip }} --node-ip {{ k3s_node_ip }} --advertise-address {{ k3s_node_ip }}"
when:
- inventory_hostname == groups['k3s_hosts'][0]
- not k3s_bin.stat.exists
- name: Wait for k3s token to be generated
ansible.builtin.wait_for:
path: /var/lib/rancher/k3s/server/node-token
when: inventory_hostname == groups['k3s_hosts'][0]
- name: Read k3s node token
ansible.builtin.slurp:
src: /var/lib/rancher/k3s/server/node-token
register: node_token_b64
when: inventory_hostname == groups['k3s_hosts'][0]
- name: Set node token fact
ansible.builtin.set_fact:
k3s_cluster_token: "{{ node_token_b64.content | b64decode | trim }}"
when: inventory_hostname == groups['k3s_hosts'][0]
- name: Share node token with other nodes
ansible.builtin.set_fact:
k3s_cluster_token: "{{ hostvars[groups['k3s_hosts'][0]]['k3s_cluster_token'] }}"
when: inventory_hostname != groups['k3s_hosts'][0]
- name: Join additional k3s server nodes
ansible.builtin.command:
cmd: /tmp/k3s_install.sh
environment:
INSTALL_K3S_VERSION: "{{ k3s_version }}"
K3S_URL: "https://{{ hostvars[groups['k3s_hosts'][0]]['k3s_node_ip'] }}:6443"
K3S_TOKEN: "{{ k3s_cluster_token }}"
INSTALL_K3S_EXEC: "server --bind-address {{ k3s_node_ip }} --node-ip {{ k3s_node_ip }} --advertise-address {{ k3s_node_ip }}"
when:
- inventory_hostname != groups['k3s_hosts'][0]
- not k3s_bin.stat.exists
- name: Ensure k3s service is started and enabled
ansible.builtin.service:
name: k3s
state: started
enabled: true