k0s install with Ansible

April 30, 2022

I wanted to use Ansible to install k0s so that it could be easily replicated across multiple machines. There is a k0s Ansible playbook available at: https://docs.k0sproject.io/v1.21.0+k0s.0/examples/ansible-playbook/ I took this and modified it to my needs a bit.

I ended up with the following files, building on the Ansible setup from my previous blog post.


This file was supplied as part of the repository and defined which version to install

  "schemaVersion": 1,
  "label": "supports k0s",
  "message": "v1.22.4+k0s.1",
  "color": "green" 


This playbook was used to install k0s onto the nodes defined in inventory.yml in my previous post.


- hosts: all
  name: Download k0s on all nodes
  become: yes
    - role: download
      tags: download
    - role: prereq
      tags: prereq

- hosts: initial_controller
  gather_facts: yes
  become: yes
  name: Configure initial k0s control plane node
    - role: k0s/initial_controller
      tags: init

- hosts: controller
  gather_facts: yes
  become: yes
  serial: 1
  name: Configure k0s control plane nodes
    - role: k0s/controller
      tags: server

- hosts: worker
  become: yes
  name: Configure k0s worker nodes
    - role: k0s/worker
      tags: worker

This made use of the roles folder, which was also copied from the link above. I did have to change a timeout in the roles/k0s/initial_controller/tasks/main.yml file, the delay in this following block was set to 15 seconds, and I was getting a timeout on setting up the worker join token. I tried 30, but that was no good and went for 60 in the end which succeeded.

- name: Wait for k8s apiserver
    host: localhost
    port: 6443
    delay: 60
    timeout: 180


Finally, I created a playbook to remove k0s from the nodes:


- hosts: all
  gather_facts: yes
  become: yes
    - role: reset

Running Playbooks

These playbooks can be run as follows. To install k0s on the cluster:

$ ansible-playbook install-k0s.yml --ask-become-pass

To remove it again

$ ansible-playbook remove-k0s.yml --ask-become-pass