diff --git a/ansible/roles/cinder/tasks/main.yml b/ansible/roles/cinder/tasks/main.yml
index 4c44e7aecdc528e51eb4b5184646e471fe33cddb..184b97a273c68ef77f8004decb1ff53b388bbebb 100644
--- a/ansible/roles/cinder/tasks/main.yml
+++ b/ansible/roles/cinder/tasks/main.yml
@@ -1,6 +1,12 @@
 ---
 - include: ceph.yml
-  when: enable_ceph | bool
+  when:
+    - enable_ceph | bool
+    - inventory_hostname in groups['ceph-mon'] or
+        inventory_hostname in groups['cinder-api'] or
+        inventory_hostname in groups['cinder-volume'] or
+        inventory_hostname in groups['cinder-scheduler'] or
+        inventory_hostname in groups['cinder-backup']
 
 - include: register.yml
   when: inventory_hostname in groups['cinder-api'] or
diff --git a/ansible/roles/cinder/templates/cinder.conf.j2 b/ansible/roles/cinder/templates/cinder.conf.j2
index ac021e819336ca3d976b10c4e55bdfcb31005f14..86f99c12a194de911ae4f7a511bfa51fc36bd947 100644
--- a/ansible/roles/cinder/templates/cinder.conf.j2
+++ b/ansible/roles/cinder/templates/cinder.conf.j2
@@ -59,8 +59,9 @@ lock_path = /var/lib/cinder/tmp
 [oslo_messaging_rabbit]
 rabbit_userid = {{ rabbitmq_user }}
 rabbit_password = {{ rabbitmq_password }}
-rabbit_host = {{ kolla_internal_address }}
 rabbit_ha_queues = true
+rabbit_hosts = {% for host in groups['rabbitmq'] %}{{ hostvars[host]['ansible_' + api_interface]['ipv4']['address'] }}:{{ rabbitmq_port }}{% if not loop.last %},{% endif %}{% endfor %}
+
 
 {% if cinder_volume_driver == "lvm" %}
 [lvmdriver-1]
diff --git a/ansible/roles/glance/tasks/main.yml b/ansible/roles/glance/tasks/main.yml
index 39c541d0b1a3d2ff389b31dc28acec6b38084546..3370da4c1f8574a2b570e186ec791ca2c83c63a5 100644
--- a/ansible/roles/glance/tasks/main.yml
+++ b/ansible/roles/glance/tasks/main.yml
@@ -1,6 +1,10 @@
 ---
 - include: ceph.yml
-  when: enable_ceph | bool
+  when:
+    - enable_ceph | bool
+    - inventory_hostname in groups['ceph-mon'] or
+        inventory_hostname in groups['glance-api'] or
+        inventory_hostname in groups['glance-registry']
 
 - include: register.yml
   when: inventory_hostname in groups['glance-api'] or
diff --git a/ansible/roles/haproxy/templates/haproxy.cfg.j2 b/ansible/roles/haproxy/templates/haproxy.cfg.j2
index 3e31edb0e333ee73c6530d2b78ca2a55f660643c..aa214f73798d98d2a2396e69add33357d69cfd7f 100644
--- a/ansible/roles/haproxy/templates/haproxy.cfg.j2
+++ b/ansible/roles/haproxy/templates/haproxy.cfg.j2
@@ -35,14 +35,6 @@ listen mariadb
 {% endif %}
 
 {% if enable_rabbitmq | bool %}
-listen rabbitmq
-  mode tcp
-  option tcpka
-  bind {{ kolla_internal_address }}:{{ rabbitmq_port }}
-{% for host in groups['rabbitmq'] %}
-  server {{ hostvars[host]['ansible_hostname'] }} {{ hostvars[host]['ansible_' + api_interface]['ipv4']['address'] }}:{{ rabbitmq_port }} check inter 2000 rise 2 fall 5
-{% endfor %}
-
 listen rabbitmq_management
   bind {{ kolla_internal_address }}:{{ rabbitmq_management_port }}
 {% for host in groups['rabbitmq'] %}
diff --git a/ansible/roles/heat/tasks/main.yml b/ansible/roles/heat/tasks/main.yml
index 5c48120b7c9e6ee00027462c3f23aa25c6b05dd7..52e4eef7e6eaa083f6e493ff4a60fe1f81519152 100644
--- a/ansible/roles/heat/tasks/main.yml
+++ b/ansible/roles/heat/tasks/main.yml
@@ -1,8 +1,20 @@
 ---
 - include: register.yml
