diff --git a/roles/remove-node/post-remove/tasks/main.yml b/roles/remove-node/post-remove/tasks/main.yml
index 36b1e9ff8f7907e87a3bcdd835de79c5a936cb6d..ff8a06d848168e7d5f6a911eb597bccb7bc52931 100644
--- a/roles/remove-node/post-remove/tasks/main.yml
+++ b/roles/remove-node/post-remove/tasks/main.yml
@@ -2,8 +2,10 @@
 - name: remove-node | Delete node
   command: "{{ kubectl }} delete node {{ kube_override_hostname|default(inventory_hostname) }}"
   delegate_to: "{{ groups['kube_control_plane']|first }}"
-  # ignore servers that are not nodes
-  when: inventory_hostname in groups['k8s_cluster'] and kube_override_hostname|default(inventory_hostname) in nodes.stdout_lines
+  when:
+    - groups['kube_control_plane'] | length > 0
+    # ignore servers that are not nodes
+    - inventory_hostname in groups['k8s_cluster'] and kube_override_hostname|default(inventory_hostname) in nodes.stdout_lines
   retries: "{{ delete_node_retries }}"
   # Sometimes the api-server can have a short window of indisponibility when we delete a master node
   delay: "{{ delete_node_delay_seconds }}"
diff --git a/roles/remove-node/pre-remove/tasks/main.yml b/roles/remove-node/pre-remove/tasks/main.yml
index add5120dfe214fe91aa5c5853fd308aaf142df21..b45e809f8d5e794baf2e2312510bcdc0f41e7919 100644
--- a/roles/remove-node/pre-remove/tasks/main.yml
+++ b/roles/remove-node/pre-remove/tasks/main.yml
@@ -3,6 +3,8 @@
   command: >-
     {{ kubectl }} get nodes -o go-template={% raw %}'{{ range .items }}{{ .metadata.name }}{{ "\n" }}{{ end }}'{% endraw %}
   register: nodes
+  when:
+    - groups['kube_control_plane'] | length > 0
   delegate_to: "{{ groups['kube_control_plane']|first }}"
   changed_when: false
   run_once: true
@@ -15,8 +17,10 @@
       --grace-period {{ drain_grace_period }}
       --timeout {{ drain_timeout }}
       --delete-emptydir-data {{ kube_override_hostname|default(inventory_hostname) }}
-  # ignore servers that are not nodes
-  when: kube_override_hostname|default(inventory_hostname) in nodes.stdout_lines
+  when:
+    - groups['kube_control_plane'] | length > 0
+    # ignore servers that are not nodes
+    - kube_override_hostname|default(inventory_hostname) in nodes.stdout_lines
   register: result
   failed_when: result.rc != 0 and not allow_ungraceful_removal
   delegate_to: "{{ groups['kube_control_plane']|first }}"
@@ -34,5 +38,6 @@
   retries: 3
   delay: "{{ drain_grace_period }}"
   when:
+    - groups['kube_control_plane'] | length > 0
     - not allow_ungraceful_removal
     - kube_override_hostname|default(inventory_hostname) in nodes.stdout_lines
diff --git a/roles/remove-node/remove-etcd-node/tasks/main.yml b/roles/remove-node/remove-etcd-node/tasks/main.yml
index 7500d6d347eda067ba5248c2bea12c416d4ac81c..e9ef0cf6bf49d6adc7393fc51cc80ba54d6da038 100644
--- a/roles/remove-node/remove-etcd-node/tasks/main.yml
+++ b/roles/remove-node/remove-etcd-node/tasks/main.yml
@@ -5,6 +5,7 @@
     -o jsonpath='{range .status.addresses[?(@.type=="InternalIP")]}{@.address}{"\n"}{end}'
   register: remove_node_ip
   when:
+    - groups['kube_control_plane'] | length > 0
     - inventory_hostname in groups['etcd']
     - ip is not defined
     - access_ip is not defined