--- - name: Check if k3s service exists stat: path: /etc/systemd/system/k3s.service register: k3s_service - name: Check if k3s is part of cluster stat: path: /var/lib/rancher/k3s/server/node-token register: k3s_cluster_member - name: Download k3s install script get_url: url: https://get.k3s.io dest: /tmp/install-k3s.sh mode: "0755" when: not k3s_service.stat.exists - name: Install k3s server (primary) environment: INSTALL_K3S_VERSION: "{{ k3s_version if k3s_version != 'latest' else '' }}" K3S_TOKEN: "{{ k3s_token }}" command: /tmp/install-k3s.sh server --cluster-init --advertise-address={{ k3s_primary_ip }} --node-ip={{ k3s_node_ip }} when: - not k3s_service.stat.exists - k3s_primary | default(false) - name: Install k3s server (secondary) environment: INSTALL_K3S_VERSION: "{{ k3s_version if k3s_version != 'latest' else '' }}" K3S_TOKEN: "{{ k3s_token }}" command: /tmp/install-k3s.sh server --server https://{{ k3s_primary_ip }}:6443 --advertise-address={{ k3s_node_ip }} --node-ip={{ k3s_node_ip }} when: - not k3s_service.stat.exists - not (k3s_primary | default(false)) - name: Wait for k3s to be ready command: "{{ (k3s_primary | default(false)) | ternary('kubectl get nodes', 'systemctl is-active k3s') }}" register: k3s_ready until: k3s_ready.rc == 0 retries: 120 delay: 10 changed_when: false - name: Show k3s service status on failure command: systemctl status k3s --no-pager register: k3s_status changed_when: false failed_when: false when: k3s_ready is failed - name: Show recent k3s logs on failure command: journalctl -u k3s -n 80 --no-pager register: k3s_journal changed_when: false failed_when: false when: k3s_ready is failed - name: Fail with k3s diagnostics fail: msg: | k3s failed to become ready on {{ inventory_hostname }}. Service status: {{ k3s_status.stdout | default('n/a') }} Recent logs: {{ k3s_journal.stdout | default('n/a') }} when: k3s_ready is failed - name: Copy kubeconfig to default location for root file: src: /etc/rancher/k3s/k3s.yaml dest: /root/.kube/config state: link force: true - name: Ensure .kube directory exists for ansible user file: path: "/home/{{ ansible_user }}/.kube" state: directory mode: "0755" when: ansible_user != 'root'