+  when: inventory_hostname in groups['heat-api'] or
+        inventory_hostname in groups['heat-api-cfn'] or
+        inventory_hostname in groups['heat-engine']
 
 - include: config.yml
+  when: inventory_hostname in groups['heat-api'] or
+        inventory_hostname in groups['heat-api-cfn'] or
+        inventory_hostname in groups['heat-engine']
 
 - include: bootstrap.yml
+  when: inventory_hostname in groups['heat-api'] or
+        inventory_hostname in groups['heat-api-cfn'] or
+        inventory_hostname in groups['heat-engine']
 
 - include: start.yml
+  when: inventory_hostname in groups['heat-api'] or
+        inventory_hostname in groups['heat-api-cfn'] or
+        inventory_hostname in groups['heat-engine']
diff --git a/ansible/roles/heat/templates/heat.conf.j2 b/ansible/roles/heat/templates/heat.conf.j2
index e074f75ad0f422a779edcd38dddb1f74cb5b8de8..a03f2fb0034a4380a3743e0c2c025f0276792e41 100644
--- a/ansible/roles/heat/templates/heat.conf.j2
+++ b/ansible/roles/heat/templates/heat.conf.j2
@@ -15,10 +15,10 @@ syslog_log_facility=LOG_LOCAL0
 use_syslog=yes
 
 [oslo_messaging_rabbit]
-rabbit_host = {{ kolla_internal_address }}
 rabbit_userid = {{ rabbitmq_user }}
 rabbit_password = {{ rabbitmq_password }}
 rabbit_ha_queues = true
+rabbit_hosts = {% for host in groups['rabbitmq'] %}{{ hostvars[host]['ansible_' + api_interface]['ipv4']['address'] }}:{{ rabbitmq_port }}{% if not loop.last %},{% endif %}{% endfor %}
 
 {% if service_name == 'heat-api' %}
 [heat_api]
diff --git a/ansible/roles/ironic/tasks/main.yml b/ansible/roles/ironic/tasks/main.yml
index 5c48120b7c9e6ee00027462c3f23aa25c6b05dd7..4bc96412555570d1bc6fee4d5fdc9162ee31e0e0 100644
--- a/ansible/roles/ironic/tasks/main.yml
+++ b/ansible/roles/ironic/tasks/main.yml
@@ -1,8 +1,24 @@
 ---
 - include: register.yml
+  when: inventory_hostname in groups['ironic-api'] or
+        inventory_hostname in groups['ironic-conductor'] or
+        inventory_hostname in groups['ironic-discoverd'] or
+        inventory_hostname in groups['ironic-pxe']
 
 - include: config.yml
+  when: inventory_hostname in groups['ironic-api'] or
+        inventory_hostname in groups['ironic-conductor'] or
+        inventory_hostname in groups['ironic-discoverd'] or
+        inventory_hostname in groups['ironic-pxe']
 
 - include: bootstrap.yml
+  when: inventory_hostname in groups['ironic-api'] or
+        inventory_hostname in groups['ironic-conductor'] or
+        inventory_hostname in groups['ironic-discoverd'] or
+        inventory_hostname in groups['ironic-pxe']
 
 - include: start.yml
+  when: inventory_hostname in groups['ironic-api'] or
+        inventory_hostname in groups['ironic-conductor'] or
+        inventory_hostname in groups['ironic-discoverd'] or
+        inventory_hostname in groups['ironic-pxe']
diff --git a/ansible/roles/ironic/templates/ironic.conf.j2 b/ansible/roles/ironic/templates/ironic.conf.j2
index 6860aee12de9d1f55c2408073365ab2d58a12606..e37001dca3db3b7ebe9a9ae92aa3deba189cb327 100644
--- a/ansible/roles/ironic/templates/ironic.conf.j2
+++ b/ansible/roles/ironic/templates/ironic.conf.j2
@@ -24,7 +24,7 @@ glance_host = {{ kolla_internal_address }}
 url = http://{{ kolla_internal_address }}:{{ neutron_server_port }}
 
 [oslo_messaging_rabbit]
-rabbit_host = {{ kolla_internal_address }}
 rabbit_userid = {{ rabbitmq_user }}
 rabbit_password = {{ rabbitmq_password }}
 rabbit_ha_queues = true
