diff --git a/inventory-sample.yml b/inventory-sample.yml index f934b44..cb490ef 100644 --- a/inventory-sample.yml +++ b/inventory-sample.yml @@ -38,3 +38,4 @@ k3s_cluster: # Containerd can be configured to connect to private registries and use them to pull images as needed by the kubelet. # YAML here will be placed as the content of /etc/rancher/k3s/registries.yaml # See https://docs.k3s.io/installation/private-registry + # use_docker_runtime: false, by default containerd is used as the runtime. Set to true to install docker and use it as the k3s runtime diff --git a/roles/airgap/tasks/main.yml b/roles/airgap/tasks/main.yml index 809e598..2c5d3ff 100644 --- a/roles/airgap/tasks/main.yml +++ b/roles/airgap/tasks/main.yml @@ -25,6 +25,25 @@ group: root mode: 0755 + - name: Download install docker script + delegate_to: localhost + ansible.builtin.get_url: + # don't use the docker provided script https://get.docker.com as it doesn't seem to work well with k3s + url: https://releases.rancher.com/install-docker/20.10.sh + timeout: 120 + dest: "{{ airgap_dir }}/install-docker.sh" + mode: 0755 + when: use_docker_runtime + + - name: Distribute install docker script + ansible.builtin.copy: + src: "{{ airgap_dir }}/install-docker.sh" + dest: /usr/local/bin/install-docker.sh + owner: root + group: root + mode: 0755 + when: use_docker_runtime + - name: Distribute K3s binary ansible.builtin.copy: src: "{{ airgap_dir }}/k3s" @@ -109,6 +128,12 @@ - "{{ airgap_dir }}/k3s-airgap-images-arm.tar" skip: true + - name: Run install docker script + ansible.builtin.command: + cmd: /usr/local/bin/install-docker.sh + changed_when: true + when: use_docker_runtime + - name: Run K3s Install [server] ansible.builtin.command: cmd: /usr/local/bin/k3s-install.sh diff --git a/roles/k3s_agent/defaults/main.yml b/roles/k3s_agent/defaults/main.yml index cbcb1e9..02bdbad 100644 --- a/roles/k3s_agent/defaults/main.yml +++ b/roles/k3s_agent/defaults/main.yml @@ -2,3 +2,5 @@ k3s_server_location: "/var/lib/rancher/k3s" systemd_dir: "/etc/systemd/system" api_port: 6443 +use_docker_runtime: false +node_name: "{{ inventory_hostname }}" diff --git a/roles/k3s_agent/tasks/main.yml b/roles/k3s_agent/tasks/main.yml index 789d4e2..edec8bd 100644 --- a/roles/k3s_agent/tasks/main.yml +++ b/roles/k3s_agent/tasks/main.yml @@ -10,11 +10,23 @@ ansible.builtin.set_fact: installed_k3s_version: "{{ k3s_version_output.stdout_lines[0].split(' ')[2] }}" +- name: Get docker installed version + ansible.builtin.command: docker --version + register: docker_version_output + changed_when: false + ignore_errors: true + when: use_docker_runtime + +- name: Set docker installed version + when: use_docker_runtime and docker_version_output.rc == 0 + ansible.builtin.set_fact: + installed_docker_version: "{{ docker_version_output.stdout_lines[0].split(' ')[2] }}" + # If airgapped, all K3s artifacts are already on the node. # We should be downloading and installing the newer version only if we are in one of the following cases : # - we couldn't get k3s installed version in the first task of this role # - the installed version of K3s on the nodes is older than the requested version in ansible vars -- name: Download artifact only if needed +- name: Download k3s artifact only if needed when: k3s_version_output.rc != 0 or installed_k3s_version is version(k3s_version, '<') and airgap_dir is undefined block: - name: Download K3s install script @@ -26,7 +38,7 @@ group: root mode: 0755 - - name: Download K3s binary + - name: Run K3S Install ansible.builtin.command: cmd: /usr/local/bin/k3s-install.sh environment: @@ -35,6 +47,24 @@ INSTALL_K3S_EXEC: "agent" changed_when: true +- name: Download docker artifact only if needed + when: use_docker_runtime and docker_version_output.rc != 0 and airgap_dir is undefined + block: + - name: Download docker install script + ansible.builtin.get_url: + # don't use the docker provided script https://get.docker.com as it doesn't seem to work well with k3s + url: https://releases.rancher.com/install-docker/20.10.sh + timeout: 120 + dest: /usr/local/bin/install-docker.sh + owner: root + group: root + mode: 0755 + + - name: Run docker install script + ansible.builtin.command: + cmd: /usr/local/bin/install-docker.sh + changed_when: true + - name: Copy K3s service file register: k3s_agent_service ansible.builtin.template: diff --git a/roles/k3s_agent/templates/k3s-agent.service.j2 b/roles/k3s_agent/templates/k3s-agent.service.j2 index adb39cf..d6a15d1 100644 --- a/roles/k3s_agent/templates/k3s-agent.service.j2 +++ b/roles/k3s_agent/templates/k3s-agent.service.j2 @@ -26,4 +26,4 @@ RestartSec=5s ExecStartPre=/bin/sh -xc '! /usr/bin/systemctl is-enabled --quiet nm-cloud-setup.service' ExecStartPre=-/sbin/modprobe br_netfilter ExecStartPre=-/sbin/modprobe overlay -ExecStart=/usr/local/bin/k3s agent --data-dir {{ k3s_server_location }} --server https://{{ api_endpoint }}:{{ api_port }} --token {{ token }} {{ extra_agent_args }} +ExecStart=/usr/local/bin/k3s agent --node-name {{ node_name }} --data-dir {{ k3s_server_location }} --server https://{{ api_endpoint }}:{{ api_port }} --token {{ token }} {{ '--docker' if use_docker_runtime else '' }} {{ extra_agent_args }} diff --git a/roles/k3s_server/defaults/main.yml b/roles/k3s_server/defaults/main.yml index 4d5e2ad..32421bb 100644 --- a/roles/k3s_server/defaults/main.yml +++ b/roles/k3s_server/defaults/main.yml @@ -5,3 +5,5 @@ api_port: 6443 kubeconfig: ~/.kube/config.new user_kubectl: true cluster_context: k3s-ansible +use_docker_runtime: false +node_name: "{{ inventory_hostname }}" diff --git a/roles/k3s_server/tasks/main.yml b/roles/k3s_server/tasks/main.yml index 0b38616..adbace1 100644 --- a/roles/k3s_server/tasks/main.yml +++ b/roles/k3s_server/tasks/main.yml @@ -10,11 +10,23 @@ ansible.builtin.set_fact: installed_k3s_version: "{{ k3s_version_output.stdout_lines[0].split(' ')[2] }}" +- name: Get docker installed version + ansible.builtin.command: docker --version + register: docker_version_output + changed_when: false + ignore_errors: true + when: use_docker_runtime + +- name: Set docker installed version + when: use_docker_runtime and docker_version_output.rc == 0 + ansible.builtin.set_fact: + installed_docker_version: "{{ docker_version_output.stdout_lines[0].split(' ')[2] }}" + # If airgapped, all K3s artifacts are already on the node. # We should be downloading and installing the newer version only if we are in one of the following cases : # - we couldn't get k3s installed version in the first task of this role # - the installed version of K3s on the nodes is older than the requested version in ansible vars -- name: Download artifact only if needed +- name: Download k3s artifact only if needed when: k3s_version_output.rc != 0 or installed_k3s_version is version(k3s_version, '<') and airgap_dir is undefined block: - name: Download K3s install script @@ -26,7 +38,7 @@ group: root mode: 0755 - - name: Download K3s binary + - name: Run K3S Install ansible.builtin.command: cmd: /usr/local/bin/k3s-install.sh environment: @@ -34,6 +46,24 @@ INSTALL_K3S_VERSION: "{{ k3s_version }}" changed_when: true +- name: Download docker artifact only if needed + when: use_docker_runtime and docker_version_output.rc != 0 and airgap_dir is undefined + block: + - name: Download docker install script + ansible.builtin.get_url: + # don't use the docker provided script https://get.docker.com as it doesn't seem to work well with k3s + url: https://releases.rancher.com/install-docker/20.10.sh + timeout: 120 + dest: /usr/local/bin/install-docker.sh + owner: root + group: root + mode: 0755 + + - name: Run docker install script + ansible.builtin.command: + cmd: /usr/local/bin/install-docker.sh + changed_when: true + - name: Add K3s autocomplete to user bashrc ansible.builtin.lineinfile: path: "~{{ ansible_user }}/.bashrc" diff --git a/roles/k3s_server/templates/k3s-cluster-init.service.j2 b/roles/k3s_server/templates/k3s-cluster-init.service.j2 index 0b79305..a321b93 100644 --- a/roles/k3s_server/templates/k3s-cluster-init.service.j2 +++ b/roles/k3s_server/templates/k3s-cluster-init.service.j2 @@ -25,4 +25,4 @@ Restart=always RestartSec=5s ExecStartPre=-/sbin/modprobe br_netfilter ExecStartPre=-/sbin/modprobe overlay -ExecStart=/usr/local/bin/k3s server --cluster-init --data-dir {{ k3s_server_location }} --token {{ token }} {{ extra_server_args }} \ No newline at end of file +ExecStart=/usr/local/bin/k3s server --cluster-init --node-name {{ node_name }} --data-dir {{ k3s_server_location }} --token {{ token }} {{ '--docker' if use_docker_runtime else '' }} {{ extra_server_args }} \ No newline at end of file diff --git a/roles/k3s_server/templates/k3s-ha.service.j2 b/roles/k3s_server/templates/k3s-ha.service.j2 index bf61e62..3313eb9 100644 --- a/roles/k3s_server/templates/k3s-ha.service.j2 +++ b/roles/k3s_server/templates/k3s-ha.service.j2 @@ -25,4 +25,4 @@ Restart=always RestartSec=5s ExecStartPre=-/sbin/modprobe br_netfilter ExecStartPre=-/sbin/modprobe overlay -ExecStart=/usr/local/bin/k3s server --data-dir {{ k3s_server_location }} --server https://{{ api_endpoint }}:{{ api_port }} --token {{ token }} {{ extra_server_args }} \ No newline at end of file +ExecStart=/usr/local/bin/k3s server --node-name {{ node_name }} --data-dir {{ k3s_server_location }} --server https://{{ api_endpoint }}:{{ api_port }} --token {{ token }} {{ '--docker' if use_docker_runtime else '' }} {{ extra_server_args }} \ No newline at end of file diff --git a/roles/k3s_server/templates/k3s-single.service.j2 b/roles/k3s_server/templates/k3s-single.service.j2 index 8690939..4bc48a5 100644 --- a/roles/k3s_server/templates/k3s-single.service.j2 +++ b/roles/k3s_server/templates/k3s-single.service.j2 @@ -25,4 +25,4 @@ Restart=always RestartSec=5s ExecStartPre=-/sbin/modprobe br_netfilter ExecStartPre=-/sbin/modprobe overlay -ExecStart=/usr/local/bin/k3s server --data-dir {{ k3s_server_location }} --token {{ token }} {{ extra_server_args }} \ No newline at end of file +ExecStart=/usr/local/bin/k3s server --node-name {{ node_name }} --data-dir {{ k3s_server_location }} --token {{ token }} {{ '--docker' if use_docker_runtime else '' }} {{ extra_server_args }} \ No newline at end of file