diff --git a/contrib/vault/roles/vault/tasks/shared/check_vault.yml b/contrib/vault/roles/vault/tasks/shared/check_vault.yml
index 9cbc71d0b20de06c770a3c09e802915c8eeba431..c109048015e8bf938323bf8cfec5141ea5f74f8f 100644
--- a/contrib/vault/roles/vault/tasks/shared/check_vault.yml
+++ b/contrib/vault/roles/vault/tasks/shared/check_vault.yml
@@ -36,6 +36,7 @@
       {{ etcd_access_addresses.split(',') | first }}/v3alpha/kv/range
   register: vault_etcd_exists
   retries: 4
+  until: vault_etcd_exists.status == 200
   delay: "{{ retry_stagger | random + 3 }}"
   run_once: true
   when: not vault_is_running and vault_etcd_available
diff --git a/extra_playbooks/build-cephfs-provisioner.yml b/extra_playbooks/build-cephfs-provisioner.yml
index 5bffa137e7339cff1a697722e8a7b148d4a8477d..d0d87c9ea3991d57780d3f90553c497cb4e7a36b 100644
--- a/extra_playbooks/build-cephfs-provisioner.yml
+++ b/extra_playbooks/build-cephfs-provisioner.yml
@@ -50,6 +50,8 @@
           docker_image:
             name: quay.io/kubespray/cephfs-provisioner:06fddbe2
             push: yes
+          register: docker_image
           retries: 10
+          until: docker_image is succeeded
 
       when: check_image_result.rc != 0
diff --git a/roles/kubernetes/master/tasks/kubeadm-upgrade.yml b/roles/kubernetes/master/tasks/kubeadm-upgrade.yml
index fcd197ae48adc976a1b90e800f54d70421c7eb3a..5e844296a2ae1d0dfb43a2936dfb79dd02c716d9 100644
--- a/roles/kubernetes/master/tasks/kubeadm-upgrade.yml
+++ b/roles/kubernetes/master/tasks/kubeadm-upgrade.yml
@@ -24,6 +24,7 @@
   register: kubeadm_upgrade
   # Retry is because upload config sometimes fails
   retries: 3
+  until: kubeadm_upgrade.rc == 0
   when: inventory_hostname == groups['kube-master']|first
   failed_when: kubeadm_upgrade.rc != 0 and "field is immutable" not in kubeadm_upgrade.stderr
   notify: Master | restart kubelet
diff --git a/roles/network_plugin/calico/tasks/install.yml b/roles/network_plugin/calico/tasks/install.yml
index 3293985703518f6c698d89e995c8b8e69f04076a..838e134a9e63d73c2a55fd168f04c4d365b8daf8 100644
--- a/roles/network_plugin/calico/tasks/install.yml
+++ b/roles/network_plugin/calico/tasks/install.yml
@@ -89,6 +89,7 @@
     {{ bin_dir }}/calicoctl.sh get ippool | grep -w "{{ calico_pool_cidr | default(kube_pods_subnet) }}" | wc -l
   register: calico_conf
   retries: 4
+  until: calico_conf.rc == 0
   delay: "{{ retry_stagger | random + 3 }}"
   changed_when: false
   when:
@@ -203,7 +204,9 @@
        "asNumber": "{{ item.as }}",
        "peerIP": "{{ item.router_id }}"
     }}' | {{ bin_dir }}/calicoctl.sh apply -f -
+  register: output
   retries: 4
+  until: output.rc == 0
   delay: "{{ retry_stagger | random + 3 }}"
   with_items:
     - "{{ peers|selectattr('scope','defined')|selectattr('scope','equalto', 'global')|list|default([]) }}"
@@ -223,7 +226,9 @@
        "nodeSelector": "!has(i-am-a-route-reflector)",
        "peerSelector": "has(i-am-a-route-reflector)"
     }}' | {{ bin_dir }}/calicoctl.sh apply -f -
+  register: output
   retries: 4
+  until: output.rc == 0
   delay: "{{ retry_stagger | random + 3 }}"
   with_items:
     - "{{ groups['calico-rr'] | default([]) }}"
@@ -243,7 +248,9 @@
        "nodeSelector": "has(i-am-a-route-reflector)",
        "peerSelector": "has(i-am-a-route-reflector)"
     }}' | {{ bin_dir }}/calicoctl.sh apply -f -
+  register: output
   retries: 4
+  until: output.rc == 0
   delay: "{{ retry_stagger | random + 3 }}"
   with_items:
     - "{{ groups['calico-rr'] | default([]) }}"
@@ -316,7 +323,9 @@
        },
        "orchRefs":[{"nodeName":"{{ inventory_hostname }}","orchestrator":"k8s"}]
     }}' | {{ bin_dir }}/calicoctl.sh apply -f -
+  register: output
   retries: 4
+  until: output.rc == 0
   delay: "{{ retry_stagger | random + 3 }}"
   when:
     - peer_with_router|default(false)
@@ -337,7 +346,9 @@
        "node": "{{ inventory_hostname }}",
        "peerIP": "{{ item.router_id }}"
     }}' | {{ bin_dir }}/calicoctl.sh apply -f -
+  register: output
   retries: 4
+  until: output.rc == 0
   delay: "{{ retry_stagger | random + 3 }}"
   with_items:
     - "{{ peers|selectattr('scope','undefined')|list|default([]) | union(peers|selectattr('scope','defined')|selectattr('scope','equalto', 'node')|list|default([])) }}"
diff --git a/roles/network_plugin/canal/tasks/main.yml b/roles/network_plugin/canal/tasks/main.yml
index 7595a2a759bf4ba6861448c61282049a227a0033..921ef736ba2f1d56980d469d292cfcd9f9d4a8f4 100644
--- a/roles/network_plugin/canal/tasks/main.yml
+++ b/roles/network_plugin/canal/tasks/main.yml
@@ -31,7 +31,9 @@
     {{ bin_dir }}/etcdctl --peers={{ etcd_access_addresses }} \
     set /{{ cluster_name }}/network/config \
     '{ "Network": "{{ kube_pods_subnet }}", "SubnetLen": {{ kube_network_node_prefix }}, "Backend": { "Type": "{{ flannel_backend_type }}" } }'
+  register: output
   retries: 4
+  until: output.rc == 0
   delay: "{{ retry_stagger | random + 3 }}"
   delegate_to: "{{ groups['etcd'][0] }}"
   changed_when: false
diff --git a/tests/cloud_playbooks/delete-gce.yml b/tests/cloud_playbooks/delete-gce.yml
index ba50f92e6772903fc570df24a4e09df40c63314e..00e671240008fe2c736a60b01d4eed9b6f4abe77 100644
--- a/tests/cloud_playbooks/delete-gce.yml
+++ b/tests/cloud_playbooks/delete-gce.yml
@@ -31,7 +31,6 @@
         state: 'stopped'
       async: 120
       poll: 3
-      retries: 3
       register: gce
 
     - name: delete gce instances
@@ -46,5 +45,4 @@
         state: 'absent'
       async: 120
       poll: 3
-      retries: 3
       register: gce