---
- name: Install K3s Server
  hosts: k3s_server
  become: yes
  gather_facts: yes
  tasks:
    - name: Install K3s Server using the official script
      ansible.builtin.shell: >
        curl -sfL https://get.k3s.io | sh -s - server \
          --write-kubeconfig-mode "644" \
          --node-ip "{{ ansible_default_ipv4.address }}" \
          --flannel-iface eth0 # Ensure flannel uses the correct interface (check if 'eth0' is correct on your cloud image)
      args:
        creates: /etc/rancher/k3s/k3s.yaml

    - name: Wait for K3s server node-token to be created
      ansible.builtin.wait_for:
        path: /var/lib/rancher/k3s/server/node-token
        timeout: 60

    - name: Read the K3s node-token from server
      ansible.builtin.slurp:
        src: /var/lib/rancher/k3s/server/node-token
      register: k3s_token_content

    - name: Store K3s token and server IP for agents
      ansible.builtin.set_fact:
        k3s_token: "{{ k3s_token_content.content | b64decode | trim }}"
        k3s_server_ip: "{{ ansible_default_ipv4.address }}"
        cacheable: yes

- name: Install K3s Agents
  hosts: k3s_agents
  become: yes
  gather_facts: yes
  tasks:
    - name: Check if K3s server facts are available
      ansible.builtin.fail:
        msg: "K3s server IP or token not found. Ensure server play ran successfully."
      when: hostvars[groups['k3s_server'][0]].k3s_server_ip is not defined or hostvars[groups['k3s_server'][0]].k3s_token is not defined

    - name: Install K3s Agent using the official script
      ansible.builtin.shell: >
        curl -sfL https://get.k3s.io | K3S_URL='https://{{ hostvars[groups['k3s_server'][0]].k3s_server_ip }}:6443' \
          K3S_TOKEN='{{ hostvars[groups['k3s_server'][0]].k3s_token }}' \
          sh -s - agent \
            --node-ip "{{ ansible_default_ipv4.address }}" \
            --flannel-iface eth0 # Ensure flannel uses the correct interface
      args:
        creates: /etc/rancher/k3s/config.yaml

- name: Get Kubeconfig from Server (optional)
  hosts: k3s_server
  gather_facts: no
  tasks:
    - name: Fetch Kubeconfig file from K3s server
      ansible.builtin.fetch:
        src: /etc/rancher/k3s/k3s.yaml
        dest: ../kubeconfig
        flat: yes
      become: yes
