diff --git a/ansible/site.yml b/ansible/site.yml
index 49f6f89d18..6878a1f77d 100644
--- a/ansible/site.yml
+++ b/ansible/site.yml
@@ -5,14 +5,32 @@
 # set to 'false' is a bit confusing but this is to avoid
 # Ansible gathering facts twice.
 - name: Gather facts for all hosts
-  hosts:
-    - all
+  hosts: all
   serial: '{{ serial|default("0") }}'
   gather_facts: false
   tasks:
     - setup:
   tags: always
 
+# NOTE(pbourke): This case covers deploying subsets of hosts using --limit. The
+# limit arg will cause the first play to gather facts only about that node,
+# meaning facts such as IP addresses for rabbitmq nodes etc. will be undefined
+# in the case of adding a single compute node.
+# We don't want to add the delegate parameters to the above play as it will
+# result in ((num_nodes-1)^2) number of SSHs when running for all nodes
+# which can be very inefficient.
+- name: Gather facts for all hosts (if using --limit)
+  hosts: all
+  serial: '{{ serial|default("0") }}'
+  gather_facts: false
+  tasks:
+    - setup:
+      delegate_facts: True
+      delegate_to: "{{ item }}"
+      with_items: "{{ groups['all'] }}"
+      when:
+        - (play_hosts | length) != (groups['all'] | length)
+
 - hosts:
     - all
   roles: