diff --git a/ansible/roles/service-images-pull/defaults/main.yml b/ansible/roles/service-images-pull/defaults/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..57e0e696ed1b3f32d1d894f189735c1a94ca2f58
--- /dev/null
+++ b/ansible/roles/service-images-pull/defaults/main.yml
@@ -0,0 +1,7 @@
+---
+# Kolla image pulling settings: the amount of retries and the delay (in seconds)
+# between them. These are useful if your registry is not 100% reliable (usually
+# due to load). They modify the Ansible image pulling task params ``retries``
+# and ``delay``, respectively.
+service_images_pull_retries: 3
+service_images_pull_delay: 5
diff --git a/ansible/roles/service-images-pull/tasks/main.yml b/ansible/roles/service-images-pull/tasks/main.yml
index 240ea57cbe4467ca7e164265fc683c73e12dc8a7..cb526bfb31ccf52535160ee70b82885d708da141 100644
--- a/ansible/roles/service-images-pull/tasks/main.yml
+++ b/ansible/roles/service-images-pull/tasks/main.yml
@@ -7,6 +7,10 @@
     action: "pull_image"
     common_options: "{{ docker_common_options }}"
     image: "{{ service.image }}"
+  retries: "{{ service_images_pull_retries }}"
+  delay: "{{ service_images_pull_delay }}"
+  register: result
+  until: result is success
   with_dict: "{{ lookup('vars', (kolla_role_name | default(project_name)) + '_services') | select_services_enabled_and_mapped_to_host }}"
   loop_control:
     label: "{{ item.key }}"
diff --git a/ansible/roles/swift/defaults/main.yml b/ansible/roles/swift/defaults/main.yml
index 82b70bb57686093935909834a9f80151e3af10f0..9e08fab3b8f6472013dca2c6da08db624693e1dd 100644
--- a/ansible/roles/swift/defaults/main.yml
+++ b/ansible/roles/swift/defaults/main.yml
@@ -93,3 +93,9 @@ swift_ks_users:
     user: "{{ swift_keystone_user }}"
     password: "{{ swift_keystone_password }}"
     role: "admin"
+
+
+# FIXME(yoctozepto): These are copied from service-images-pull role.
+# Remove when the Swift role is finally migrated to new style.
+service_images_pull_retries: 3
+service_images_pull_delay: 5
diff --git a/ansible/roles/swift/tasks/pull.yml b/ansible/roles/swift/tasks/pull.yml
index 61946da2f3838648d96790a1dffa07c974eaa02b..622c6227644ed58c4f75084af8ea186486f685bd 100644
--- a/ansible/roles/swift/tasks/pull.yml
+++ b/ansible/roles/swift/tasks/pull.yml
@@ -5,6 +5,10 @@
     action: "pull_image"
     common_options: "{{ docker_common_options }}"
     image: "{{ swift_rsyncd_image_full }}"
+  retries: "{{ service_images_pull_retries }}"
+  delay: "{{ service_images_pull_delay }}"
+  register: result
+  until: result is success
   when: inventory_hostname in groups['swift-account-server'] or
         inventory_hostname in groups['swift-container-server'] or
         inventory_hostname in groups['swift-object-server']
@@ -15,6 +19,10 @@
     action: "pull_image"
     common_options: "{{ docker_common_options }}"
     image: "{{ swift_proxy_server_image_full }}"
+  retries: "{{ service_images_pull_retries }}"
+  delay: "{{ service_images_pull_delay }}"
+  register: result
+  until: result is success
   when: inventory_hostname in groups['swift-proxy-server']
 
 - name: Pulling swift-account image
@@ -23,6 +31,10 @@
     action: "pull_image"
     common_options: "{{ docker_common_options }}"
     image: "{{ swift_account_image_full }}"
+  retries: "{{ service_images_pull_retries }}"
+  delay: "{{ service_images_pull_delay }}"
+  register: result
+  until: result is success
   when: inventory_hostname in groups['swift-account-server']
 
 - name: Pulling swift-container image
@@ -31,6 +43,10 @@
     action: "pull_image"
     common_options: "{{ docker_common_options }}"
     image: "{{ swift_container_image_full }}"
+  retries: "{{ service_images_pull_retries }}"
+  delay: "{{ service_images_pull_delay }}"
+  register: result
+  until: result is success
   when: inventory_hostname in groups['swift-container-server']
 
 - name: Pulling swift-object image
@@ -39,6 +55,10 @@
     action: "pull_image"
     common_options: "{{ docker_common_options }}"
     image: "{{ swift_object_image_full }}"
+  retries: "{{ service_images_pull_retries }}"
+  delay: "{{ service_images_pull_delay }}"
+  register: result
+  until: result is success
   when: inventory_hostname in groups['swift-object-server']
 
 - name: Pulling swift-object-expirer image
@@ -47,4 +67,8 @@
     action: "pull_image"
     common_options: "{{ docker_common_options }}"
     image: "{{ swift_object_expirer_image_full }}"
+  retries: "{{ service_images_pull_retries }}"
+  delay: "{{ service_images_pull_delay }}"
+  register: result
+  until: result is success
   when: inventory_hostname in groups['swift-object-server']
diff --git a/releasenotes/notes/image-pull-retries-75490c3e6e1e4b54.yaml b/releasenotes/notes/image-pull-retries-75490c3e6e1e4b54.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..ea6039c26a9bbaa40f2cfae31dd88f0ecb0747cb
--- /dev/null
+++ b/releasenotes/notes/image-pull-retries-75490c3e6e1e4b54.yaml
@@ -0,0 +1,9 @@
+---
+features:
+  - |
+    Adds two new variables ``service_images_pull_retries`` and
+    ``service_images_pull_delay`` which control the behaviour of image
+    pulling tasks. These are useful if your registry is not 100%
+    reliable (usually due to load). The defaults have been set to
+    3 retries and 5 seconds delay to ensure a better default experience
+    (these are actually Ansible defaults when task retries are enabled).