diff --git a/ansible/group_vars/all/stackspin.yml b/ansible/group_vars/all/stackspin.yml
index 8ee195e8ef6ba65b4bf18f3017f0424fe070b77d..655724a49038a2b5abd7005eea99c1eaf22036b2 100644
--- a/ansible/group_vars/all/stackspin.yml
+++ b/ansible/group_vars/all/stackspin.yml
@@ -20,14 +20,6 @@ k3s:
   # https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/
   server_args: "--disable traefik --disable local-storage --disable servicelb --kube-apiserver-arg=event-ttl=48h0m0s --tls-san {{ ip_address }}"
 
-helm:
-  # helm snap 2.15.0 and 2.15.1 broke for us
-  # (https://open.greenhost.net/stackspin/stackspin/issues/338), so we
-  # use a pinned version for now.
-  # We use the official helm install script for now which has no checksum.
-  # https://github.com/helm/helm/releases
-  version: 'v3.2.1'
-
 krew:
   # https://github.com/kubernetes-sigs/krew/releases
   version: 'v0.3.4'
diff --git a/ansible/roles/pre-configure/tasks/main.yml b/ansible/roles/pre-configure/tasks/main.yml
index 530f814febc9de0f61f16120eb8d7c16343ebebe..c8e72460ce7e80202d1e3b4c8ca6ba24a5853aee 100644
--- a/ansible/roles/pre-configure/tasks/main.yml
+++ b/ansible/roles/pre-configure/tasks/main.yml
@@ -50,6 +50,8 @@
 # Once the debian issue is solved and Greenhost has patched the kernel, these
 # three workaround commands can be removed.
 - name: Workaround debian bug 1/3
+  tags:
+    - snap
   shell: "journalctl -k | awk '/input: Xen Virtual Keyboard/ {print $11}'"
   args:
     # Only run this if kubectl snap has not been installed yet
@@ -59,6 +61,8 @@
   changed_when: false
 
 - name: Workaround debian bug 2/3
+  tags:
+    - snap
   # kubectl needs to get installed as "classic" snap
   mount:
     opts: bind
@@ -68,57 +72,37 @@
     state: mounted
   when: kbd_device.stdout != "" and kbd_device.stdout != "skipped, since /snap/bin/kubectl exists"
 
-- name: Install kubectl snap
-  # kubectl needs to get installed as "classic" snap
-  command: snap install --classic kubectl
+- name: Install kubectl and helm snap
+  tags:
+    - snap
+  # kubectl and helm both need to get installed as "classic" snap
+  command: "snap install --classic {{ item }}"
   args:
-    creates: /snap/bin/kubectl
+    creates: "/snap/bin/{{ item }}"
+  with_items:
+    - helm
+    - kubectl
 
 - name: Workaround debian bug 3/3
+  tags:
+    - snap
   # kubectl needs to get installed as "classic" snap
   mount:
     path: /sys/{{ kbd_device.stdout }}/uevent
     state: unmounted
   when: kbd_device.stdout != "" and kbd_device.stdout != "skipped, since /snap/bin/kubectl exists"
 
-- name: Create kubectl symlink to /usr/local/bin
+- name: Create kubectl and helm symlinks to /usr/local/bin
+  tags:
+    - snap
   file:
     state: link
-    src: /snap/bin/kubectl
-    dest: /usr/local/bin/kubectl
-
-- name: Get current helm version
-  tags:
-    - helm
-  # {{ '{{' }} escapes the curly braces needed by the `--template` argument
-  shell: "helm version --template \"{{ '{{' }} .Version {{ '}}' }}\""
-  failed_when: false
-  register: helm_version
-  changed_when: false
-
-- name: Show current helm version
-  tags:
-    - helm
-    - debug
-  debug:
-    msg: 'Current helm version is: {{ helm_version.stdout }}'
-
-- name: Download helm install script
-  tags:
-    - helm
-  get_url:
-    url: https://raw.githubusercontent.com/helm/helm/master/scripts/get
-    dest: /usr/local/bin/get-helm
-    force: yes
-    mode: '0755'
-  become: true
-  when: helm_version.stdout != helm.version
-
-- name: Install helm
-  tags:
+    src: "/snap/bin/{{ item }}"
+    dest: "/usr/local/bin/{{ item }}"
+    force: true
+  with_items:
     - helm
-  command: /usr/local/bin/get-helm --version {{ helm.version }}
-  when: helm_version.stdout != helm.version
+    - kubectl
 
 - name: Configure firewall
   import_tasks: firewall.yml