+rabbit_hosts = {% for host in groups['rabbitmq'] %}{{ hostvars[host]['ansible_' + api_interface]['ipv4']['address'] }}:{{ rabbitmq_port }}{% if not loop.last %},{% endif %}{% endfor %}
diff --git a/ansible/roles/murano/tasks/main.yml b/ansible/roles/murano/tasks/main.yml
index 5c48120b7c9e6ee00027462c3f23aa25c6b05dd7..a76d0866dde5e5253acd21e91ab45743a3c5ca1d 100644
--- a/ansible/roles/murano/tasks/main.yml
+++ b/ansible/roles/murano/tasks/main.yml
@@ -1,8 +1,16 @@
 ---
 - include: register.yml
+  when: inventory_hostname in groups['murano-api'] or
+        inventory_hostname in groups['murano-engine']
 
 - include: config.yml
+  when: inventory_hostname in groups['murano-api'] or
+        inventory_hostname in groups['murano-engine']
 
 - include: bootstrap.yml
+  when: inventory_hostname in groups['murano-api'] or
+        inventory_hostname in groups['murano-engine']
 
 - include: start.yml
+  when: inventory_hostname in groups['murano-api'] or
+        inventory_hostname in groups['murano-engine']
diff --git a/ansible/roles/murano/templates/murano.conf.j2 b/ansible/roles/murano/templates/murano.conf.j2
index db4192e37fd56dd670902336d82910eb517120d8..760576baf5bb8fc341b422adafd589f2b3a44609 100644
--- a/ansible/roles/murano/templates/murano.conf.j2
+++ b/ansible/roles/murano/templates/murano.conf.j2
@@ -2,9 +2,6 @@
 verbose = {{ openstack_logging_verbose }}
 debug = {{ openstack_logging_debug }}
 
-rabbit_host = {{ kolla_internal_address }}
-rabbit_userid = {{ rabbitmq_user }}
-rabbit_password = {{ rabbitmq_password }}
 notification_driver = noop
 
 use_syslog = True
@@ -31,9 +28,8 @@ password = {{ murano_keystone_password }}
 [murano]
 url = http://{{ kolla_internal_address }}:{{ murano_api_port }}
 
-{% if service_name == 'murano-engine' %}
-[rabbitmq]
-host = {{ kolla_internal_address }}
-login = {{ rabbitmq_user }}
-password = {{ rabbitmq_password }}
-{% endif %}
+[oslo_messaging_rabbit]
+rabbit_userid = {{ rabbitmq_user }}
+rabbit_password = {{ rabbitmq_password }}
+rabbit_ha_queues = true
+rabbit_hosts = {% for host in groups['rabbitmq'] %}{{ hostvars[host]['ansible_' + api_interface]['ipv4']['address'] }}:{{ rabbitmq_port }}{% if not loop.last %},{% endif %}{% endfor %}
diff --git a/ansible/roles/neutron/tasks/main.yml b/ansible/roles/neutron/tasks/main.yml
index 3ff22446916ac27b9b4c26e69df0dd7bc2ccafe4..f8eff9ba93d68ac9098cfcb8e59eb05fdbfd6b46 100644
--- a/ansible/roles/neutron/tasks/main.yml
+++ b/ansible/roles/neutron/tasks/main.yml
@@ -3,9 +3,21 @@
 - include: ironic-check.yml
 
 - include: register.yml
+  when: inventory_hostname in groups['compute'] or
+        inventory_hostname in groups['neutron-agents'] or
+        inventory_hostname in groups['neutron-server']
 
 - include: config.yml
+  when: inventory_hostname in groups['compute'] or
+        inventory_hostname in groups['neutron-agents'] or
+        inventory_hostname in groups['neutron-server']
 
 - include: bootstrap.yml
+  when: inventory_hostname in groups['compute'] or
+        inventory_hostname in groups['neutron-agents'] or
+        inventory_hostname in groups['neutron-server']
 
 - include: start.yml
+  when: inventory_hostname in groups['compute'] or
+        inventory_hostname in groups['neutron-agents'] or
+        inventory_hostname in groups['neutron-server']
diff --git a/ansible/roles/neutron/templates/neutron.conf.j2 b/ansible/roles/neutron/templates/neutron.conf.j2
index 65013c2fb66ceb1bca9bb986dff8e7a808424a3d..787cbb7d178d5d0726aaaa619abaa22fdd34b491 100644
--- a/ansible/roles/neutron/templates/neutron.conf.j2
+++ b/ansible/roles/neutron/templates/neutron.conf.j2
@@ -38,10 +38,10 @@ password = {{ nova_keystone_password }}
 lock_path = /var/lib/neutron/tmp
 
 [oslo_messaging_rabbit]
-rabbit_host = {{ kolla_internal_address }}
 rabbit_userid = {{ rabbitmq_user }}
 rabbit_password = {{ rabbitmq_password }}
 rabbit_ha_queues = true
+rabbit_hosts = {% for host in groups['rabbitmq'] %}{{ hostvars[host]['ansible_' + api_interface]['ipv4']['address'] }}:{{ rabbitmq_port }}{% if not loop.last %},{% endif %}{% endfor %}
 
 [agent]
 root_helper = sudo neutron-rootwrap /etc/neutron/rootwrap.conf
diff --git a/ansible/roles/nova/tasks/main.yml b/ansible/roles/nova/tasks/main.yml
index 19a5a4fb3f773ff366c82b601ed8828eddb7124e..869235f35e7ec38dcbc3c05a2c4d4a79f4fffa6e 100644
--- a/ansible/roles/nova/tasks/main.yml
+++ b/ansible/roles/nova/tasks/main.yml
@@ -1,35 +1,43 @@
 ---
 - include: ceph.yml
-  when: enable_ceph | bool
+  when:
+    - enable_ceph | bool
+    - inventory_hostname in groups['ceph-mon'] or
+        inventory_hostname in groups['compute'] or
+        inventory_hostname in groups['nova-api'] or
+        inventory_hostname in groups['nova-conductor'] or
+        inventory_hostname in groups['nova-consoleauth'] or
+        inventory_hostname in groups['nova-novncproxy'] or
+        inventory_hostname in groups['nova-scheduler']
 
 - include: register.yml
-  when: inventory_hostname in groups['nova-api'] or
-        inventory_hostname in groups['nova-consoleauth'] or
+  when: inventory_hostname in groups['compute'] or
+        inventory_hostname in groups['nova-api'] or
         inventory_hostname in groups['nova-conductor'] or
+        inventory_hostname in groups['nova-consoleauth'] or
         inventory_hostname in groups['nova-novncproxy'] or
-        inventory_hostname in groups['nova-scheduler'] or
-        inventory_hostname in groups['compute']
+        inventory_hostname in groups['nova-scheduler']
 
 - include: config.yml
-  when: inventory_hostname in groups['nova-api'] or
-        inventory_hostname in groups['nova-consoleauth'] or
+  when: inventory_hostname in groups['compute'] or
+        inventory_hostname in groups['nova-api'] or
         inventory_hostname in groups['nova-conductor'] or
+        inventory_hostname in groups['nova-consoleauth'] or
         inventory_hostname in groups['nova-novncproxy'] or
-        inventory_hostname in groups['nova-scheduler'] or
-        inventory_hostname in groups['compute']
+        inventory_hostname in groups['nova-scheduler']
 
 - include: bootstrap.yml
-  when: inventory_hostname in groups['nova-api'] or
-        inventory_hostname in groups['nova-consoleauth'] or
+  when: inventory_hostname in groups['compute'] or
+        inventory_hostname in groups['nova-api'] or
         inventory_hostname in groups['nova-conductor'] or
+        inventory_hostname in groups['nova-consoleauth'] or
         inventory_hostname in groups['nova-novncproxy'] or
-        inventory_hostname in groups['nova-scheduler'] or
-        inventory_hostname in groups['compute']
+        inventory_hostname in groups['nova-scheduler']
 
 - include: start.yml
-  when: inventory_hostname in groups['nova-api'] or
-        inventory_hostname in groups['nova-consoleauth'] or
+  when: inventory_hostname in groups['compute'] or
+        inventory_hostname in groups['nova-api'] or
         inventory_hostname in groups['nova-conductor'] or
+        inventory_hostname in groups['nova-consoleauth'] or
         inventory_hostname in groups['nova-novncproxy'] or
-        inventory_hostname in groups['nova-scheduler'] or
-        inventory_hostname in groups['compute']
+        inventory_hostname in groups['nova-scheduler']
diff --git a/ansible/roles/nova/templates/nova.conf.j2 b/ansible/roles/nova/templates/nova.conf.j2
index 847728cad9273f7c1b8980d228d360d6d57d426f..6192a2a6e25f415800a2b4ae53b18ac642d7ab51 100644
--- a/ansible/roles/nova/templates/nova.conf.j2
+++ b/ansible/roles/nova/templates/nova.conf.j2
@@ -83,10 +83,10 @@ api_endpoint = http://{{ kolla_internal_address }}:{{ ironic_api_port }}/v1
 {% endif %}
 
 [oslo_messaging_rabbit]
-rabbit_host = {{ kolla_internal_address }}
 rabbit_userid = {{ rabbitmq_user }}
 rabbit_password = {{ rabbitmq_password }}
 rabbit_ha_queues = true
+rabbit_hosts = {% for host in groups['rabbitmq'] %}{{ hostvars[host]['ansible_' + api_interface]['ipv4']['address'] }}:{{ rabbitmq_port }}{% if not loop.last %},{% endif %}{% endfor %}
 
 [oslo_concurrency]
 lock_path = /var/lib/nova/tmp
diff --git a/ansible/roles/swift/tasks/main.yml b/ansible/roles/swift/tasks/main.yml
index 5c48120b7c9e6ee00027462c3f23aa25c6b05dd7..47592b8746f9b8bf5913d7c1243897ce448ad236 100644
--- a/ansible/roles/swift/tasks/main.yml
+++ b/ansible/roles/swift/tasks/main.yml
@@ -1,8 +1,24 @@
 ---
 - include: register.yml
+  when: inventory_hostname in groups['swift-account-server'] or
+        inventory_hostname in groups['swift-container-server'] or
+        inventory_hostname in groups['swift-object-server'] or
+        inventory_hostname in groups['swift-proxy-server']
 
 - include: config.yml
+  when: inventory_hostname in groups['swift-account-server'] or
+        inventory_hostname in groups['swift-container-server'] or
+        inventory_hostname in groups['swift-object-server'] or
+        inventory_hostname in groups['swift-proxy-server']
 
 - include: bootstrap.yml
+  when: inventory_hostname in groups['swift-account-server'] or
+        inventory_hostname in groups['swift-container-server'] or
+        inventory_hostname in groups['swift-object-server'] or
+        inventory_hostname in groups['swift-proxy-server']
 
 - include: start.yml
+  when: inventory_hostname in groups['swift-account-server'] or
+        inventory_hostname in groups['swift-container-server'] or
+        inventory_hostname in groups['swift-object-server'] or
+        inventory_hostname in groups['swift-proxy-server']
diff --git a/ansible/site.yml b/ansible/site.yml
index 91617fb6581bfff9ab7951a7786083486b37deb5..f5feddd349cbd9ab4524e13d1bd807b45bf1c263 100755
--- a/ansible/site.yml
+++ b/ansible/site.yml
@@ -48,10 +48,11 @@
         when: enable_keystone | bool }
 
 - hosts:
-   - swift-account-server
-   - swift-container-server
-   - swift-object-server
-   - swift-proxy-server
+    - swift-account-server
+    - swift-container-server
+    - swift-object-server
+    - swift-proxy-server
+    - rabbitmq
   roles:
     - { role: swift,
         tags: swift,
@@ -61,6 +62,7 @@
     - ceph-mon
     - glance-api
     - glance-registry
+    - rabbitmq
   roles:
     - { role: glance,
         tags: glance,
@@ -75,6 +77,7 @@
     - nova-consoleauth
     - nova-novncproxy
     - nova-scheduler
+    - rabbitmq
   roles:
     - { role: nova,
         tags: nova,
@@ -84,6 +87,7 @@
     - compute
     - neutron-agents
     - neutron-server
+    - rabbitmq
   roles:
     - { role: neutron,
         tags: neutron,
@@ -95,6 +99,7 @@
     - cinder-backup
     - cinder-scheduler
     - cinder-volume
+    - rabbitmq
   roles:
     - { role: cinder,
         tags: cinder,
@@ -104,6 +109,7 @@
     - heat-api
     - heat-api-cfn
     - heat-engine
+    - rabbitmq
   roles:
     - { role: heat,
         tags: heat,
@@ -118,6 +124,7 @@
 - hosts:
     - murano-api
     - murano-engine
+    - rabbitmq
   roles:
     - { role: murano,
         tags: murano,
@@ -128,6 +135,7 @@
     - ironic-conductor
     - ironic-discoverd
     - ironic-pxe
+    - rabbitmq
   roles:
     - { role: ironic,
         tags: ironic,