From 12ff28a69351cf8ab4ef3390739e04862ba76983 Mon Sep 17 00:00:00 2001
From: "binhong.hua" <huabinhong@unitedstack.com>
Date: Tue, 9 Apr 2019 16:55:20 +0800
Subject: [PATCH] Make kolla-ansible support extra volumes

When integrating 3rd party component into openstack with kolla-ansible,
maybe have to mount some extra volumes to container.

Change-Id: I69108209320edad4c4ffa37dabadff62d7340939
Implements: blueprint support-extra-volumes
---
 ansible/group_vars/all.yml                    |   7 +
 ansible/roles/aodh/defaults/main.yml          |  53 +++--
 ansible/roles/barbican/defaults/main.yml      |  41 ++--
 ansible/roles/blazar/defaults/main.yml        |  27 ++-
 ansible/roles/ceilometer/defaults/main.yml    |  60 +++---
 ansible/roles/cinder/defaults/main.yml        |  71 ++++---
 ansible/roles/cloudkitty/defaults/main.yml    |  26 ++-
 ansible/roles/congress/defaults/main.yml      |  39 ++--
 ansible/roles/cyborg/defaults/main.yml        |  37 ++--
 ansible/roles/designate/defaults/main.yml     |  87 ++++----
 ansible/roles/freezer/defaults/main.yml       |  31 +--
 ansible/roles/glance/defaults/main.yml        |  17 +-
 ansible/roles/haproxy/defaults/main.yml       |  24 ++-
 ansible/roles/heat/defaults/main.yml          |  38 ++--
 ansible/roles/horizon/defaults/main.yml       |  20 +-
 ansible/roles/ironic/defaults/main.yml        |  91 +++++----
 ansible/roles/keystone/defaults/main.yml      |  16 +-
 ansible/roles/kuryr/defaults/main.yml         |  21 +-
 ansible/roles/magnum/defaults/main.yml        |  28 +--
 ansible/roles/manila/defaults/main.yml        |  58 +++---
 ansible/roles/mistral/defaults/main.yml       |  50 +++--
 ansible/roles/murano/defaults/main.yml        |  26 ++-
 ansible/roles/neutron/defaults/main.yml       | 187 ++++++++++--------
 ansible/roles/nova/defaults/main.yml          | 172 +++++++++-------
 ansible/roles/octavia/defaults/main.yml       |  42 ++--
 ansible/roles/panko/defaults/main.yml         |  11 +-
 ansible/roles/placement/defaults/main.yml     |  14 +-
 ansible/roles/sahara/defaults/main.yml        |  33 ++--
 ansible/roles/senlin/defaults/main.yml        |  26 ++-
 ansible/roles/solum/defaults/main.yml         |  51 +++--
 ansible/roles/tacker/defaults/main.yml        |  27 ++-
 ansible/roles/trove/defaults/main.yml         |  44 +++--
 ansible/roles/vitrage/defaults/main.yml       |  51 +++--
 ansible/roles/watcher/defaults/main.yml       |  39 ++--
 ansible/roles/zun/defaults/main.yml           |  44 +++--
 doc/source/admin/advanced-configuration.rst   |  37 ++++
 ...upport_extra_volumes-0598122ed90c8d02.yaml |   5 +
 37 files changed, 1006 insertions(+), 645 deletions(-)
 create mode 100644 releasenotes/notes/support_extra_volumes-0598122ed90c8d02.yaml

diff --git a/ansible/group_vars/all.yml b/ansible/group_vars/all.yml
index ca1d2971e2..5d63e9d8be 100644
--- a/ansible/group_vars/all.yml
+++ b/ansible/group_vars/all.yml
@@ -122,6 +122,13 @@ docker_common_options:
 # Dimension options for Docker Containers
 default_container_dimensions: {}
 
+
+#######################
+# Extra volumes options
+#######################
+# Extra volumes for Docker Containers
+default_extra_volumes: []
+
 ####################
 # keepalived options
 ####################
diff --git a/ansible/roles/aodh/defaults/main.yml b/ansible/roles/aodh/defaults/main.yml
index 70b7f45d36..d04fe605c1 100644
--- a/ansible/roles/aodh/defaults/main.yml
+++ b/ansible/roles/aodh/defaults/main.yml
@@ -7,12 +7,7 @@ aodh_services:
     group: aodh-api
     enabled: true
     image: "{{ aodh_api_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/aodh-api/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "aodh:/var/lib/aodh/"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/aodh/aodh:/var/lib/kolla/venv/lib/python2.7/site-packages/aodh' if aodh_dev_mode | bool else '' }}"
+    volumes: "{{ aodh_api_default_volumes + aodh_api_extra_volumes }}"
     dimensions: "{{ aodh_api_dimensions }}"
     haproxy:
       aodh_api:
@@ -32,33 +27,21 @@ aodh_services:
     group: aodh-evaluator
     enabled: true
     image: "{{ aodh_evaluator_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/aodh-evaluator/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/aodh/aodh:/var/lib/kolla/venv/lib/python2.7/site-packages/aodh' if aodh_dev_mode | bool else '' }}"
+    volumes: "{{ aodh_evaluator_default_volumes + aodh_evaluator_extra_volumes }}"
     dimensions: "{{ aodh_evaluator_dimensions }}"
   aodh-listener:
     container_name: aodh_listener
     group: aodh-listener
     enabled: true
     image: "{{ aodh_listener_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/aodh-listener/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/aodh/aodh:/var/lib/kolla/venv/lib/python2.7/site-packages/aodh' if aodh_dev_mode | bool else '' }}"
+    volumes: "{{ aodh_listener_default_volumes + aodh_listener_extra_volumes }}"
     dimensions: "{{ aodh_listener_dimensions }}"
   aodh-notifier:
     container_name: aodh_notifier
     group: aodh-notifier
     enabled: true
     image: "{{ aodh_notifier_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/aodh-notifier/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/aodh/aodh:/var/lib/kolla/venv/lib/python2.7/site-packages/aodh' if aodh_dev_mode | bool else '' }}"
+    volumes: "{{ aodh_notifier_default_volumes + aodh_notifier_extra_volumes }}"
     dimensions: "{{ aodh_notifier_dimensions }}"
 
 # Aodh Evaluation interval - Period of evaluation cycle, should
@@ -115,6 +98,34 @@ aodh_evaluator_dimensions: "{{ default_container_dimensions }}"
 aodh_listener_dimensions: "{{ default_container_dimensions }}"
 aodh_notifier_dimensions: "{{ default_container_dimensions }}"
 
+aodh_api_default_volumes:
+  - "{{ node_config_directory }}/aodh-api/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "aodh:/var/lib/aodh/"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/aodh/aodh:/var/lib/kolla/venv/lib/python2.7/site-packages/aodh' if aodh_dev_mode | bool else '' }}"
+aodh_evaluator_default_volumes:
+  - "{{ node_config_directory }}/aodh-evaluator/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/aodh/aodh:/var/lib/kolla/venv/lib/python2.7/site-packages/aodh' if aodh_dev_mode | bool else '' }}"
+aodh_listener_default_volumes:
+  - "{{ node_config_directory }}/aodh-listener/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/aodh/aodh:/var/lib/kolla/venv/lib/python2.7/site-packages/aodh' if aodh_dev_mode | bool else '' }}"
+aodh_notifier_default_volumes:
+  - "{{ node_config_directory }}/aodh-notifier/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/aodh/aodh:/var/lib/kolla/venv/lib/python2.7/site-packages/aodh' if aodh_dev_mode | bool else '' }}"
+
+aodh_extra_volumes: "{{ default_extra_volumes }}"
+aodh_api_extra_volumes: "{{ aodh_extra_volumes }}"
+aodh_evaluator_extra_volumes: "{{ aodh_extra_volumes }}"
+aodh_listener_extra_volumes: "{{ aodh_extra_volumes }}"
+aodh_notifier_extra_volumes: "{{ aodh_extra_volumes }}"
+
 ####################
 # OpenStack
 ####################
diff --git a/ansible/roles/barbican/defaults/main.yml b/ansible/roles/barbican/defaults/main.yml
index e9d62b8c6d..4f4d58d6a2 100644
--- a/ansible/roles/barbican/defaults/main.yml
+++ b/ansible/roles/barbican/defaults/main.yml
@@ -7,12 +7,7 @@ barbican_services:
     group: barbican-api
     enabled: true
     image: "{{ barbican_api_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/barbican-api/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "barbican:/var/lib/barbican/"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/barbican/barbican:/var/lib/kolla/venv/lib/python2.7/site-packages/barbican' if barbican_dev_mode | bool else '' }}"
+    volumes: "{{ barbican_api_default_volumes + barbican_api_extra_volumes }}"
     dimensions: "{{ barbican_api_dimensions }}"
     haproxy:
       barbican_api:
@@ -32,22 +27,14 @@ barbican_services:
     group: barbican-keystone-listener
     enabled: true
     image: "{{ barbican_keystone_listener_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/barbican-keystone-listener/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/barbican/barbican:/var/lib/kolla/venv/lib/python2.7/site-packages/barbican' if barbican_dev_mode | bool else '' }}"
+    volumes: "{{ barbican_keystone_listener_default_volumes + barbican_keystone_listener_extra_volumes }}"
     dimensions: "{{ barbican_keystone_listener_dimensions }}"
   barbican-worker:
     container_name: barbican_worker
     group: barbican-worker
     enabled: true
     image: "{{ barbican_worker_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/barbican-worker/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/barbican/barbican:/var/lib/kolla/venv/lib/python2.7/site-packages/barbican' if barbican_dev_mode | bool else '' }}"
+    volumes: "{{ barbican_worker_default_volumes + barbican_worker_extra_volumes }}"
     dimensions: "{{ barbican_worker_dimensions }}"
 
 
@@ -81,6 +68,28 @@ barbican_api_dimensions: "{{ default_container_dimensions }}"
 barbican_keystone_listener_dimensions: "{{ default_container_dimensions }}"
 barbican_worker_dimensions: "{{ default_container_dimensions }}"
 
+barbican_api_default_volumes:
+  - "{{ node_config_directory }}/barbican-api/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "barbican:/var/lib/barbican/"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/barbican/barbican:/var/lib/kolla/venv/lib/python2.7/site-packages/barbican' if barbican_dev_mode | bool else '' }}"
+barbican_keystone_listener_default_volumes:
+  - "{{ node_config_directory }}/barbican-keystone-listener/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/barbican/barbican:/var/lib/kolla/venv/lib/python2.7/site-packages/barbican' if barbican_dev_mode | bool else '' }}"
+barbican_worker_default_volumes:
+  - "{{ node_config_directory }}/barbican-worker/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/barbican/barbican:/var/lib/kolla/venv/lib/python2.7/site-packages/barbican' if barbican_dev_mode | bool else '' }}"
+
+barbican_extra_volumes: "{{ default_extra_volumes }}"
+barbican_api_extra_volumes: "{{ barbican_extra_volumes }}"
+barbican_keystone_listener_extra_volumes: "{{ barbican_extra_volumes }}"
+barbican_worker_extra_volumes: "{{ barbican_extra_volumes }}"
+
 ####################
 # OpenStack
 ####################
diff --git a/ansible/roles/blazar/defaults/main.yml b/ansible/roles/blazar/defaults/main.yml
index 2c4271d4b6..b919bb9d8e 100644
--- a/ansible/roles/blazar/defaults/main.yml
+++ b/ansible/roles/blazar/defaults/main.yml
@@ -7,11 +7,7 @@ blazar_services:
     group: blazar-api
     enabled: true
     image: "{{ blazar_api_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/blazar-api/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/blazar/blazar:/var/lib/kolla/venv/lib/python2.7/site-packages/blazar' if blazar_dev_mode | bool else '' }}"
+    volumes: "{{ blazar_api_default_volumes + blazar_api_extra_volumes }}"
     dimensions: "{{ blazar_api_dimensions }}"
     haproxy:
       blazar_api:
@@ -29,11 +25,7 @@ blazar_services:
     group: blazar-manager
     enabled: true
     image: "{{ blazar_manager_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/blazar-manager/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/blazar/blazar:/var/lib/kolla/venv/lib/python2.7/site-packages/blazar' if blazar_dev_mode | bool else '' }}"
+    volumes: "{{ blazar_manager_default_volumes + blazar_manager_extra_volumes }}"
     dimensions: "{{ blazar_manager_dimensions }}"
 
 
@@ -67,6 +59,21 @@ blazar_api_image_full: "{{ blazar_api_image }}:{{ blazar_api_tag }}"
 blazar_api_dimensions: "{{ default_container_dimensions }}"
 blazar_manager_dimensions: "{{ default_container_dimensions }}"
 
+blazar_api_default_volumes:
+  - "{{ node_config_directory }}/blazar-api/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/blazar/blazar:/var/lib/kolla/venv/lib/python2.7/site-packages/blazar' if blazar_dev_mode | bool else '' }}"
+blazar_manager_default_volumes:
+  - "{{ node_config_directory }}/blazar-manager/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/blazar/blazar:/var/lib/kolla/venv/lib/python2.7/site-packages/blazar' if blazar_dev_mode | bool else '' }}"
+
+blazar_extra_volumes: "{{ default_extra_volumes }}"
+blazar_api_extra_volumes: "{{ blazar_extra_volumes }}"
+blazar_manager_extra_volumes: "{{ blazar_extra_volumes }}"
+
 ####################
 # OpenStack
 ####################
diff --git a/ansible/roles/ceilometer/defaults/main.yml b/ansible/roles/ceilometer/defaults/main.yml
index 05cfe730e6..89a23ce773 100644
--- a/ansible/roles/ceilometer/defaults/main.yml
+++ b/ansible/roles/ceilometer/defaults/main.yml
@@ -7,23 +7,14 @@ ceilometer_services:
     group: ceilometer-notification
     enabled: True
     image: "{{ ceilometer_notification_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/ceilometer-notification/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/ceilometer/ceilometer:/var/lib/kolla/venv/lib/python2.7/site-packages/ceilometer' if ceilometer_dev_mode | bool else '' }}"
+    volumes: "{{ ceilometer_notification_default_volumes + ceilometer_notification_extra_volumes }}"
     dimensions: "{{ ceilometer_notification_dimensions }}"
   ceilometer-central:
     container_name: ceilometer_central
     group: ceilometer-central
     enabled: True
     image: "{{ ceilometer_central_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/ceilometer-central/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "ceilometer:/var/lib/ceilometer/"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/ceilometer/ceilometer:/var/lib/kolla/venv/lib/python2.7/site-packages/ceilometer' if ceilometer_dev_mode | bool else '' }}"
+    volumes: "{{ ceilometer_central_default_volumes + ceilometer_central_extra_volumes }}"
     dimensions: "{{ ceilometer_central_dimensions }}"
   ceilometer-compute:
     container_name: ceilometer_compute
@@ -31,26 +22,14 @@ ceilometer_services:
     enabled: True
     privileged: True
     image: "{{ ceilometer_compute_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/ceilometer-compute/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "/run/:/run/:shared"
-      - "ceilometer:/var/lib/ceilometer/"
-      - "kolla_logs:/var/log/kolla/"
-      - "nova_libvirt:/var/lib/libvirt"
-      - "{{ kolla_dev_repos_directory ~ '/ceilometer/ceilometer:/var/lib/kolla/venv/lib/python2.7/site-packages/ceilometer' if ceilometer_dev_mode | bool else '' }}"
+    volumes: "{{ ceilometer_compute_default_volumes + ceilometer_compute_extra_volumes }}"
     dimensions: "{{ ceilometer_compute_dimensions }}"
   ceilometer-ipmi:
     container_name: ceilometer_ipmi
     group: ceilometer-ipmi
     enabled: "{{ enable_ceilometer_ipmi }}"
     image: "{{ ceilometer_ipmi_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/ceilometer-ipmi/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "ceilometer:/var/lib/ceilometer/"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/ceilometer/ceilometer:/var/lib/kolla/venv/lib/python2.7/site-packages/ceilometer' if ceilometer_dev_mode | bool else '' }}"
+    volumes: "{{ ceilometer_ipmi_default_volumes + ceilometer_ipmi_extra_volumes }}"
     dimensions: "{{ ceilometer_ipmi_dimensions }}"
 
 
@@ -81,6 +60,37 @@ ceilometer_central_dimensions: "{{ default_container_dimensions }}"
 ceilometer_compute_dimensions: "{{ default_container_dimensions }}"
 ceilometer_ipmi_dimensions: "{{ default_container_dimensions }}"
 
+ceilometer_notification_default_volumes:
+  - "{{ node_config_directory }}/ceilometer-notification/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/ceilometer/ceilometer:/var/lib/kolla/venv/lib/python2.7/site-packages/ceilometer' if ceilometer_dev_mode | bool else '' }}"
+ceilometer_central_default_volumes:
+  - "{{ node_config_directory }}/ceilometer-central/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "ceilometer:/var/lib/ceilometer/"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/ceilometer/ceilometer:/var/lib/kolla/venv/lib/python2.7/site-packages/ceilometer' if ceilometer_dev_mode | bool else '' }}"
+ceilometer_compute_default_volumes:
+  - "{{ node_config_directory }}/ceilometer-compute/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "/run/:/run/:shared"
+  - "ceilometer:/var/lib/ceilometer/"
+  - "kolla_logs:/var/log/kolla/"
+  - "nova_libvirt:/var/lib/libvirt"
+  - "{{ kolla_dev_repos_directory ~ '/ceilometer/ceilometer:/var/lib/kolla/venv/lib/python2.7/site-packages/ceilometer' if ceilometer_dev_mode | bool else '' }}"
+ceilometer_ipmi_default_volumes:
+  - "{{ node_config_directory }}/ceilometer-ipmi/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "ceilometer:/var/lib/ceilometer/"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/ceilometer/ceilometer:/var/lib/kolla/venv/lib/python2.7/site-packages/ceilometer' if ceilometer_dev_mode | bool else '' }}"
+
+ceilometer_extra_volumes: "{{ default_extra_volumes }}"
+ceilometer_notification_extra_volumes: "{{ ceilometer_extra_volumes }}"
+ceilometer_central_extra_volumes: "{{ ceilometer_extra_volumes }}"
+ceilometer_compute_extra_volumes: "{{ ceilometer_extra_volumes }}"
+ceilometer_ipmi_extra_volumes: "{{ ceilometer_extra_volumes }}"
 
 ####################
 # OpenStack
diff --git a/ansible/roles/cinder/defaults/main.yml b/ansible/roles/cinder/defaults/main.yml
index d8441254de..b88f3ce1af 100644
--- a/ansible/roles/cinder/defaults/main.yml
+++ b/ansible/roles/cinder/defaults/main.yml
@@ -7,11 +7,7 @@ cinder_services:
     group: cinder-api
     enabled: true
     image: "{{ cinder_api_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/cinder-api/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/cinder/cinder:/var/lib/kolla/venv/lib/python2.7/site-packages/cinder' if cinder_dev_mode | bool else '' }}"
+    volumes: "{{ cinder_api_default_volumes + cinder_api_extra_volumes }}"
     dimensions: "{{ cinder_api_dimensions }}"
     haproxy:
       cinder_api:
@@ -31,11 +27,7 @@ cinder_services:
     group: cinder-scheduler
     enabled: true
     image: "{{ cinder_scheduler_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/cinder-scheduler/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/cinder/cinder:/var/lib/kolla/venv/lib/python2.7/site-packages/cinder' if cinder_dev_mode | bool else '' }}"
+    volumes: "{{ cinder_scheduler_default_volumes + cinder_scheduler_extra_volumes }}"
     dimensions: "{{ cinder_scheduler_dimensions }}"
   cinder-volume:
     container_name: cinder_volume
@@ -44,17 +36,7 @@ cinder_services:
     image: "{{ cinder_volume_image_full }}"
     privileged: True
     ipc_mode: "host"
-    volumes:
-      - "{{ node_config_directory }}/cinder-volume/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "/dev/:/dev/"
-      - "/lib/modules:/lib/modules:ro"
-      - "/run/:/run/:shared"
-      - "cinder:/var/lib/cinder"
-      - "{% if enable_iscsid | bool %}iscsi_info:/etc/iscsi{% endif %}"
-      - "{% if enable_cinder_backend_lvm | bool and cinder_target_helper == 'lioadm' %}target_config:/etc/target{% endif %}"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/cinder/cinder:/var/lib/kolla/venv/lib/python2.7/site-packages/cinder' if cinder_dev_mode | bool else '' }}"
+    volumes: "{{ cinder_volume_default_volumes + cinder_volume_extra_volumes }}"
     dimensions: "{{ cinder_volume_dimensions }}"
   cinder-backup:
     container_name: cinder_backup
@@ -62,15 +44,7 @@ cinder_services:
     enabled: "{{ enable_cinder_backup | bool }}"
     image: "{{ cinder_backup_image_full }}"
     privileged: True
-    volumes:
-      - "{{ node_config_directory }}/cinder-backup/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "/dev/:/dev/"
-      - "/run/:/run/:shared"
-      - "cinder:/var/lib/cinder"
-      - "{% if enable_iscsid | bool %}iscsi_info:/etc/iscsi{% endif %}"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/cinder/cinder:/var/lib/kolla/venv/lib/python2.7/site-packages/cinder' if cinder_dev_mode | bool else '' }}"
+    volumes: "{{ cinder_backup_default_volumes + cinder_backup_extra_volumes }}"
     dimensions: "{{ cinder_backup_dimensions }}"
 
 ####################
@@ -152,6 +126,43 @@ cinder_backup_dimensions: "{{ default_container_dimensions }}"
 cinder_scheduler_dimensions: "{{ default_container_dimensions }}"
 cinder_volume_dimensions: "{{ default_container_dimensions }}"
 
+cinder_api_default_volumes:
+  - "{{ node_config_directory }}/cinder-api/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/cinder/cinder:/var/lib/kolla/venv/lib/python2.7/site-packages/cinder' if cinder_dev_mode | bool else '' }}"
+cinder_backup_default_volumes:
+  - "{{ node_config_directory }}/cinder-backup/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "/dev/:/dev/"
+  - "/run/:/run/:shared"
+  - "cinder:/var/lib/cinder"
+  - "{% if enable_iscsid | bool %}iscsi_info:/etc/iscsi{% endif %}"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/cinder/cinder:/var/lib/kolla/venv/lib/python2.7/site-packages/cinder' if cinder_dev_mode | bool else '' }}"
+cinder_scheduler_default_volumes:
+  - "{{ node_config_directory }}/cinder-scheduler/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/cinder/cinder:/var/lib/kolla/venv/lib/python2.7/site-packages/cinder' if cinder_dev_mode | bool else '' }}"
+cinder_volume_default_volumes:
+  - "{{ node_config_directory }}/cinder-volume/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "/dev/:/dev/"
+  - "/lib/modules:/lib/modules:ro"
+  - "/run/:/run/:shared"
+  - "cinder:/var/lib/cinder"
+  - "{% if enable_iscsid | bool %}iscsi_info:/etc/iscsi{% endif %}"
+  - "{% if enable_cinder_backend_lvm | bool and cinder_target_helper == 'lioadm' %}target_config:/etc/target{% endif %}"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/cinder/cinder:/var/lib/kolla/venv/lib/python2.7/site-packages/cinder' if cinder_dev_mode | bool else '' }}"
+
+cinder_extra_volumes: "{{ default_extra_volumes }}"
+cinder_api_extra_volumes: "{{ cinder_extra_volumes }}"
+cinder_backup_extra_volumes: "{{ cinder_extra_volumes }}"
+cinder_scheduler_extra_volumes: "{{ cinder_extra_volumes }}"
+cinder_volume_extra_volumes: "{{ cinder_extra_volumes }}"
+
 ####################
 # OpenStack
 ####################
diff --git a/ansible/roles/cloudkitty/defaults/main.yml b/ansible/roles/cloudkitty/defaults/main.yml
index 663720adf6..96b5541c0c 100644
--- a/ansible/roles/cloudkitty/defaults/main.yml
+++ b/ansible/roles/cloudkitty/defaults/main.yml
@@ -7,11 +7,7 @@ cloudkitty_services:
     group: "cloudkitty-api"
     image: "{{ cloudkitty_api_image_full }}"
     enabled: True
-    volumes:
-      - "{{ node_config_directory }}/cloudkitty-api/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/cloudkitty/cloudkitty:/var/lib/kolla/venv/lib/python2.7/site-packages/cloudkitty' if cloudkitty_dev_mode | bool else '' }}"
+    volumes: "{{ cloudkitty_api_default_volumes + cloudkitty_api_extra_volumes }}"
     dimensions: "{{ cloudkitty_api_dimensions }}"
     haproxy:
       cloudkitty_api:
@@ -29,11 +25,7 @@ cloudkitty_services:
     group: "cloudkitty-processor"
     image: "{{ cloudkitty_processor_image_full }}"
     enabled: True
-    volumes:
-      - "{{ node_config_directory }}/cloudkitty-processor/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/cloudkitty/cloudkitty:/var/lib/kolla/venv/lib/python2.7/site-packages/cloudkitty' if cloudkitty_dev_mode | bool else '' }}"
+    volumes: "{{ cloudkitty_processor_default_volumes + cloudkitty_processor_extra_volumes }}"
     dimensions: "{{ cloudkitty_processor_dimensions }}"
 
 
@@ -62,6 +54,20 @@ cloudkitty_processor_image_full: "{{ cloudkitty_processor_image }}:{{ cloudkitty
 cloudkitty_processor_dimensions: "{{ default_container_dimensions }}"
 cloudkitty_api_dimensions: "{{ default_container_dimensions }}"
 
+cloudkitty_api_default_volumes:
+  - "{{ node_config_directory }}/cloudkitty-api/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/cloudkitty/cloudkitty:/var/lib/kolla/venv/lib/python2.7/site-packages/cloudkitty' if cloudkitty_dev_mode | bool else '' }}"
+cloudkitty_processor_default_volumes:
+  - "{{ node_config_directory }}/cloudkitty-processor/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/cloudkitty/cloudkitty:/var/lib/kolla/venv/lib/python2.7/site-packages/cloudkitty' if cloudkitty_dev_mode | bool else '' }}"
+
+cloudkitty_extra_volumes: "{{ default_extra_volumes }}"
+cloudkitty_processor_extra_volumes: "{{ cloudkitty_extra_volumes }}"
+cloudkitty_api_extra_volumes: "{{ cloudkitty_extra_volumes }}"
 
 ####################
 # OpenStack
diff --git a/ansible/roles/congress/defaults/main.yml b/ansible/roles/congress/defaults/main.yml
index 1a6af4d1db..4675f656d1 100644
--- a/ansible/roles/congress/defaults/main.yml
+++ b/ansible/roles/congress/defaults/main.yml
@@ -7,11 +7,7 @@ congress_services:
     group: congress-api
     enabled: true
     image: "{{ congress_api_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/congress-api/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/congress/congress:/var/lib/kolla/venv/lib/python2.7/site-packages/congress' if congress_dev_mode | bool else '' }}"
+    volumes: "{{ congress_api_default_volumes + congress_api_extra_volumes }}"
     dimensions: "{{ congress_api_dimensions }}"
     haproxy:
       congress_api:
@@ -29,22 +25,14 @@ congress_services:
     group: congress-policy-engine
     enabled: true
     image: "{{ congress_policy_engine_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/congress-policy-engine/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/congress/congress:/var/lib/kolla/venv/lib/python2.7/site-packages/congress' if congress_dev_mode | bool else '' }}"
+    volumes: "{{ congress_policy_engine_default_volumes + congress_policy_engine_extra_volumes }}"
     dimensions: "{{ congress_policy_engine_dimensions }}"
   congress-datasource:
     container_name: congress_datasource
     group: congress-datasource
     enabled: true
     image: "{{ congress_datasource_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/congress-datasource/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/congress/congress:/var/lib/kolla/venv/lib/python2.7/site-packages/congress' if congress_dev_mode | bool else '' }}"
+    volumes: "{{ congress_datasource_default_volumes + congress_datasource_extra_volumes }}"
     dimensions: "{{ congress_datasource_dimensions }}"
 
 
@@ -78,6 +66,27 @@ congress_api_dimensions: "{{ default_container_dimensions }}"
 congress_policy_engine_dimensions: "{{ default_container_dimensions }}"
 congress_datasource_dimensions: "{{ default_container_dimensions }}"
 
+congress_api_default_volumes:
+  - "{{ node_config_directory }}/congress-api/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/congress/congress:/var/lib/kolla/venv/lib/python2.7/site-packages/congress' if congress_dev_mode | bool else '' }}"
+congress_policy_engine_default_volumes:
+  - "{{ node_config_directory }}/congress-policy-engine/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/congress/congress:/var/lib/kolla/venv/lib/python2.7/site-packages/congress' if congress_dev_mode | bool else '' }}"
+congress_datasource_default_volumes:
+  - "{{ node_config_directory }}/congress-datasource/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/congress/congress:/var/lib/kolla/venv/lib/python2.7/site-packages/congress' if congress_dev_mode | bool else '' }}"
+
+congress_extra_volumes: "{{ default_extra_volumes }}"
+congress_api_extra_volumes: "{{ congress_extra_volumes }}"
+congress_policy_engine_extra_volumes: "{{ congress_extra_volumes }}"
+congress_datasource_extra_volumes: "{{ congress_extra_volumes }}"
+
 ####################
 # OpenStack
 ####################
diff --git a/ansible/roles/cyborg/defaults/main.yml b/ansible/roles/cyborg/defaults/main.yml
index 92b941f5ae..4bb3a469ea 100644
--- a/ansible/roles/cyborg/defaults/main.yml
+++ b/ansible/roles/cyborg/defaults/main.yml
@@ -7,31 +7,21 @@ cyborg_services:
     group: cyborg-api
     enabled: true
     image: "{{ cyborg_api_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/cyborg-api/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "cyborg:/var/lib/cyborg/"
-      - "kolla_logs:/var/log/kolla/"
+    volumes: "{{ cyborg_api_default_volumes + cyborg_api_extra_volumes }}"
     dimensions: "{{ cyborg_api_dimensions }}"
   cyborg-agent:
     container_name: cyborg_agent
     group: cyborg-agent
     enabled: true
     image: "{{ cyborg_agent_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/cyborg-agent/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
+    volumes: "{{ cyborg_agent_default_volumes + cyborg_agent_extra_volumes }}"
     dimensions: "{{ cyborg_agent_dimensions }}"
   cyborg-conductor:
     container_name: cyborg_conductor
     group: cyborg-conductor
     enabled: true
     image: "{{ cyborg_conductor_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/cyborg-conductor/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
+    volumes: "{{ cyborg_conductor_default_volumes + cyborg_conductor_extra_volumes }}"
     dimensions: "{{ cyborg_conductor_dimensions }}"
 
 ####################
@@ -63,6 +53,27 @@ cyborg_api_dimensions: "{{ default_container_dimensions }}"
 cyborg_agent_dimensions: "{{ default_container_dimensions }}"
 cyborg_conductor_dimensions: "{{ default_container_dimensions }}"
 
+cyborg_api_default_volumes:
+  - "{{ node_config_directory }}/cyborg-api/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "cyborg:/var/lib/cyborg/"
+  - "kolla_logs:/var/log/kolla/"
+
+cyborg_agent_default_volumes:
+  - "{{ node_config_directory }}/cyborg-agent/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+
+cyborg_conductor_default_volumes:
+  - "{{ node_config_directory }}/cyborg-conductor/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+
+cyborg_extra_volumes: "{{ default_extra_volumes }}"
+cyborg_api_extra_volumes: "{{ cyborg_extra_volumes }}"
+cyborg_agent_extra_volumes: "{{ cyborg_extra_volumes }}"
+cyborg_conductor_extra_volumes: "{{ cyborg_extra_volumes }}"
+
 ####################
 # OpenStack
 ####################
diff --git a/ansible/roles/designate/defaults/main.yml b/ansible/roles/designate/defaults/main.yml
index f88c916bf6..c4742a885a 100644
--- a/ansible/roles/designate/defaults/main.yml
+++ b/ansible/roles/designate/defaults/main.yml
@@ -7,11 +7,7 @@ designate_services:
     group: designate-api
     enabled: true
     image: "{{ designate_api_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/designate-api/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/designate/designate:/var/lib/kolla/venv/lib/python2.7/site-packages/designate' if designate_dev_mode | bool else '' }}"
+    volumes: "{{ designate_api_default_volumes + designate_api_extra_volumes }}"
     dimensions: "{{ designate_api_dimensions }}"
     haproxy:
       designate_api:
@@ -31,66 +27,42 @@ designate_services:
     group: designate-backend-bind9
     enabled: "{{ designate_backend == 'bind9' }}"
     image: "{{ designate_backend_bind9_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/designate-backend-bind9/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "designate_backend_bind9:/var/lib/named/"
+    volumes: "{{ designate_backend_bind9_default_volumes + designate_backend_bind9_extra_volumes }}"
     dimensions: "{{ designate_backend_bind9_dimensions }}"
   designate-central:
     container_name: designate_central
     group: designate-central
     enabled: true
     image: "{{ designate_central_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/designate-central/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/designate/designate:/var/lib/kolla/venv/lib/python2.7/site-packages/designate' if designate_dev_mode | bool else '' }}"
+    volumes: "{{ designate_central_default_volumes + designate_central_extra_volumes }}"
     dimensions: "{{ designate_central_dimensions }}"
   designate-mdns:
     container_name: designate_mdns
     group: designate-mdns
     enabled: true
     image: "{{ designate_mdns_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/designate-mdns/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/designate/designate:/var/lib/kolla/venv/lib/python2.7/site-packages/designate' if designate_dev_mode | bool else '' }}"
+    volumes: "{{ designate_mdns_default_volumes + designate_mdns_extra_volumes }}"
     dimensions: "{{ designate_mdns_dimensions }}"
   designate-producer:
     container_name: designate_producer
     group: designate-producer
     enabled: true
     image: "{{ designate_producer_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/designate-producer/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/designate/designate:/var/lib/kolla/venv/lib/python2.7/site-packages/designate' if designate_dev_mode | bool else '' }}"
+    volumes: "{{ designate_producer_default_volumes + designate_producer_extra_volumes }}"
     dimensions: "{{ designate_producer_dimensions }}"
   designate-worker:
     container_name: designate_worker
     group: designate-worker
     enabled: true
     image: "{{ designate_worker_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/designate-worker/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/designate/designate:/var/lib/kolla/venv/lib/python2.7/site-packages/designate' if designate_dev_mode | bool else '' }}"
+    volumes: "{{ designate_worker_default_volumes + designate_worker_extra_volumes }}"
     dimensions: "{{ designate_worker_dimensions }}"
   designate-sink:
     container_name: designate_sink
     group: designate-sink
     enabled: true
     image: "{{ designate_sink_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/designate-sink/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/designate/designate:/var/lib/kolla/venv/lib/python2.7/site-packages/designate' if designate_dev_mode | bool else '' }}"
+    volumes: "{{ designate_sink_default_volumes + designate_sink_extra_volumes }}"
     dimensions: "{{ designate_sink_dimensions }}"
 
 
@@ -148,6 +120,51 @@ designate_producer_dimensions: "{{ default_container_dimensions }}"
 designate_worker_dimensions: "{{ default_container_dimensions }}"
 designate_sink_dimensions: "{{ default_container_dimensions }}"
 
+designate_api_default_volumes:
+  - "{{ node_config_directory }}/designate-api/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/designate/designate:/var/lib/kolla/venv/lib/python2.7/site-packages/designate' if designate_dev_mode | bool else '' }}"
+designate_backend_bind9_default_volumes:
+  - "{{ node_config_directory }}/designate-backend-bind9/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "designate_backend_bind9:/var/lib/named/"
+designate_central_default_volumes:
+  - "{{ node_config_directory }}/designate-central/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/designate/designate:/var/lib/kolla/venv/lib/python2.7/site-packages/designate' if designate_dev_mode | bool else '' }}"
+designate_mdns_default_volumes:
+  - "{{ node_config_directory }}/designate-mdns/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/designate/designate:/var/lib/kolla/venv/lib/python2.7/site-packages/designate' if designate_dev_mode | bool else '' }}"
+designate_producer_default_volumes:
+  - "{{ node_config_directory }}/designate-producer/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/designate/designate:/var/lib/kolla/venv/lib/python2.7/site-packages/designate' if designate_dev_mode | bool else '' }}"
+designate_worker_default_volumes:
+  - "{{ node_config_directory }}/designate-worker/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/designate/designate:/var/lib/kolla/venv/lib/python2.7/site-packages/designate' if designate_dev_mode | bool else '' }}"
+designate_sink_default_volumes:
+  - "{{ node_config_directory }}/designate-sink/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/designate/designate:/var/lib/kolla/venv/lib/python2.7/site-packages/designate' if designate_dev_mode | bool else '' }}"
+
+designate_extra_volumes: "{{ default_extra_volumes }}"
+designate_api_extra_volumes: "{{ designate_extra_volumes }}"
+designate_backend_bind9_extra_volumes: "{{ designate_extra_volumes }}"
+designate_central_extra_volumes: "{{ designate_extra_volumes }}"
+designate_mdns_extra_volumes: "{{ designate_extra_volumes }}"
+designate_producer_extra_volumes: "{{ designate_extra_volumes }}"
+designate_worker_extra_volumes: "{{ designate_extra_volumes }}"
+designate_sink_extra_volumes: "{{ designate_extra_volumes }}"
+
 ####################
 # OpenStack
 ####################
diff --git a/ansible/roles/freezer/defaults/main.yml b/ansible/roles/freezer/defaults/main.yml
index 2c19a7edfe..a9df2d9cfa 100644
--- a/ansible/roles/freezer/defaults/main.yml
+++ b/ansible/roles/freezer/defaults/main.yml
@@ -7,12 +7,7 @@ freezer_services:
     group: freezer-api
     enabled: true
     image: "{{ freezer_api_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/freezer-api/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "freezer:/var/lib/freezer/"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/freezer-api/freezer_api:/var/lib/kolla/venv/lib/python2.7/site-packages/freezer_api' if freezer_dev_mode | bool else '' }}"
+    volumes: "{{ freezer_api_default_volumes + freezer_api_extra_volumes }}"
     dimensions: "{{ freezer_api_dimensions }}"
     haproxy:
       freezer_api:
@@ -30,12 +25,7 @@ freezer_services:
     group: freezer-scheduler
     enabled: true
     image: "{{ freezer_scheduler_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/freezer-scheduler/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "freezer:/var/lib/freezer/"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/freezer/freezer:/var/lib/kolla/venv/lib/python2.7/site-packages/freezer' if freezer_dev_mode | bool else '' }}"
+    volumes: "{{ freezer_scheduler_default_volumes + freezer_scheduler_extra_volumes }}"
     dimensions: "{{ freezer_scheduler_dimensions }}"
 
 
@@ -56,6 +46,23 @@ freezer_scheduler_image_full: "{{ freezer_scheduler_image }}:{{ freezer_schedule
 freezer_api_dimensions: "{{ default_container_dimensions }}"
 freezer_scheduler_dimensions: "{{ default_container_dimensions }}"
 
+freezer_api_default_volumes:
+  - "{{ node_config_directory }}/freezer-api/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "freezer:/var/lib/freezer/"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/freezer-api/freezer_api:/var/lib/kolla/venv/lib/python2.7/site-packages/freezer_api' if freezer_dev_mode | bool else '' }}"
+freezer_scheduler_default_volumes:
+  - "{{ node_config_directory }}/freezer-scheduler/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "freezer:/var/lib/freezer/"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/freezer/freezer:/var/lib/kolla/venv/lib/python2.7/site-packages/freezer' if freezer_dev_mode | bool else '' }}"
+
+freezer_extra_volumes: "{{ default_extra_volumes }}"
+freezer_api_extra_volumes: "{{ freezer_extra_volumes }}"
+freezer_scheduler_extra_volumes: "{{ freezer_extra_volumes }}"
+
 ####################
 # OpenStack
 ####################
diff --git a/ansible/roles/glance/defaults/main.yml b/ansible/roles/glance/defaults/main.yml
index f417edaed7..fc551a1ad6 100644
--- a/ansible/roles/glance/defaults/main.yml
+++ b/ansible/roles/glance/defaults/main.yml
@@ -8,12 +8,7 @@ glance_services:
     enabled: true
     image: "{{ glance_api_image_full }}"
     environment: "{{ container_proxy }}"
-    volumes:
-      - "{{ node_config_directory }}/glance-api/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "{{ glance_file_datadir_volume }}:/var/lib/glance/"
-      - "{{ kolla_dev_repos_directory ~ '/glance/glance:/var/lib/kolla/venv/lib/python2.7/site-packages/glance' if glance_dev_mode | bool else '' }}"
-      - "kolla_logs:/var/log/kolla/"
+    volumes: "{{ glance_api_default_volumes + glance_api_extra_volumes }}"
     dimensions: "{{ glance_api_dimensions }}"
     haproxy:
       glance_api:
@@ -100,8 +95,16 @@ glance_api_tag: "{{ glance_tag }}"
 glance_api_image_full: "{{ glance_api_image }}:{{ glance_api_tag }}"
 
 glance_api_dimensions: "{{ default_container_dimensions }}"
-glance_registry_dimensions: "{{ default_container_dimensions }}"
 
+glance_api_default_volumes:
+  - "{{ node_config_directory }}/glance-api/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "{{ glance_file_datadir_volume }}:/var/lib/glance/"
+  - "{{ kolla_dev_repos_directory ~ '/glance/glance:/var/lib/kolla/venv/lib/python2.7/site-packages/glance' if glance_dev_mode | bool else '' }}"
+  - "kolla_logs:/var/log/kolla/"
+
+glance_extra_volumes: "{{ default_extra_volumes }}"
+glance_api_extra_volumes: "{{ glance_extra_volumes }}"
 
 ####################
 # Glance
diff --git a/ansible/roles/haproxy/defaults/main.yml b/ansible/roles/haproxy/defaults/main.yml
index 970f2c1d41..ffd50e0e14 100644
--- a/ansible/roles/haproxy/defaults/main.yml
+++ b/ansible/roles/haproxy/defaults/main.yml
@@ -8,10 +8,7 @@ haproxy_services:
     enabled: true
     image: "{{ haproxy_image_full }}"
     privileged: True
-    volumes:
-      - "{{ node_config_directory }}/haproxy/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "haproxy_socket:/var/lib/kolla/haproxy/"
+    volumes: "{{ haproxy_default_volumes + haproxy_extra_volumes }}"
     dimensions: "{{ haproxy_dimensions }}"
   keepalived:
     container_name: keepalived
@@ -19,11 +16,7 @@ haproxy_services:
     enabled: "{{ enable_keepalived | bool }}"
     image: "{{ keepalived_image_full }}"
     privileged: True
-    volumes:
-      - "{{ node_config_directory }}/keepalived/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "/lib/modules:/lib/modules:ro"
-      - "haproxy_socket:/var/lib/kolla/haproxy/"
+    volumes: "{{ keepalived_default_volumes + keepalived_extra_volumes }}"
     dimensions: "{{ keepalived_dimensions }}"
 
 
@@ -52,6 +45,19 @@ haproxy_process_cpu_map: "no"
 haproxy_dimensions: "{{ default_container_dimensions }}"
 keepalived_dimensions: "{{ default_container_dimensions }}"
 
+haproxy_default_volumes:
+  - "{{ node_config_directory }}/haproxy/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "haproxy_socket:/var/lib/kolla/haproxy/"
+keepalived_default_volumes:
+  - "{{ node_config_directory }}/keepalived/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "/lib/modules:/lib/modules:ro"
+  - "haproxy_socket:/var/lib/kolla/haproxy/"
+
+haproxy_extra_volumes: "{{ default_extra_volumes }}"
+keepalived_extra_volumes: "{{ default_extra_volumes }}"
+
 # Default timeout values
 haproxy_http_request_timeout: "10s"
 haproxy_queue_timeout: "1m"
diff --git a/ansible/roles/heat/defaults/main.yml b/ansible/roles/heat/defaults/main.yml
index 7bb7669a76..2e4455d67c 100644
--- a/ansible/roles/heat/defaults/main.yml
+++ b/ansible/roles/heat/defaults/main.yml
@@ -7,11 +7,7 @@ heat_services:
     group: heat-api
     enabled: true
     image: "{{ heat_api_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/heat-api/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "{{ kolla_dev_repos_directory ~ '/heat/heat:/var/lib/kolla/venv/lib/python2.7/site-packages/heat' if heat_dev_mode | bool else '' }}"
-      - "kolla_logs:/var/log/kolla/"
+    volumes: "{{ heat_api_default_volumes + heat_api_extra_volumes }}"
     dimensions: "{{ heat_api_dimensions }}"
     haproxy:
       heat_api:
@@ -31,11 +27,7 @@ heat_services:
     group: heat-api-cfn
     enabled: true
     image: "{{ heat_api_cfn_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/heat-api-cfn/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "{{ kolla_dev_repos_directory ~ '/heat/heat:/var/lib/kolla/venv/lib/python2.7/site-packages/heat' if heat_dev_mode | bool else '' }}"
-      - "kolla_logs:/var/log/kolla/"
+    volumes: "{{ heat_api_cfn_default_volumes + heat_api_cfn_extra_volumes }}"
     dimensions: "{{ heat_api_cfn_dimensions }}"
     haproxy:
       heat_api_cfn:
@@ -55,11 +47,7 @@ heat_services:
     group: heat-engine
     enabled: true
     image: "{{ heat_engine_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/heat-engine/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "{{ kolla_dev_repos_directory ~ '/heat/heat:/var/lib/kolla/venv/lib/python2.7/site-packages/heat' if heat_dev_mode | bool else '' }}"
-      - "kolla_logs:/var/log/kolla/"
+    volumes: "{{ heat_engine_default_volumes + heat_engine_extra_volumes }}"
     dimensions: "{{ heat_engine_dimensions }}"
 
 ####################
@@ -92,6 +80,26 @@ heat_api_dimensions: "{{ default_container_dimensions }}"
 heat_api_cfn_dimensions: "{{ default_container_dimensions }}"
 heat_engine_dimensions: "{{ default_container_dimensions }}"
 
+heat_api_default_volumes:
+  - "{{ node_config_directory }}/heat-api/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "{{ kolla_dev_repos_directory ~ '/heat/heat:/var/lib/kolla/venv/lib/python2.7/site-packages/heat' if heat_dev_mode | bool else '' }}"
+  - "kolla_logs:/var/log/kolla/"
+heat_api_cfn_default_volumes:
+  - "{{ node_config_directory }}/heat-api-cfn/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "{{ kolla_dev_repos_directory ~ '/heat/heat:/var/lib/kolla/venv/lib/python2.7/site-packages/heat' if heat_dev_mode | bool else '' }}"
+  - "kolla_logs:/var/log/kolla/"
+heat_engine_default_volumes:
+  - "{{ node_config_directory }}/heat-engine/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "{{ kolla_dev_repos_directory ~ '/heat/heat:/var/lib/kolla/venv/lib/python2.7/site-packages/heat' if heat_dev_mode | bool else '' }}"
+  - "kolla_logs:/var/log/kolla/"
+
+heat_extra_volumes: "{{ default_extra_volumes }}"
+heat_api_extra_volumes: "{{ heat_extra_volumes }}"
+heat_api_cfn_extra_volumes: "{{ heat_extra_volumes }}"
+heat_engine_extra_volumes: "{{ heat_extra_volumes }}"
 
 ####################
 # OpenStack
diff --git a/ansible/roles/horizon/defaults/main.yml b/ansible/roles/horizon/defaults/main.yml
index babe266dfe..240cfb9207 100644
--- a/ansible/roles/horizon/defaults/main.yml
+++ b/ansible/roles/horizon/defaults/main.yml
@@ -34,14 +34,7 @@ horizon_services:
       ENABLE_WATCHER: "{{ 'yes' if enable_horizon_watcher | bool else 'no' }}"
       ENABLE_ZUN: "{{ 'yes' if enable_horizon_zun | bool else 'no' }}"
       FORCE_GENERATE: "{{ 'yes' if horizon_dev_mode | bool else 'no' }}"
-    volumes:
-      - "{{ node_config_directory }}/horizon/:{{ container_config_directory }}/:ro"
-      - "{{ kolla_dev_repos_directory ~ '/horizon/horizon:/var/lib/kolla/venv/lib/python2.7/site-packages/horizon' if horizon_dev_mode | bool else '' }}"
-      - "{{ kolla_dev_repos_directory ~ '/horizon/openstack_dashboard:/var/lib/kolla/venv/lib/python2.7/site-packages/openstack_dashboard' if horizon_dev_mode | bool else '' }}"
-      - "{{ kolla_dev_repos_directory ~ '/murano-dashboard/muranodashboard:/var/lib/kolla/venv/lib/python2.7/site-packages/muranodashboard' if horizon_murano_dev_mode | bool else '' }}"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "/tmp:/tmp"
+    volumes: "{{ horizon_default_volumes + horizon_extra_volumes }}"
     dimensions: "{{ horizon_dimensions }}"
     haproxy:
       horizon:
@@ -86,6 +79,17 @@ horizon_image_full: "{{ horizon_image }}:{{ horizon_tag }}"
 
 horizon_dimensions: "{{ default_container_dimensions }}"
 
+horizon_default_volumes:
+  - "{{ node_config_directory }}/horizon/:{{ container_config_directory }}/:ro"
+  - "{{ kolla_dev_repos_directory ~ '/horizon/horizon:/var/lib/kolla/venv/lib/python2.7/site-packages/horizon' if horizon_dev_mode | bool else '' }}"
+  - "{{ kolla_dev_repos_directory ~ '/horizon/openstack_dashboard:/var/lib/kolla/venv/lib/python2.7/site-packages/openstack_dashboard' if horizon_dev_mode | bool else '' }}"
+  - "{{ kolla_dev_repos_directory ~ '/murano-dashboard/muranodashboard:/var/lib/kolla/venv/lib/python2.7/site-packages/muranodashboard' if horizon_murano_dev_mode | bool else '' }}"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "/tmp:/tmp"
+
+horizon_extra_volumes: "{{ default_extra_volumes }}"
+
 ####################
 # OpenStack
 ####################
diff --git a/ansible/roles/ironic/defaults/main.yml b/ansible/roles/ironic/defaults/main.yml
index e66eba2c6e..f1f0a29bca 100644
--- a/ansible/roles/ironic/defaults/main.yml
+++ b/ansible/roles/ironic/defaults/main.yml
@@ -7,11 +7,7 @@ ironic_services:
     group: ironic-api
     enabled: true
     image: "{{ ironic_api_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/ironic-api/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla"
-      - "{{ kolla_dev_repos_directory ~ '/ironic/ironic:/var/lib/kolla/venv/lib/python2.7/site-packages/ironic' if ironic_dev_mode | bool else '' }}"
+    volumes: "{{ ironic_api_default_volumes + ironic_api_extra_volumes }}"
     dimensions: "{{ ironic_api_dimensions }}"
     haproxy:
       ironic_api:
@@ -32,18 +28,7 @@ ironic_services:
     enabled: true
     image: "{{ ironic_conductor_image_full }}"
     privileged: True
-    volumes:
-      - "{{ node_config_directory }}/ironic-conductor/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "/lib/modules:/lib/modules:ro"
-      - "/sys:/sys"
-      - "/dev:/dev"
-      - "/run:/run:shared"
-      - "kolla_logs:/var/log/kolla"
-      - "ironic:/var/lib/ironic"
-      - "ironic_pxe:/tftpboot/"
-      - "ironic_ipxe:/httpboot/"
-      - "{{ kolla_dev_repos_directory ~ '/ironic/ironic:/var/lib/kolla/venv/lib/python2.7/site-packages/ironic' if ironic_dev_mode | bool else '' }}"
+    volumes: "{{ ironic_conductor_default_volumes + ironic_conductor_extra_volumes }}"
     dimensions: "{{ ironic_conductor_dimensions }}"
   ironic-inspector:
     container_name: ironic_inspector
@@ -51,12 +36,7 @@ ironic_services:
     enabled: true
     image: "{{ ironic_inspector_image_full }}"
     privileged: True
-    volumes:
-      - "{{ node_config_directory }}/ironic-inspector/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla"
-      - "ironic_inspector_dhcp_hosts:/var/lib/ironic-inspector/dhcp-hostsdir"
-      - "{{ kolla_dev_repos_directory ~ '/ironic-inspector/ironic_inspector:/var/lib/kolla/venv/lib/python2.7/site-packages/ironic_inspector' if ironic_dev_mode | bool else '' }}"
+    volumes: "{{ ironic_inspector_default_volumes + ironic_inspector_extra_volumes }}"
     dimensions: "{{ ironic_inspector_dimensions }}"
     haproxy:
       ironic_inspector:
@@ -76,22 +56,14 @@ ironic_services:
     group: ironic-pxe
     enabled: true
     image: "{{ ironic_pxe_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/ironic-pxe/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "ironic_pxe:/tftpboot/"
-      - "kolla_logs:/var/log/kolla"
+    volumes: "{{ ironic_pxe_default_volumes + ironic_pxe_extra_volumes }}"
     dimensions: "{{ ironic_pxe_dimensions }}"
   ironic-ipxe:
     container_name: ironic_ipxe
     group: ironic-ipxe
     enabled: "{{ enable_ironic_ipxe | bool }}"
     image: "{{ ironic_pxe_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/ironic-ipxe/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "ironic_ipxe:/httpboot/"
-      - "kolla_logs:/var/log/kolla"
+    volumes: "{{ ironic_ipxe_default_volumes + ironic_ipxe_extra_volumes }}"
     dimensions: "{{ ironic_ipxe_dimensions }}"
   ironic-dnsmasq:
     container_name: ironic_dnsmasq
@@ -100,11 +72,7 @@ ironic_services:
     cap_add:
       - NET_ADMIN
     image: "{{ ironic_dnsmasq_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/ironic-dnsmasq/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla"
-      - "ironic_inspector_dhcp_hosts:/etc/dnsmasq/dhcp-hostsdir:ro"
+    volumes: "{{ ironic_dnsmasq_default_volumes + ironic_dnsmasq_extra_volumes }}"
     dimensions: "{{ ironic_dnsmasq_dimensions }}"
 
 
@@ -153,6 +121,53 @@ ironic_ipxe_dimensions: "{{ default_container_dimensions }}"
 ironic_inspector_dimensions: "{{ default_container_dimensions }}"
 ironic_dnsmasq_dimensions: "{{ default_container_dimensions }}"
 
+ironic_api_default_volumes:
+  - "{{ node_config_directory }}/ironic-api/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla"
+  - "{{ kolla_dev_repos_directory ~ '/ironic/ironic:/var/lib/kolla/venv/lib/python2.7/site-packages/ironic' if ironic_dev_mode | bool else '' }}"
+ironic_conductor_default_volumes:
+  - "{{ node_config_directory }}/ironic-conductor/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "/lib/modules:/lib/modules:ro"
+  - "/sys:/sys"
+  - "/dev:/dev"
+  - "/run:/run:shared"
+  - "kolla_logs:/var/log/kolla"
+  - "ironic:/var/lib/ironic"
+  - "ironic_pxe:/tftpboot/"
+  - "ironic_ipxe:/httpboot/"
+  - "{{ kolla_dev_repos_directory ~ '/ironic/ironic:/var/lib/kolla/venv/lib/python2.7/site-packages/ironic' if ironic_dev_mode | bool else '' }}"
+ironic_pxe_default_volumes:
+  - "{{ node_config_directory }}/ironic-pxe/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "ironic_pxe:/tftpboot/"
+  - "kolla_logs:/var/log/kolla"
+ironic_ipxe_default_volumes:
+  - "{{ node_config_directory }}/ironic-ipxe/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "ironic_ipxe:/httpboot/"
+  - "kolla_logs:/var/log/kolla"
+ironic_inspector_default_volumes:
+  - "{{ node_config_directory }}/ironic-inspector/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla"
+  - "ironic_inspector_dhcp_hosts:/var/lib/ironic-inspector/dhcp-hostsdir"
+  - "{{ kolla_dev_repos_directory ~ '/ironic-inspector/ironic_inspector:/var/lib/kolla/venv/lib/python2.7/site-packages/ironic_inspector' if ironic_dev_mode | bool else '' }}"
+ironic_dnsmasq_default_volumes:
+  - "{{ node_config_directory }}/ironic-dnsmasq/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla"
+  - "ironic_inspector_dhcp_hosts:/etc/dnsmasq/dhcp-hostsdir:ro"
+
+ironic_extra_volumes: "{{ default_extra_volumes }}"
+ironic_api_extra_volumes: "{{ ironic_extra_volumes }}"
+ironic_conductor_extra_volumes: "{{ ironic_extra_volumes }}"
+ironic_pxe_extra_volumes: "{{ ironic_extra_volumes }}"
+ironic_ipxe_extra_volumes: "{{ ironic_extra_volumes }}"
+ironic_inspector_extra_volumes: "{{ ironic_extra_volumes }}"
+ironic_dnsmasq_extra_volumes: "{{ ironic_extra_volumes }}"
+
 ####################
 # OpenStack
 ####################
diff --git a/ansible/roles/keystone/defaults/main.yml b/ansible/roles/keystone/defaults/main.yml
index 5154c45a4e..0e2d21fc57 100644
--- a/ansible/roles/keystone/defaults/main.yml
+++ b/ansible/roles/keystone/defaults/main.yml
@@ -7,12 +7,7 @@ keystone_services:
     group: "keystone"
     enabled: true
     image: "{{ keystone_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/keystone/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "{{ kolla_dev_repos_directory ~ '/keystone/keystone:/var/lib/kolla/venv/lib/python2.7/site-packages/keystone' if keystone_dev_mode | bool else '' }}"
-      - "kolla_logs:/var/log/kolla/"
-      - "{% if keystone_token_provider == 'fernet' %}keystone_fernet_tokens:/etc/keystone/fernet-keys{% endif %}"
+    volumes: "{{ keystone_default_volumes + keystone_extra_volumes }}"
     dimensions: "{{ keystone_dimensions }}"
     haproxy:
       keystone_internal:
@@ -94,6 +89,15 @@ keystone_dimensions: "{{ default_container_dimensions }}"
 keystone_fernet_dimensions: "{{ default_container_dimensions }}"
 keystone_ssh_dimensions: "{{ default_container_dimensions }}"
 
+keystone_default_volumes:
+  - "{{ node_config_directory }}/keystone/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "{{ kolla_dev_repos_directory ~ '/keystone/keystone:/var/lib/kolla/venv/lib/python2.7/site-packages/keystone' if keystone_dev_mode | bool else '' }}"
+  - "kolla_logs:/var/log/kolla/"
+  - "{% if keystone_token_provider == 'fernet' %}keystone_fernet_tokens:/etc/keystone/fernet-keys{% endif %}"
+
+keystone_extra_volumes: "{{ default_extra_volumes }}"
+
 ####################
 # OpenStack
 ####################
diff --git a/ansible/roles/kuryr/defaults/main.yml b/ansible/roles/kuryr/defaults/main.yml
index 6a62b94b7f..b16bce3c05 100644
--- a/ansible/roles/kuryr/defaults/main.yml
+++ b/ansible/roles/kuryr/defaults/main.yml
@@ -17,15 +17,7 @@ kuryr_services:
     privileged: True
     cap_add:
       - NET_ADMIN
-    volumes:
-      - "{{ node_config_directory }}/kuryr/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "/lib/modules:/lib/modules:ro"
-      - "/run:/run:shared"
-      - "/usr/lib/docker:/usr/lib/docker"
-      - "{{ kolla_dev_repos_directory ~ '/kuryr/kuryr:/var/lib/kolla/venv/lib/python2.7/site-packages/kuryr' if kuryr_dev_mode | bool else '' }}"
-      - "{{ kolla_dev_repos_directory ~ '/kuryr-libnetwork/kuryr_libnetwork:/var/lib/kolla/venv/lib/python2.7/site-packages/kuryr_libnetwork' if kuryr_dev_mode | bool else '' }}"
-      - "kolla_logs:/var/log/kolla/"
+    volumes: "{{ kuryr_default_volumes + kuryr_extra_volumes }}"
     dimensions: "{{ kuryr_dimensions }}"
 
 
@@ -36,6 +28,17 @@ kuryr_image: "{{ docker_registry ~ '/' if docker_registry else '' }}{{ docker_na
 kuryr_tag: "{{ openstack_release }}"
 kuryr_image_full: "{{ kuryr_image }}:{{ kuryr_tag }}"
 
+kuryr_default_volumes:
+  - "{{ node_config_directory }}/kuryr/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "/lib/modules:/lib/modules:ro"
+  - "/run:/run:shared"
+  - "/usr/lib/docker:/usr/lib/docker"
+  - "{{ kolla_dev_repos_directory ~ '/kuryr/kuryr:/var/lib/kolla/venv/lib/python2.7/site-packages/kuryr' if kuryr_dev_mode | bool else '' }}"
+  - "{{ kolla_dev_repos_directory ~ '/kuryr-libnetwork/kuryr_libnetwork:/var/lib/kolla/venv/lib/python2.7/site-packages/kuryr_libnetwork' if kuryr_dev_mode | bool else '' }}"
+  - "kolla_logs:/var/log/kolla/"
+
+kuryr_extra_volumes: "{{ default_extra_volumes }}"
 
 ####################
 # OpenStack
diff --git a/ansible/roles/magnum/defaults/main.yml b/ansible/roles/magnum/defaults/main.yml
index 781bc1f81b..559035ae91 100644
--- a/ansible/roles/magnum/defaults/main.yml
+++ b/ansible/roles/magnum/defaults/main.yml
@@ -9,11 +9,7 @@ magnum_services:
     image: "{{ magnum_api_image_full }}"
     environment:
       DUMMY_ENVIRONMENT: kolla_useless_env
-    volumes:
-      - "{{ node_config_directory }}/magnum-api/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "{{ kolla_dev_repos_directory ~ '/magnum/magnum:/var/lib/kolla/venv/lib/python2.7/site-packages/magnum' if magnum_dev_mode | bool else '' }}"
-      - "kolla_logs:/var/log/kolla/"
+    volumes: "{{ magnum_api_default_volumes + magnum_api_extra_volumes }}"
     dimensions: "{{ magnum_api_dimensions }}"
     haproxy:
       magnum_api:
@@ -32,12 +28,7 @@ magnum_services:
     enabled: true
     image: "{{ magnum_conductor_image_full }}"
     environment: "{{ container_proxy }}"
-    volumes:
-      - "{{ node_config_directory }}/magnum-conductor/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "magnum:/var/lib/magnum/"
-      - "{{ kolla_dev_repos_directory ~ '/magnum/magnum:/var/lib/kolla/venv/lib/python2.7/site-packages/magnum' if magnum_dev_mode | bool else '' }}"
-      - "kolla_logs:/var/log/kolla/"
+    volumes: "{{ magnum_conductor_default_volumes + magnum_conductor_extra_volumes }}"
     dimensions: "{{ magnum_conductor_dimensions }}"
 
 
@@ -75,6 +66,21 @@ magnum_conductor_image_full: "{{ magnum_conductor_image }}:{{ magnum_conductor_t
 magnum_api_dimensions: "{{ default_container_dimensions }}"
 magnum_conductor_dimensions: "{{ default_container_dimensions }}"
 
+magnum_api_default_volumes:
+  - "{{ node_config_directory }}/magnum-api/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "{{ kolla_dev_repos_directory ~ '/magnum/magnum:/var/lib/kolla/venv/lib/python2.7/site-packages/magnum' if magnum_dev_mode | bool else '' }}"
+  - "kolla_logs:/var/log/kolla/"
+magnum_conductor_default_volumes:
+  - "{{ node_config_directory }}/magnum-conductor/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "magnum:/var/lib/magnum/"
+  - "{{ kolla_dev_repos_directory ~ '/magnum/magnum:/var/lib/kolla/venv/lib/python2.7/site-packages/magnum' if magnum_dev_mode | bool else '' }}"
+  - "kolla_logs:/var/log/kolla/"
+
+magnum_extra_volumes: "{{ default_extra_volumes }}"
+magnum_api_extra_volumes: "{{ magnum_extra_volumes }}"
+magnum_conductor_extra_volumes: "{{ magnum_extra_volumes }}"
 
 ####################
 # OpenStack
diff --git a/ansible/roles/manila/defaults/main.yml b/ansible/roles/manila/defaults/main.yml
index f206d963b3..264ac68812 100644
--- a/ansible/roles/manila/defaults/main.yml
+++ b/ansible/roles/manila/defaults/main.yml
@@ -7,11 +7,7 @@ manila_services:
     group: "manila-api"
     image: "{{ manila_api_image_full }}"
     enabled: True
-    volumes:
-      - "{{ node_config_directory }}/manila-api/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/manila/manila:/var/lib/kolla/venv/lib/python2.7/site-packages/manila' if manila_dev_mode | bool else '' }}"
+    volumes: "{{ manila_api_default_volumes + manila_api_extra_volumes }}"
     dimensions: "{{ manila_api_dimensions }}"
     haproxy:
       manila_api:
@@ -29,11 +25,7 @@ manila_services:
     group: "manila-scheduler"
     image: "{{ manila_scheduler_image_full }}"
     enabled: True
-    volumes:
-      - "{{ node_config_directory }}/manila-scheduler/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/manila/manila:/var/lib/kolla/venv/lib/python2.7/site-packages/manila' if manila_dev_mode | bool else '' }}"
+    volumes: "{{ manila_scheduler_default_volumes + manila_scheduler_extra_volumes }}"
     dimensions: "{{ manila_scheduler_dimensions }}"
   manila-share:
     container_name: "manila_share"
@@ -41,13 +33,7 @@ manila_services:
     image: "{{ manila_share_image_full }}"
     enabled: True
     privileged: True
-    volumes:
-      - "{{ node_config_directory }}/manila-share/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "/run/:/run/:shared"
-      - "kolla_logs:/var/log/kolla/"
-      - "/lib/modules:/lib/modules:ro"
-      - "{{ kolla_dev_repos_directory ~ '/manila/manila:/var/lib/kolla/venv/lib/python2.7/site-packages/manila' if manila_dev_mode | bool else '' }}"
+    volumes: "{{ manila_share_default_volumes + manila_share_extra_volumes }}"
     dimensions: "{{ manila_share_dimensions }}"
   manila-data:
     container_name: "manila_data"
@@ -55,13 +41,7 @@ manila_services:
     image: "{{ manila_data_image_full }}"
     enabled: True
     privileged: True
-    volumes:
-      - "{{ node_config_directory }}/manila-data/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "/dev/:/dev/"
-      - "/run/:/run/:shared"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/manila/manila:/var/lib/kolla/venv/lib/python2.7/site-packages/manila' if manila_dev_mode | bool else '' }}"
+    volumes: "{{ manila_data_default_volumes + manila_data_extra_volumes }}"
     dimensions: "{{ manila_data_dimensions }}"
 
 
@@ -115,6 +95,36 @@ manila_scheduler_dimensions: "{{ default_container_dimensions }}"
 manila_api_dimensions: "{{ default_container_dimensions }}"
 manila_data_dimensions: "{{ default_container_dimensions }}"
 
+manila_share_default_volumes:
+  - "{{ node_config_directory }}/manila-share/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "/run/:/run/:shared"
+  - "kolla_logs:/var/log/kolla/"
+  - "/lib/modules:/lib/modules:ro"
+  - "{{ kolla_dev_repos_directory ~ '/manila/manila:/var/lib/kolla/venv/lib/python2.7/site-packages/manila' if manila_dev_mode | bool else '' }}"
+manila_scheduler_default_volumes:
+  - "{{ node_config_directory }}/manila-scheduler/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/manila/manila:/var/lib/kolla/venv/lib/python2.7/site-packages/manila' if manila_dev_mode | bool else '' }}"
+manila_api_default_volumes:
+  - "{{ node_config_directory }}/manila-api/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/manila/manila:/var/lib/kolla/venv/lib/python2.7/site-packages/manila' if manila_dev_mode | bool else '' }}"
+manila_data_default_volumes:
+  - "{{ node_config_directory }}/manila-data/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "/dev/:/dev/"
+  - "/run/:/run/:shared"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/manila/manila:/var/lib/kolla/venv/lib/python2.7/site-packages/manila' if manila_dev_mode | bool else '' }}"
+
+manila_extra_volumes: "{{ default_extra_volumes }}"
+manila_share_extra_volumes: "{{ manila_extra_volumes }}"
+manila_scheduler_extra_volumes: "{{ manila_extra_volumes }}"
+manila_api_extra_volumes: "{{ manila_extra_volumes }}"
+manila_data_extra_volumes: "{{ manila_extra_volumes }}"
 
 #####################
 ## OpenStack
diff --git a/ansible/roles/mistral/defaults/main.yml b/ansible/roles/mistral/defaults/main.yml
index ad2e497f79..8982e53e7a 100644
--- a/ansible/roles/mistral/defaults/main.yml
+++ b/ansible/roles/mistral/defaults/main.yml
@@ -7,11 +7,7 @@ mistral_services:
     group: mistral-api
     enabled: true
     image: "{{ mistral_api_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/mistral-api/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/mistral/mistral:/var/lib/kolla/venv/lib/python2.7/site-packages/mistral' if mistral_dev_mode | bool else '' }}"
+    volumes: "{{ mistral_api_default_volumes + mistral_api_extra_volumes }}"
     dimensions: "{{ mistral_api_dimensions }}"
     haproxy:
       mistral_api:
@@ -29,33 +25,21 @@ mistral_services:
     group: mistral-engine
     enabled: true
     image: "{{ mistral_engine_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/mistral-engine/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/mistral/mistral:/var/lib/kolla/venv/lib/python2.7/site-packages/mistral' if mistral_dev_mode | bool else '' }}"
+    volumes: "{{ mistral_engine_default_volumes + mistral_engine_extra_volumes }}"
     dimensions: "{{ mistral_engine_dimensions }}"
   mistral-event-engine:
     container_name: mistral_event_engine
     group: mistral-event-engine
     enabled: true
     image: "{{ mistral_event_engine_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/mistral-event-engine/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/mistral/mistral:/var/lib/kolla/venv/lib/python2.7/site-packages/mistral' if mistral_dev_mode | bool else '' }}"
+    volumes: "{{ mistral_event_engine_default_volumes + mistral_event_engine_extra_volumes }}"
     dimensions: "{{ mistral_event_engine_dimensions }}"
   mistral-executor:
     container_name: mistral_executor
     group: mistral-executor
     enabled: true
     image: "{{ mistral_executor_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/mistral-executor/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/mistral/mistral:/var/lib/kolla/venv/lib/python2.7/site-packages/mistral' if mistral_dev_mode | bool else '' }}"
+    volumes: "{{ mistral_executor_default_volumes + mistral_executor_extra_volumes }}"
     dimensions: "{{ mistral_executor_dimensions }}"
 
 
@@ -94,6 +78,32 @@ mistral_event_engine_dimensions: "{{ default_container_dimensions }}"
 mistral_executor_dimensions: "{{ default_container_dimensions }}"
 mistral_api_dimensions: "{{ default_container_dimensions }}"
 
+mistral_engine_default_volumes:
+  - "{{ node_config_directory }}/mistral-engine/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/mistral/mistral:/var/lib/kolla/venv/lib/python2.7/site-packages/mistral' if mistral_dev_mode | bool else '' }}"
+mistral_event_engine_default_volumes:
+  - "{{ node_config_directory }}/mistral-event-engine/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/mistral/mistral:/var/lib/kolla/venv/lib/python2.7/site-packages/mistral' if mistral_dev_mode | bool else '' }}"
+mistral_executor_default_volumes:
+  - "{{ node_config_directory }}/mistral-executor/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/mistral/mistral:/var/lib/kolla/venv/lib/python2.7/site-packages/mistral' if mistral_dev_mode | bool else '' }}"
+mistral_api_default_volumes:
+  - "{{ node_config_directory }}/mistral-api/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/mistral/mistral:/var/lib/kolla/venv/lib/python2.7/site-packages/mistral' if mistral_dev_mode | bool else '' }}"
+
+mistral_extra_volumes: "{{ default_extra_volumes }}"
+mistral_engine_extra_volumes: "{{ mistral_extra_volumes }}"
+mistral_event_engine_extra_volumes: "{{ mistral_extra_volumes }}"
+mistral_executor_extra_volumes: "{{ mistral_extra_volumes }}"
+mistral_api_extra_volumes: "{{ mistral_extra_volumes }}"
 
 ####################
 # OpenStack
diff --git a/ansible/roles/murano/defaults/main.yml b/ansible/roles/murano/defaults/main.yml
index 3e5431a3ad..0fcba7d1a9 100644
--- a/ansible/roles/murano/defaults/main.yml
+++ b/ansible/roles/murano/defaults/main.yml
@@ -7,11 +7,7 @@ murano_services:
     group: murano-api
     enabled: true
     image: "{{ murano_api_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/murano-api/:{{ container_config_directory }}/:ro"
-      - "{{ kolla_dev_repos_directory ~ '/murano/murano:/var/lib/kolla/venv/lib/python2.7/site-packages/murano' if murano_dev_mode | bool else '' }}"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
+    volumes: "{{ murano_api_default_volumes + murano_api_extra_volumes }}"
     dimensions: "{{ murano_api_dimensions }}"
     haproxy:
       murano_api:
@@ -29,11 +25,7 @@ murano_services:
     group: murano-engine
     enabled: true
     image: "{{ murano_engine_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/murano-engine/:{{ container_config_directory }}/:ro"
-      - "{{ kolla_dev_repos_directory ~ '/murano/murano:/var/lib/kolla/venv/lib/python2.7/site-packages/murano' if murano_dev_mode | bool else '' }}"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
+    volumes: "{{ murano_engine_default_volumes + murano_engine_extra_volumes }}"
     dimensions: "{{ murano_engine_dimensions }}"
 
 
@@ -62,6 +54,20 @@ murano_engine_image_full: "{{ murano_engine_image }}:{{ murano_engine_tag }}"
 murano_api_dimensions: "{{ default_container_dimensions }}"
 murano_engine_dimensions: "{{ default_container_dimensions }}"
 
+murano_api_default_volumes:
+  - "{{ node_config_directory }}/murano-api/:{{ container_config_directory }}/:ro"
+  - "{{ kolla_dev_repos_directory ~ '/murano/murano:/var/lib/kolla/venv/lib/python2.7/site-packages/murano' if murano_dev_mode | bool else '' }}"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+murano_engine_default_volumes:
+  - "{{ node_config_directory }}/murano-engine/:{{ container_config_directory }}/:ro"
+  - "{{ kolla_dev_repos_directory ~ '/murano/murano:/var/lib/kolla/venv/lib/python2.7/site-packages/murano' if murano_dev_mode | bool else '' }}"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+
+murano_extra_volumes: "{{ default_extra_volumes }}"
+murano_api_extra_volumes: "{{ murano_extra_volumes }}"
+murano_engine_extra_volumes: "{{ murano_extra_volumes }}"
 
 ####################
 # OpenStack
diff --git a/ansible/roles/neutron/defaults/main.yml b/ansible/roles/neutron/defaults/main.yml
index 0607af41c7..d308869b85 100644
--- a/ansible/roles/neutron/defaults/main.yml
+++ b/ansible/roles/neutron/defaults/main.yml
@@ -8,11 +8,7 @@ neutron_services:
     enabled: true
     group: "neutron-server"
     host_in_groups: "{{ inventory_hostname in groups['neutron-server'] }}"
-    volumes:
-      - "{{ node_config_directory }}/neutron-server/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/neutron/neutron:/var/lib/kolla/venv/lib/python2.7/site-packages/neutron' if neutron_dev_mode | bool else '' }}"
+    volumes: "{{ neutron_server_default_volumes + neutron_server_extra_volumes }}"
     dimensions: "{{ neutron_server_dimensions }}"
     haproxy:
       neutron_server:
@@ -49,13 +45,7 @@ neutron_services:
       and enable_nova_fake | bool
       )
       }}
-    volumes:
-      - "{{ node_config_directory }}/neutron-openvswitch-agent/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "/lib/modules:/lib/modules:ro"
-      - "/run:/run:shared"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/neutron/neutron:/var/lib/kolla/venv/lib/python2.7/site-packages/neutron' if neutron_dev_mode | bool else '' }}"
+    volumes: "{{ neutron_openvswitch_agent_default_volumes + neutron_openvswitch_agent_extra_volumes }}"
     dimensions: "{{ neutron_openvswitch_agent_dimensions }}"
   neutron-openvswitch-agent-xenapi:
     container_name: "neutron_openvswitch_agent_xenapi"
@@ -66,13 +56,7 @@ neutron_services:
       {{
        inventory_hostname in groups['compute']
       }}
-    volumes:
-      - "{{ node_config_directory }}/neutron-openvswitch-agent-xenapi/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "/lib/modules:/lib/modules:ro"
-      - "/run:/run:shared"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/neutron/neutron:/var/lib/kolla/venv/lib/python2.7/site-packages/neutron' if neutron_dev_mode | bool else '' }}"
+    volumes: "{{ neutron_openvswitch_agent_xenapi_default_volumes + neutron_openvswitch_agent_xenapi_extra_volumes }}"
     dimensions: "{{ neutron_openvswitch_agent_xenapi_dimensions }}"
   neutron-linuxbridge-agent:
     container_name: "neutron_linuxbridge_agent"
@@ -91,13 +75,7 @@ neutron_services:
       or inventory_hostname in groups['neutron-l3-agent']
       or inventory_hostname in groups['neutron-metadata-agent']
       }}
-    volumes:
-      - "{{ node_config_directory }}/neutron-linuxbridge-agent/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "/lib/modules:/lib/modules:ro"
-      - "/run:/run:shared"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/neutron/neutron:/var/lib/kolla/venv/lib/python2.7/site-packages/neutron' if neutron_dev_mode | bool else '' }}"
+    volumes: "{{ neutron_linuxbridge_agent_default_volumes + neutron_linuxbridge_agent_extra_volumes }}"
     dimensions: "{{ neutron_linuxbridge_agent_dimensions }}"
   neutron-dhcp-agent:
     container_name: "neutron_dhcp_agent"
@@ -106,13 +84,7 @@ neutron_services:
     enabled: "{{ neutron_plugin_agent not in [ 'vmware_nsxv', 'vmware_nsxv3' ] and not enable_onos | bool }}"
     group: "neutron-dhcp-agent"
     host_in_groups: "{{ inventory_hostname in groups['neutron-dhcp-agent'] }}"
-    volumes:
-      - "{{ node_config_directory }}/neutron-dhcp-agent/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "/run/:/run/:shared"
-      - "neutron_metadata_socket:/var/lib/neutron/kolla/"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/neutron/neutron:/var/lib/kolla/venv/lib/python2.7/site-packages/neutron' if neutron_dev_mode | bool else '' }}"
+    volumes: "{{ neutron_dhcp_agent_default_volumes + neutron_dhcp_agent_extra_volumes }}"
     dimensions: "{{ neutron_dhcp_agent_dimensions }}"
   neutron-l3-agent:
     container_name: "neutron_l3_agent"
@@ -124,14 +96,7 @@ neutron_services:
       inventory_hostname in groups['neutron-l3-agent']
       or (inventory_hostname in groups['compute'] and enable_neutron_dvr | bool)
       }}
-    volumes:
-      - "{{ node_config_directory }}/neutron-l3-agent/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "/lib/modules:/lib/modules:ro"
-      - "/run:/run:shared"
-      - "neutron_metadata_socket:/var/lib/neutron/kolla/"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/neutron/neutron:/var/lib/kolla/venv/lib/python2.7/site-packages/neutron' if neutron_dev_mode | bool else '' }}"
+    volumes: "{{ neutron_l3_agent_default_volumes + neutron_l3_agent_extra_volumes }}"
     dimensions: "{{ neutron_l3_agent_dimensions }}"
   neutron-lbaas-agent:
     container_name: "neutron_lbaas_agent"
@@ -140,11 +105,7 @@ neutron_services:
     enabled: "{{ enable_neutron_lbaas | bool and not enable_octavia | bool and neutron_plugin_agent not in ['vmware_nsxv', 'vmware_dvs'] }}"
     group: "neutron-lbaas-agent"
     host_in_groups: "{{ inventory_hostname in groups['neutron-lbaas-agent'] }}"
-    volumes:
-      - "{{ node_config_directory }}/neutron-lbaas-agent/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "/run:/run:shared"
-      - "kolla_logs:/var/log/kolla/"
+    volumes: "{{ neutron_lbaas_agent_default_volumes + neutron_lbaas_agent_extra_volumes }}"
     dimensions: "{{ neutron_lbaas_agent_dimensions }}"
   neutron-sriov-agent:
     container_name: "neutron_sriov_agent"
@@ -152,12 +113,7 @@ neutron_services:
     privileged: True
     enabled: "{{ enable_neutron_sriov | bool and neutron_plugin_agent not in ['vmware_nsxv', 'vmware_nsxv3' ] }}"
     host_in_groups: "{{ inventory_hostname in groups['compute'] }}"
-    volumes:
-      - "{{ node_config_directory }}/neutron-sriov-agent/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "/run:/run:shared"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/neutron/neutron:/var/lib/kolla/venv/lib/python2.7/site-packages/neutron' if neutron_dev_mode | bool else '' }}"
+    volumes: "{{ neutron_sriov_agent_default_volumes + neutron_sriov_agent_extra_volumes }}"
     dimensions: "{{ neutron_sriov_agent_dimensions }}"
   neutron-metadata-agent:
     container_name: "neutron_metadata_agent"
@@ -169,13 +125,7 @@ neutron_services:
       inventory_hostname in groups['neutron-metadata-agent']
       or (inventory_hostname in groups['compute'] and enable_neutron_dvr | bool)
       }}
-    volumes:
-      - "{{ node_config_directory }}/neutron-metadata-agent/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "/run/:/run/:shared"
-      - "neutron_metadata_socket:/var/lib/neutron/kolla/"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/neutron/neutron:/var/lib/kolla/venv/lib/python2.7/site-packages/neutron' if neutron_dev_mode | bool else '' }}"
+    volumes: "{{ neutron_metadata_agent_default_volumes + neutron_metadata_agent_extra_volumes }}"
     dimensions: "{{ neutron_metadata_agent_dimensions }}"
   neutron-bgp-dragent:
     container_name: "neutron_bgp_dragent"
@@ -184,11 +134,7 @@ neutron_services:
     enabled: "{{ enable_neutron_bgp_dragent | bool and neutron_plugin_agent not in ['vmware_nsxv', 'vmware_nsxv3', 'vmware_dvs'] }}"
     group: "neutron-bgp-dragent"
     host_in_groups: "{{ inventory_hostname in groups['neutron-bgp-dragent'] }}"
-    volumes:
-      - "{{ node_config_directory }}/neutron-bgp-dragent/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "/run:/run:shared"
-      - "kolla_logs:/var/log/kolla/"
+    volumes: "{{ neutron_bgp_dragent_default_volumes + neutron_bgp_dragent_extra_volumes }}"
     dimensions: "{{ neutron_bgp_dragent_dimensions }}"
   neutron-infoblox-ipam-agent:
     container_name: "neutron_infoblox_ipam_agent"
@@ -197,11 +143,7 @@ neutron_services:
     enabled: "{{ enable_neutron_infoblox_ipam_agent | bool }}"
     group: "neutron-infoblox-ipam-agent"
     host_in_groups: "{{ inventory_hostname in groups['neutron-infoblox-ipam-agent'] }}"
-    volumes:
-      - "{{ node_config_directory }}/neutron-infoblox-ipam-agent/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "/run:/run:shared"
-      - "kolla_logs:/var/log/kolla/"
+    volumes: "{{ neutron_infoblox_ipam_agent_default_volumes + neutron_infoblox_ipam_agent_extra_volumes }}"
     dimensions: "{{ neutron_infoblox_ipam_agent_dimensions }}"
   neutron-metering-agent:
     container_name: "neutron_metering_agent"
@@ -210,12 +152,7 @@ neutron_services:
     enabled: "{{ enable_neutron_metering | bool }}"
     group: "neutron-metering-agent"
     host_in_groups: "{{ inventory_hostname in groups['neutron-metering-agent'] }}"
-    volumes:
-      - "{{ node_config_directory }}/neutron-metering-agent/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "/run:/run:shared"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/neutron/neutron:/var/lib/kolla/venv/lib/python2.7/site-packages/neutron' if neutron_dev_mode | bool else '' }}"
+    volumes: "{{ neutron_metering_agent_default_volumes + neutron_metering_agent_extra_volumes }}"
     dimensions: "{{ neutron_metering_agent_dimensions }}"
   ironic-neutron-agent:
     container_name: "ironic_neutron_agent"
@@ -224,10 +161,7 @@ neutron_services:
     enabled: "{{ enable_ironic_neutron_agent | bool }}"
     group: "ironic-neutron-agent"
     host_in_groups: "{{ inventory_hostname in groups['ironic-neutron-agent'] }}"
-    volumes:
-      - "{{ node_config_directory }}/ironic-neutron-agent/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
+    volumes: "{{ ironic_neutron_agent_default_volumes + ironic_neutron_agent_extra_volumes }}"
     dimensions: "{{ ironic_neutron_agent_dimensions }}"
 
 ####################
@@ -307,6 +241,101 @@ neutron_metering_agent_dimensions: "{{ default_container_dimensions }}"
 ironic_neutron_agent_dimensions: "{{ default_container_dimensions }}"
 
 
+neutron_dhcp_agent_default_volumes:
+  - "{{ node_config_directory }}/neutron-dhcp-agent/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "/run/:/run/:shared"
+  - "neutron_metadata_socket:/var/lib/neutron/kolla/"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/neutron/neutron:/var/lib/kolla/venv/lib/python2.7/site-packages/neutron' if neutron_dev_mode | bool else '' }}"
+neutron_l3_agent_default_volumes:
+  - "{{ node_config_directory }}/neutron-l3-agent/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "/lib/modules:/lib/modules:ro"
+  - "/run:/run:shared"
+  - "neutron_metadata_socket:/var/lib/neutron/kolla/"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/neutron/neutron:/var/lib/kolla/venv/lib/python2.7/site-packages/neutron' if neutron_dev_mode | bool else '' }}"
+neutron_lbaas_agent_default_volumes:
+  - "{{ node_config_directory }}/neutron-lbaas-agent/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "/run:/run:shared"
+  - "kolla_logs:/var/log/kolla/"
+neutron_sriov_agent_default_volumes:
+  - "{{ node_config_directory }}/neutron-sriov-agent/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "/run:/run:shared"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/neutron/neutron:/var/lib/kolla/venv/lib/python2.7/site-packages/neutron' if neutron_dev_mode | bool else '' }}"
+neutron_linuxbridge_agent_default_volumes:
+  - "{{ node_config_directory }}/neutron-linuxbridge-agent/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "/lib/modules:/lib/modules:ro"
+  - "/run:/run:shared"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/neutron/neutron:/var/lib/kolla/venv/lib/python2.7/site-packages/neutron' if neutron_dev_mode | bool else '' }}"
+neutron_metadata_agent_default_volumes:
+  - "{{ node_config_directory }}/neutron-metadata-agent/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "/run/:/run/:shared"
+  - "neutron_metadata_socket:/var/lib/neutron/kolla/"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/neutron/neutron:/var/lib/kolla/venv/lib/python2.7/site-packages/neutron' if neutron_dev_mode | bool else '' }}"
+neutron_openvswitch_agent_default_volumes:
+  - "{{ node_config_directory }}/neutron-openvswitch-agent/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "/lib/modules:/lib/modules:ro"
+  - "/run:/run:shared"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/neutron/neutron:/var/lib/kolla/venv/lib/python2.7/site-packages/neutron' if neutron_dev_mode | bool else '' }}"
+neutron_server_default_volumes:
+  - "{{ node_config_directory }}/neutron-server/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/neutron/neutron:/var/lib/kolla/venv/lib/python2.7/site-packages/neutron' if neutron_dev_mode | bool else '' }}"
+neutron_bgp_dragent_default_volumes:
+  - "{{ node_config_directory }}/neutron-bgp-dragent/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "/run:/run:shared"
+  - "kolla_logs:/var/log/kolla/"
+neutron_infoblox_ipam_agent_default_volumes:
+  - "{{ node_config_directory }}/neutron-infoblox-ipam-agent/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "/run:/run:shared"
+  - "kolla_logs:/var/log/kolla/"
+neutron_openvswitch_agent_xenapi_default_volumes:
+  - "{{ node_config_directory }}/neutron-openvswitch-agent-xenapi/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "/lib/modules:/lib/modules:ro"
+  - "/run:/run:shared"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/neutron/neutron:/var/lib/kolla/venv/lib/python2.7/site-packages/neutron' if neutron_dev_mode | bool else '' }}"
+neutron_metering_agent_default_volumes:
+  - "{{ node_config_directory }}/neutron-metering-agent/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "/run:/run:shared"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/neutron/neutron:/var/lib/kolla/venv/lib/python2.7/site-packages/neutron' if neutron_dev_mode | bool else '' }}"
+ironic_neutron_agent_default_volumes:
+  - "{{ node_config_directory }}/ironic-neutron-agent/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+
+neutron_extra_volumes: "{{ default_extra_volumes }}"
+neutron_dhcp_agent_extra_volumes: "{{ neutron_extra_volumes }}"
+neutron_l3_agent_extra_volumes: "{{ neutron_extra_volumes }}"
+neutron_lbaas_agent_extra_volumes: "{{ neutron_extra_volumes }}"
+neutron_sriov_agent_extra_volumes: "{{ neutron_extra_volumes }}"
+neutron_linuxbridge_agent_extra_volumes: "{{ neutron_extra_volumes }}"
+neutron_metadata_agent_extra_volumes: "{{ neutron_extra_volumes }}"
+neutron_openvswitch_agent_extra_volumes: "{{ neutron_extra_volumes }}"
+neutron_server_extra_volumes: "{{ neutron_extra_volumes }}"
+neutron_bgp_dragent_extra_volumes: "{{ neutron_extra_volumes }}"
+neutron_infoblox_ipam_agent_extra_volumes: "{{ neutron_extra_volumes }}"
+neutron_openvswitch_agent_xenapi_extra_volumes: "{{ neutron_extra_volumes }}"
+neutron_metering_agent_extra_volumes: "{{ neutron_extra_volumes }}"
+ironic_neutron_agent_extra_volumes: "{{ neutron_extra_volumes }}"
+
 ####################
 # OpenStack
 ####################
diff --git a/ansible/roles/nova/defaults/main.yml b/ansible/roles/nova/defaults/main.yml
index 8081b7ad45..dd9f45eedb 100644
--- a/ansible/roles/nova/defaults/main.yml
+++ b/ansible/roles/nova/defaults/main.yml
@@ -9,32 +9,14 @@ nova_services:
     image: "{{ nova_libvirt_image_full }}"
     pid_mode: "host"
     privileged: True
-    volumes:
-      - "{{ node_config_directory }}/nova-libvirt/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "/lib/modules:/lib/modules:ro"
-      - "/run/:/run/:shared"
-      - "/dev:/dev"
-      - "/sys/fs/cgroup:/sys/fs/cgroup"
-      - "kolla_logs:/var/log/kolla/"
-      - "libvirtd:/var/lib/libvirt"
-      - "{{ nova_instance_datadir_volume }}:/var/lib/nova/"
-      - "{% if enable_shared_var_lib_nova_mnt | bool %}/var/lib/nova/mnt:/var/lib/nova/mnt:shared{% endif %}"
-      - "nova_libvirt_qemu:/etc/libvirt/qemu"
-      - "{{ kolla_dev_repos_directory ~ '/nova/nova:/var/lib/kolla/venv/lib/python2.7/site-packages/nova' if nova_dev_mode | bool else '' }}"
+    volumes: "{{ nova_libvirt_default_volumes + nova_libvirt_extra_volumes }}"
     dimensions: "{{ nova_libvirt_dimensions }}"
   nova-ssh:
     container_name: "nova_ssh"
     group: "compute"
     image: "{{ nova_ssh_image_full }}"
     enabled: "{{ enable_nova_ssh | bool }}"
-    volumes:
-      - "{{ node_config_directory }}/nova-ssh/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla"
-      - "{{ nova_instance_datadir_volume }}:/var/lib/nova"
-      - "{% if enable_shared_var_lib_nova_mnt | bool %}/var/lib/nova/mnt:/var/lib/nova/mnt:shared{% endif %}"
-      - "{{ kolla_dev_repos_directory ~ '/nova/nova:/var/lib/kolla/venv/lib/python2.7/site-packages/nova' if nova_dev_mode | bool else '' }}"
+    volumes: "{{ nova_ssh_default_volumes + nova_ssh_extra_volumes }}"
     dimensions: "{{ nova_ssh_dimensions }}"
   nova-api:
     container_name: "nova_api"
@@ -42,12 +24,7 @@ nova_services:
     image: "{{ nova_api_image_full }}"
     enabled: True
     privileged: True
-    volumes:
-      - "{{ node_config_directory }}/nova-api/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "/lib/modules:/lib/modules:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/nova/nova:/var/lib/kolla/venv/lib/python2.7/site-packages/nova' if nova_dev_mode | bool else '' }}"
+    volumes: "{{ nova_api_default_volumes + nova_api_extra_volumes }}"
     dimensions: "{{ nova_api_dimensions }}"
     haproxy:
       nova_api:
@@ -85,22 +62,14 @@ nova_services:
     group: "nova-consoleauth"
     image: "{{ nova_consoleauth_image_full }}"
     enabled: True
-    volumes:
-      - "{{ node_config_directory }}/nova-consoleauth/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/nova/nova:/var/lib/kolla/venv/lib/python2.7/site-packages/nova' if nova_dev_mode | bool else '' }}"
+    volumes: "{{ nova_consoleauth_default_volumes + nova_consoleauth_extra_volumes }}"
     dimensions: "{{ nova_consoleauth_dimensions }}"
   nova-novncproxy:
     container_name: "nova_novncproxy"
     group: "nova-novncproxy"
     image: "{{ nova_novncproxy_image_full }}"
     enabled: "{{ nova_console == 'novnc' }}"
-    volumes:
-      - "{{ node_config_directory }}/nova-novncproxy/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/nova/nova:/var/lib/kolla/venv/lib/python2.7/site-packages/nova' if nova_dev_mode | bool else '' }}"
+    volumes: "{{ nova_novncproxy_default_volumes + nova_novncproxy_extra_volumes }}"
     dimensions: "{{ nova_novncproxy_dimensions }}"
     haproxy:
       nova_novncproxy:
@@ -122,22 +91,14 @@ nova_services:
     group: "nova-scheduler"
     image: "{{ nova_scheduler_image_full }}"
     enabled: True
-    volumes:
-      - "{{ node_config_directory }}/nova-scheduler/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/nova/nova:/var/lib/kolla/venv/lib/python2.7/site-packages/nova' if nova_dev_mode | bool else '' }}"
+    volumes: "{{ nova_scheduler_default_volumes + nova_scheduler_extra_volumes }}"
     dimensions: "{{ nova_scheduler_dimensions }}"
   nova-spicehtml5proxy:
     container_name: "nova_spicehtml5proxy"
     group: "nova-spicehtml5proxy"
     image: "{{ nova_spicehtml5proxy_image_full }}"
     enabled: "{{ nova_console == 'spice' }}"
-    volumes:
-      - "{{ node_config_directory }}/nova-spicehtml5proxy/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/nova/nova:/var/lib/kolla/venv/lib/python2.7/site-packages/nova' if nova_dev_mode | bool else '' }}"
+    volumes: "{{ nova_spicehtml5proxy_default_volumes + nova_spicehtml5proxy_extra_volumes }}"
     dimensions: "{{ nova_spicehtml5proxy_dimensions }}"
     haproxy:
       nova_spicehtml5proxy:
@@ -157,11 +118,7 @@ nova_services:
     group: "nova-serialproxy"
     image: "{{ nova_serialproxy_image_full }}"
     enabled: "{{ enable_nova_serialconsole_proxy | bool }}"
-    volumes:
-      - "{{ node_config_directory }}/nova-serialproxy/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/nova/nova:/var/lib/kolla/venv/lib/python2.7/site-packages/nova' if nova_dev_mode | bool else '' }}"
+    volumes: "{{ nova_serialproxy_default_volumes + nova_serialproxy_extra_volumes }}"
     dimensions: "{{ nova_serialproxy_dimensions }}"
     haproxy:
       nova_serialconsole_proxy:
@@ -185,11 +142,7 @@ nova_services:
     group: "nova-conductor"
     enabled: True
     image: "{{ nova_conductor_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/nova-conductor/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/nova/nova:/var/lib/kolla/venv/lib/python2.7/site-packages/nova' if nova_dev_mode | bool else '' }}"
+    volumes: "{{ nova_conductor_default_volumes + nova_conductor_extra_volumes }}"
     dimensions: "{{ nova_conductor_dimensions }}"
   nova-compute:
     container_name: "nova_compute"
@@ -200,29 +153,14 @@ nova_services:
     privileged: True
     enabled: "{{ not enable_nova_fake | bool }}"
     ipc_mode: "host"
-    volumes:
-      - "{{ node_config_directory }}/nova-compute/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "/lib/modules:/lib/modules:ro"
-      - "/run:/run:shared"
-      - "/dev:/dev"
-      - "kolla_logs:/var/log/kolla/"
-      - "{% if enable_iscsid | bool %}iscsi_info:/etc/iscsi{% endif %}"
-      - "libvirtd:/var/lib/libvirt"
-      - "{{ nova_instance_datadir_volume }}:/var/lib/nova/"
-      - "{% if enable_shared_var_lib_nova_mnt | bool %}/var/lib/nova/mnt:/var/lib/nova/mnt:shared{% endif %}"
-      - "{{ kolla_dev_repos_directory ~ '/nova/nova:/var/lib/kolla/venv/lib/python2.7/site-packages/nova' if nova_dev_mode | bool else '' }}"
+    volumes: "{{ nova_compute_default_volumes + nova_compute_extra_volumes }}"
     dimensions: "{{ nova_compute_dimensions }}"
   nova-compute-ironic:
     container_name: "nova_compute_ironic"
     group: "nova-compute-ironic"
     image: "{{ nova_compute_ironic_image_full }}"
     enabled: "{{ enable_ironic | bool }}"
-    volumes:
-      - "{{ node_config_directory }}/nova-compute-ironic/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/nova/nova:/var/lib/kolla/venv/lib/python2.7/site-packages/nova' if nova_dev_mode | bool else '' }}"
+    volumes: "{{ nova_compute_ironic_default_volumes + nova_compute_ironic_extra_volumes }}"
     dimensions: "{{ nova_compute_ironic_dimensions }}"
 
 ####################
@@ -329,6 +267,94 @@ nova_conductor_dimensions: "{{ default_container_dimensions }}"
 nova_compute_dimensions: "{{ default_container_dimensions }}"
 nova_compute_ironic_dimensions: "{{ default_container_dimensions }}"
 
+nova_libvirt_default_volumes:
+  - "{{ node_config_directory }}/nova-libvirt/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "/lib/modules:/lib/modules:ro"
+  - "/run/:/run/:shared"
+  - "/dev:/dev"
+  - "/sys/fs/cgroup:/sys/fs/cgroup"
+  - "kolla_logs:/var/log/kolla/"
+  - "libvirtd:/var/lib/libvirt"
+  - "{{ nova_instance_datadir_volume }}:/var/lib/nova/"
+  - "{% if enable_shared_var_lib_nova_mnt | bool %}/var/lib/nova/mnt:/var/lib/nova/mnt:shared{% endif %}"
+  - "nova_libvirt_qemu:/etc/libvirt/qemu"
+  - "{{ kolla_dev_repos_directory ~ '/nova/nova:/var/lib/kolla/venv/lib/python2.7/site-packages/nova' if nova_dev_mode | bool else '' }}"
+nova_ssh_default_volumes:
+  - "{{ node_config_directory }}/nova-ssh/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla"
+  - "{{ nova_instance_datadir_volume }}:/var/lib/nova"
+  - "{% if enable_shared_var_lib_nova_mnt | bool %}/var/lib/nova/mnt:/var/lib/nova/mnt:shared{% endif %}"
+  - "{{ kolla_dev_repos_directory ~ '/nova/nova:/var/lib/kolla/venv/lib/python2.7/site-packages/nova' if nova_dev_mode | bool else '' }}"
+nova_api_default_volumes:
+  - "{{ node_config_directory }}/nova-api/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "/lib/modules:/lib/modules:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/nova/nova:/var/lib/kolla/venv/lib/python2.7/site-packages/nova' if nova_dev_mode | bool else '' }}"
+nova_consoleauth_default_volumes:
+  - "{{ node_config_directory }}/nova-consoleauth/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/nova/nova:/var/lib/kolla/venv/lib/python2.7/site-packages/nova' if nova_dev_mode | bool else '' }}"
+nova_novncproxy_default_volumes:
+  - "{{ node_config_directory }}/nova-novncproxy/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/nova/nova:/var/lib/kolla/venv/lib/python2.7/site-packages/nova' if nova_dev_mode | bool else '' }}"
+nova_scheduler_default_volumes:
+  - "{{ node_config_directory }}/nova-scheduler/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/nova/nova:/var/lib/kolla/venv/lib/python2.7/site-packages/nova' if nova_dev_mode | bool else '' }}"
+nova_spicehtml5proxy_default_volumes:
+  - "{{ node_config_directory }}/nova-spicehtml5proxy/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/nova/nova:/var/lib/kolla/venv/lib/python2.7/site-packages/nova' if nova_dev_mode | bool else '' }}"
+nova_serialproxy_default_volumes:
+  - "{{ node_config_directory }}/nova-serialproxy/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/nova/nova:/var/lib/kolla/venv/lib/python2.7/site-packages/nova' if nova_dev_mode | bool else '' }}"
+nova_conductor_default_volumes:
+  - "{{ node_config_directory }}/nova-conductor/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/nova/nova:/var/lib/kolla/venv/lib/python2.7/site-packages/nova' if nova_dev_mode | bool else '' }}"
+nova_compute_default_volumes:
+  - "{{ node_config_directory }}/nova-compute/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "/lib/modules:/lib/modules:ro"
+  - "/run:/run:shared"
+  - "/dev:/dev"
+  - "kolla_logs:/var/log/kolla/"
+  - "{% if enable_iscsid | bool %}iscsi_info:/etc/iscsi{% endif %}"
+  - "libvirtd:/var/lib/libvirt"
+  - "{{ nova_instance_datadir_volume }}:/var/lib/nova/"
+  - "{% if enable_shared_var_lib_nova_mnt | bool %}/var/lib/nova/mnt:/var/lib/nova/mnt:shared{% endif %}"
+  - "{{ kolla_dev_repos_directory ~ '/nova/nova:/var/lib/kolla/venv/lib/python2.7/site-packages/nova' if nova_dev_mode | bool else '' }}"
+nova_compute_ironic_default_volumes:
+  - "{{ node_config_directory }}/nova-compute-ironic/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/nova/nova:/var/lib/kolla/venv/lib/python2.7/site-packages/nova' if nova_dev_mode | bool else '' }}"
+
+nova_extra_volumes: "{{ default_extra_volumes }}"
+nova_libvirt_extra_volumes: "{{ nova_extra_volumes }}"
+nova_ssh_extra_volumes: "{{ nova_extra_volumes }}"
+nova_api_extra_volumes: "{{ nova_extra_volumes }}"
+nova_consoleauth_extra_volumes: "{{ nova_extra_volumes }}"
+nova_novncproxy_extra_volumes: "{{ nova_extra_volumes }}"
+nova_scheduler_extra_volumes: "{{ nova_extra_volumes }}"
+nova_spicehtml5proxy_extra_volumes: "{{ nova_extra_volumes }}"
+nova_serialproxy_extra_volumes: "{{ nova_extra_volumes }}"
+nova_conductor_extra_volumes: "{{ nova_extra_volumes }}"
+nova_compute_extra_volumes: "{{ nova_extra_volumes }}"
+nova_compute_ironic_extra_volumes: "{{ nova_extra_volumes }}"
+
+
 ####################
 # HAProxy
 ####################
diff --git a/ansible/roles/octavia/defaults/main.yml b/ansible/roles/octavia/defaults/main.yml
index 3ec8162564..984f990fca 100644
--- a/ansible/roles/octavia/defaults/main.yml
+++ b/ansible/roles/octavia/defaults/main.yml
@@ -7,10 +7,7 @@ octavia_services:
     group: octavia-api
     enabled: true
     image: "{{ octavia_api_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/octavia-api/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
+    volumes: "{{ octavia_api_default_volumes + octavia_api_extra_volumes }}"
     dimensions: "{{ octavia_api_dimensions }}"
     haproxy:
       octavia_api:
@@ -28,30 +25,21 @@ octavia_services:
     group: octavia-health-manager
     enabled: true
     image: "{{ octavia_health_manager_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/octavia-health-manager/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
+    volumes: "{{ octavia_health_manager_default_volumes + octavia_health_manager_extra_volumes }}"
     dimensions: "{{ octavia_health_manager_dimensions }}"
   octavia-housekeeping:
     container_name: octavia_housekeeping
     group: octavia-housekeeping
     enabled: true
     image: "{{ octavia_housekeeping_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/octavia-housekeeping/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
+    volumes: "{{ octavia_housekeeping_default_volumes + octavia_housekeeping_extra_volumes }}"
     dimensions: "{{ octavia_housekeeping_dimensions }}"
   octavia-worker:
     container_name: octavia_worker
     group: octavia-worker
     enabled: true
     image: "{{ octavia_worker_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/octavia-worker/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
+    volumes: "{{ octavia_worker_default_volumes + octavia_worker_extra_volumes }}"
     dimensions: "{{ octavia_worker_dimensions }}"
 
 octavia_required_roles:
@@ -97,6 +85,28 @@ octavia_health_manager_dimensions: "{{ default_container_dimensions }}"
 octavia_housekeeping_dimensions: "{{ default_container_dimensions }}"
 octavia_worker_dimensions: "{{ default_container_dimensions }}"
 
+octavia_api_default_volumes:
+  - "{{ node_config_directory }}/octavia-api/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+octavia_health_manager_default_volumes:
+  - "{{ node_config_directory }}/octavia-health-manager/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+octavia_housekeeping_default_volumes:
+  - "{{ node_config_directory }}/octavia-housekeeping/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+octavia_worker_default_volumes:
+  - "{{ node_config_directory }}/octavia-worker/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+
+octavia_extra_volumes: "{{ default_extra_volumes }}"
+octavia_api_extra_volumes: "{{ octavia_extra_volumes }}"
+octavia_health_manager_extra_volumes: "{{ octavia_extra_volumes }}"
+octavia_housekeeping_extra_volumes: "{{ octavia_extra_volumes }}"
+octavia_worker_extra_volumes: "{{ octavia_extra_volumes }}"
 
 ####################
 # OpenStack
diff --git a/ansible/roles/panko/defaults/main.yml b/ansible/roles/panko/defaults/main.yml
index c9cf7bb6e8..fca49b54e3 100644
--- a/ansible/roles/panko/defaults/main.yml
+++ b/ansible/roles/panko/defaults/main.yml
@@ -7,10 +7,7 @@ panko_services:
     group: panko-api
     enabled: true
     image: "{{ panko_api_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/panko-api/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
+    volumes: "{{ panko_api_default_volumes + panko_api_extra_volumes }}"
     dimensions: "{{ panko_api_dimensions }}"
     haproxy:
       panko_api:
@@ -43,6 +40,12 @@ panko_api_tag: "{{ openstack_release }}"
 panko_api_image_full: "{{ panko_api_image }}:{{ panko_api_tag }}"
 panko_api_dimensions: "{{ default_container_dimensions }}"
 
+panko_api_default_volumes:
+  - "{{ node_config_directory }}/panko-api/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+panko_api_extra_volumes: "{{ default_extra_volumes }}"
+
 ####################
 # OpenStack
 ####################
diff --git a/ansible/roles/placement/defaults/main.yml b/ansible/roles/placement/defaults/main.yml
index a25496f28d..bcc583124a 100644
--- a/ansible/roles/placement/defaults/main.yml
+++ b/ansible/roles/placement/defaults/main.yml
@@ -7,11 +7,7 @@ placement_services:
     group: "placement-api"
     image: "{{ placement_api_image_full }}"
     enabled: True
-    volumes:
-      - "{{ node_config_directory }}/placement-api/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/placement/placement:/var/lib/kolla/venv/lib/python2.7/site-packages/placement' if placement_dev_mode | bool else '' }}"
+    volumes: "{{ placement_api_default_volumes + placement_api_extra_volumes }}"
     dimensions: "{{ placement_api_dimensions }}"
     haproxy:
       placement_api:
@@ -46,6 +42,14 @@ placement_api_image_full: "{{ placement_api_image }}:{{ placement_api_tag }}"
 
 placement_api_dimensions: "{{ default_container_dimensions }}"
 
+placement_api_default_volumes:
+  - "{{ node_config_directory }}/placement-api/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/placement/placement:/var/lib/kolla/venv/lib/python2.7/site-packages/placement' if placement_dev_mode | bool else '' }}"
+
+placement_api_extra_volumes: "{{ default_extra_volumes }}"
+
 ####################
 # OpenStack
 ####################
diff --git a/ansible/roles/sahara/defaults/main.yml b/ansible/roles/sahara/defaults/main.yml
index 89edd7a580..0c86d2867a 100644
--- a/ansible/roles/sahara/defaults/main.yml
+++ b/ansible/roles/sahara/defaults/main.yml
@@ -7,12 +7,7 @@ sahara_services:
     group: sahara-api
     enabled: true
     image: "{{ sahara_api_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/sahara-api/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "sahara:/var/lib/sahara/"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/sahara/sahara:/var/lib/kolla/venv/lib/python2.7/site-packages/sahara' if sahara_dev_mode | bool else '' }}"
+    volumes: "{{ sahara_api_default_volumes + sahara_api_extra_volumes }}"
     dimensions: "{{ sahara_api_dimensions }}"
     haproxy:
       sahara_api:
@@ -31,13 +26,7 @@ sahara_services:
     enabled: true
     image: "{{ sahara_engine_image_full }}"
     privileged: True
-    volumes:
-      - "{{ node_config_directory }}/sahara-engine/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "sahara:/var/lib/sahara/"
-      - "kolla_logs:/var/log/kolla/"
-      - "/run:/run:shared"
-      - "{{ kolla_dev_repos_directory ~ '/sahara/sahara:/var/lib/kolla/venv/lib/python2.7/site-packages/sahara' if sahara_dev_mode | bool else '' }}"
+    volumes: "{{ sahara_engine_default_volumes + sahara_engine_extra_volumes }}"
     dimensions: "{{ sahara_engine_dimensions }}"
 
 
@@ -66,6 +55,24 @@ sahara_api_image_full: "{{ sahara_api_image }}:{{ sahara_api_tag }}"
 sahara_api_dimensions: "{{ default_container_dimensions }}"
 sahara_engine_dimensions: "{{ default_container_dimensions }}"
 
+sahara_api_default_volumes:
+  - "{{ node_config_directory }}/sahara-api/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "sahara:/var/lib/sahara/"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/sahara/sahara:/var/lib/kolla/venv/lib/python2.7/site-packages/sahara' if sahara_dev_mode | bool else '' }}"
+sahara_engine_default_volumes:
+  - "{{ node_config_directory }}/sahara-engine/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "sahara:/var/lib/sahara/"
+  - "kolla_logs:/var/log/kolla/"
+  - "/run:/run:shared"
+  - "{{ kolla_dev_repos_directory ~ '/sahara/sahara:/var/lib/kolla/venv/lib/python2.7/site-packages/sahara' if sahara_dev_mode | bool else '' }}"
+
+sahara_extra_volumes: "{{ default_extra_volumes }}"
+sahara_api_extra_volumes: "{{ sahara_extra_volumes }}"
+sahara_engine_extra_volumes: "{{ sahara_extra_volumes }}"
+
 ####################
 # OpenStack
 ####################
diff --git a/ansible/roles/senlin/defaults/main.yml b/ansible/roles/senlin/defaults/main.yml
index 56c6cd9a5b..35a8022d67 100644
--- a/ansible/roles/senlin/defaults/main.yml
+++ b/ansible/roles/senlin/defaults/main.yml
@@ -7,11 +7,7 @@ senlin_services:
     group: senlin-api
     enabled: true
     image: "{{ senlin_api_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/senlin-api/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/senlin/senlin:/var/lib/kolla/venv/lib/python2.7/site-packages/senlin' if senlin_dev_mode | bool else '' }}"
+    volumes: "{{ senlin_api_default_volumes + senlin_api_extra_volumes }}"
     dimensions: "{{ senlin_api_dimensions }}"
     haproxy:
       senlin_api:
@@ -31,11 +27,7 @@ senlin_services:
     group: senlin-engine
     enabled: true
     image: "{{ senlin_engine_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/senlin-engine/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/senlin/senlin:/var/lib/kolla/venv/lib/python2.7/site-packages/senlin' if senlin_dev_mode | bool else '' }}"
+    volumes: "{{ senlin_engine_default_volumes + senlin_engine_extra_volumes }}"
     dimensions: "{{ senlin_engine_dimensions }}"
 
 ####################
@@ -63,6 +55,20 @@ senlin_api_image_full: "{{ senlin_api_image }}:{{ senlin_api_tag }}"
 senlin_api_dimensions: "{{ default_container_dimensions }}"
 senlin_engine_dimensions: "{{ default_container_dimensions }}"
 
+senlin_api_default_volumes:
+  - "{{ node_config_directory }}/senlin-api/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/senlin/senlin:/var/lib/kolla/venv/lib/python2.7/site-packages/senlin' if senlin_dev_mode | bool else '' }}"
+senlin_engine_default_volumes:
+  - "{{ node_config_directory }}/senlin-engine/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/senlin/senlin:/var/lib/kolla/venv/lib/python2.7/site-packages/senlin' if senlin_dev_mode | bool else '' }}"
+
+senlin_extra_volumes: "{{ default_extra_volumes }}"
+senlin_api_extra_volumes: "{{ senlin_extra_volumes }}"
+senlin_engine_extra_volumes: "{{ senlin_extra_volumes }}"
 
 ####################
 # OpenStack
diff --git a/ansible/roles/solum/defaults/main.yml b/ansible/roles/solum/defaults/main.yml
index b75c56abe4..6bbb337a28 100644
--- a/ansible/roles/solum/defaults/main.yml
+++ b/ansible/roles/solum/defaults/main.yml
@@ -7,33 +7,21 @@ solum_services:
     group: solum-api
     enabled: true
     image: "{{ solum_api_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/solum-api/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/solum/solum:/var/lib/kolla/venv/lib/python2.7/site-packages/solum' if solum_dev_mode | bool else '' }}"
+    volumes: "{{ solum_api_default_volumes + solum_api_extra_volumes }}"
     dimensions: "{{ solum_api_dimensions }}"
   solum-worker:
     container_name: solum_worker
     group: solum-worker
     enabled: true
     image: "{{ solum_worker_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/solum-worker/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/solum/solum:/var/lib/kolla/venv/lib/python2.7/site-packages/solum' if solum_dev_mode | bool else '' }}"
+    volumes: "{{ solum_worker_default_volumes + solum_worker_extra_volumes }}"
     dimensions: "{{ solum_worker_dimensions }}"
   solum-deployer:
     container_name: solum_deployer
     group: solum-deployer
     enabled: true
     image: "{{ solum_deployer_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/solum-deployer/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/solum/solum:/var/lib/kolla/venv/lib/python2.7/site-packages/solum' if solum_dev_mode | bool else '' }}"
+    volumes: "{{ solum_deployer_default_volumes + solum_deployer_extra_volumes }}"
     dimensions: "{{ solum_deployer_dimensions }}"
     haproxy:
       solum_application_deployment:
@@ -65,11 +53,7 @@ solum_services:
     group: solum-conductor
     enabled: true
     image: "{{ solum_conductor_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/solum-conductor/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/solum/solum:/var/lib/kolla/venv/lib/python2.7/site-packages/solum' if solum_dev_mode | bool else '' }}"
+    volumes: "{{ solum_conductor_default_volumes + solum_conductor_extra_volumes }}"
     dimensions: "{{ solum_conductor_dimensions }}"
 
 ####################
@@ -107,6 +91,33 @@ solum_worker_dimensions: "{{ default_container_dimensions }}"
 solum_deployer_dimensions: "{{ default_container_dimensions }}"
 solum_conductor_dimensions: "{{ default_container_dimensions }}"
 
+solum_api_default_volumes:
+  - "{{ node_config_directory }}/solum-api/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/solum/solum:/var/lib/kolla/venv/lib/python2.7/site-packages/solum' if solum_dev_mode | bool else '' }}"
+solum_worker_default_volumes:
+  - "{{ node_config_directory }}/solum-worker/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/solum/solum:/var/lib/kolla/venv/lib/python2.7/site-packages/solum' if solum_dev_mode | bool else '' }}"
+solum_deployer_default_volumes:
+  - "{{ node_config_directory }}/solum-deployer/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/solum/solum:/var/lib/kolla/venv/lib/python2.7/site-packages/solum' if solum_dev_mode | bool else '' }}"
+solum_conductor_default_volumes:
+  - "{{ node_config_directory }}/solum-conductor/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/solum/solum:/var/lib/kolla/venv/lib/python2.7/site-packages/solum' if solum_dev_mode | bool else '' }}"
+
+solum_extra_volumes: "{{ default_extra_volumes }}"
+solum_api_extra_volumes: "{{ solum_extra_volumes }}"
+solum_worker_extra_volumes: "{{ solum_extra_volumes }}"
+solum_deployer_extra_volumes: "{{ solum_extra_volumes }}"
+solum_conductor_extra_volumes: "{{ solum_extra_volumes }}"
+
 ####################
 # OpenStack
 ####################
diff --git a/ansible/roles/tacker/defaults/main.yml b/ansible/roles/tacker/defaults/main.yml
index e53cdc55df..3b481634c6 100644
--- a/ansible/roles/tacker/defaults/main.yml
+++ b/ansible/roles/tacker/defaults/main.yml
@@ -7,11 +7,7 @@ tacker_services:
     group: "tacker-server"
     enabled: true
     image: "{{ tacker_server_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/tacker-server/:{{ container_config_directory }}/:ro"
-      - "{{ kolla_dev_repos_directory ~ '/tacker/tacker:/var/lib/kolla/venv/lib/python2.7/site-packages/tacker' if tacker_dev_mode | bool else '' }}"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
+    volumes: "{{ tacker_server_default_volumes + tacker_server_extra_volumes }}"
     dimensions: "{{ tacker_server_dimensions }}"
     haproxy:
       tacker_server:
@@ -29,11 +25,7 @@ tacker_services:
     group: "tacker-conductor"
     enabled: true
     image: "{{ tacker_conductor_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/tacker-conductor/:{{ container_config_directory }}/:ro"
-      - "{{ kolla_dev_repos_directory ~ '/tacker/tacker:/var/lib/kolla/venv/lib/python2.7/site-packages/tacker' if tacker_dev_mode | bool else '' }}"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
+    volumes: "{{ tacker_conductor_default_volumes + tacker_conductor_extra_volumes }}"
     dimensions: "{{ tacker_conductor_dimensions }}"
 
 ####################
@@ -60,6 +52,21 @@ tacker_conductor_image_full: "{{ tacker_conductor_image }}:{{ tacker_conductor_t
 tacker_server_dimensions: "{{ default_container_dimensions }}"
 tacker_conductor_dimensions: "{{ default_container_dimensions }}"
 
+tacker_server_default_volumes:
+  - "{{ node_config_directory }}/tacker-server/:{{ container_config_directory }}/:ro"
+  - "{{ kolla_dev_repos_directory ~ '/tacker/tacker:/var/lib/kolla/venv/lib/python2.7/site-packages/tacker' if tacker_dev_mode | bool else '' }}"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+tacker_conductor_default_volumes:
+  - "{{ node_config_directory }}/tacker-conductor/:{{ container_config_directory }}/:ro"
+  - "{{ kolla_dev_repos_directory ~ '/tacker/tacker:/var/lib/kolla/venv/lib/python2.7/site-packages/tacker' if tacker_dev_mode | bool else '' }}"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+
+tacker_extra_volumes: "{{ default_extra_volumes }}"
+tacker_server_extra_volumes: "{{ tacker_extra_volumes }}"
+tacker_conductor_extra_volumes: "{{ tacker_extra_volumes }}"
+
 ####################
 # OpenStack
 ####################
diff --git a/ansible/roles/trove/defaults/main.yml b/ansible/roles/trove/defaults/main.yml
index 370d6634b5..25f312df16 100644
--- a/ansible/roles/trove/defaults/main.yml
+++ b/ansible/roles/trove/defaults/main.yml
@@ -7,12 +7,7 @@ trove_services:
     group: trove-api
     enabled: true
     image: "{{ trove_api_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/trove-api/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/trove/trove:/var/lib/kolla/venv/lib/python2.7/site-packages/trove' if trove_dev_mode | bool else '' }}"
-      - "trove:/var/lib/trove/"
+    volumes: "{{ trove_api_default_volumes + trove_api_extra_volumes }}"
     dimensions: "{{ trove_api_dimensions }}"
     haproxy:
       trove_api:
@@ -30,24 +25,14 @@ trove_services:
     group: trove-conductor
     enabled: true
     image: "{{ trove_conductor_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/trove-conductor/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/trove/trove:/var/lib/kolla/venv/lib/python2.7/site-packages/trove' if trove_dev_mode | bool else '' }}"
-      - "trove:/var/lib/trove/"
+    volumes: "{{ trove_conductor_default_volumes + trove_conductor_extra_volumes }}"
     dimensions: "{{ trove_conductor_dimensions }}"
   trove-taskmanager:
     container_name: trove_taskmanager
     group: trove-taskmanager
     enabled: true
     image: "{{ trove_taskmanager_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/trove-taskmanager/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/trove/trove:/var/lib/kolla/venv/lib/python2.7/site-packages/trove' if trove_dev_mode | bool else '' }}"
-      - "trove:/var/lib/trove/"
+    volumes: "{{ trove_taskmanager_default_volumes + trove_taskmanager_extra_volumes }}"
     dimensions: "{{ trove_taskmanager_dimensions }}"
 
 
@@ -81,6 +66,29 @@ trove_api_dimensions: "{{ default_container_dimensions }}"
 trove_conductor_dimensions: "{{ default_container_dimensions }}"
 trove_taskmanager_dimensions: "{{ default_container_dimensions }}"
 
+trove_api_default_volumes:
+  - "{{ node_config_directory }}/trove-api/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/trove/trove:/var/lib/kolla/venv/lib/python2.7/site-packages/trove' if trove_dev_mode | bool else '' }}"
+  - "trove:/var/lib/trove/"
+trove_conductor_default_volumes:
+  - "{{ node_config_directory }}/trove-conductor/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/trove/trove:/var/lib/kolla/venv/lib/python2.7/site-packages/trove' if trove_dev_mode | bool else '' }}"
+  - "trove:/var/lib/trove/"
+trove_taskmanager_default_volumes:
+  - "{{ node_config_directory }}/trove-taskmanager/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/trove/trove:/var/lib/kolla/venv/lib/python2.7/site-packages/trove' if trove_dev_mode | bool else '' }}"
+  - "trove:/var/lib/trove/"
+
+trove_extra_volumes: "{{ default_extra_volumes }}"
+trove_api_extra_volumes: "{{ trove_extra_volumes }}"
+trove_conductor_extra_volumes: "{{ trove_extra_volumes }}"
+trove_taskmanager_extra_volumes: "{{ trove_extra_volumes }}"
 
 ####################
 # OpenStack
diff --git a/ansible/roles/vitrage/defaults/main.yml b/ansible/roles/vitrage/defaults/main.yml
index a952203684..fd1804c748 100644
--- a/ansible/roles/vitrage/defaults/main.yml
+++ b/ansible/roles/vitrage/defaults/main.yml
@@ -7,11 +7,7 @@ vitrage_services:
     group: vitrage-api
     enabled: true
     image: "{{ vitrage_api_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/vitrage-api/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "{{ kolla_dev_repos_directory ~ '/vitrage/vitrage:/var/lib/kolla/venv/lib/python2.7/site-packages/vitrage' if vitrage_dev_mode | bool else '' }}"
-      - "kolla_logs:/var/log/kolla/"
+    volumes: "{{ vitrage_api_default_volumes + vitrage_api_extra_volumes }}"
     dimensions: "{{ vitrage_api_dimensions }}"
     haproxy:
       vitrage_api:
@@ -29,33 +25,21 @@ vitrage_services:
     group: vitrage-notifier
     enabled: true
     image: "{{ vitrage_notifier_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/vitrage-notifier/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "{{ kolla_dev_repos_directory ~ '/vitrage/vitrage:/var/lib/kolla/venv/lib/python2.7/site-packages/vitrage' if vitrage_dev_mode | bool else '' }}"
-      - "kolla_logs:/var/log/kolla/"
+    volumes: "{{ vitrage_notifier_default_volumes + vitrage_notifier_extra_volumes }}"
     dimensions: "{{ vitrage_notifier_dimensions }}"
   vitrage-graph:
     container_name: vitrage_graph
     group: vitrage-graph
     enabled: true
     image: "{{ vitrage_graph_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/vitrage-graph/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "{{ kolla_dev_repos_directory ~ '/vitrage/vitrage:/var/lib/kolla/venv/lib/python2.7/site-packages/vitrage' if vitrage_dev_mode | bool else '' }}"
-      - "kolla_logs:/var/log/kolla/"
+    volumes: "{{ vitrage_graph_default_volumes + vitrage_graph_extra_volumes }}"
     dimensions: "{{ vitrage_graph_dimensions }}"
   vitrage-ml:
     container_name: vitrage_ml
     group: vitrage-ml
     enabled: true
     image: "{{ vitrage_ml_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/vitrage-ml/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "{{ kolla_dev_repos_directory ~ '/vitrage/vitrage:/var/lib/kolla/venv/lib/python2.7/site-packages/vitrage' if vitrage_dev_mode | bool else '' }}"
-      - "kolla_logs:/var/log/kolla/"
+    volumes: "{{ vitrage_ml_default_volumes + vitrage_ml_extra_volumes }}"
     dimensions: "{{ vitrage_ml_dimensions }}"
 
 ####################
@@ -93,6 +77,33 @@ vitrage_notifier_dimensions: "{{ default_container_dimensions }}"
 vitrage_graph_dimensions: "{{ default_container_dimensions }}"
 vitrage_ml_dimensions: "{{ default_container_dimensions }}"
 
+vitrage_api_default_volumes:
+  - "{{ node_config_directory }}/vitrage-api/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "{{ kolla_dev_repos_directory ~ '/vitrage/vitrage:/var/lib/kolla/venv/lib/python2.7/site-packages/vitrage' if vitrage_dev_mode | bool else '' }}"
+  - "kolla_logs:/var/log/kolla/"
+vitrage_notifier_default_volumes:
+  - "{{ node_config_directory }}/vitrage-notifier/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "{{ kolla_dev_repos_directory ~ '/vitrage/vitrage:/var/lib/kolla/venv/lib/python2.7/site-packages/vitrage' if vitrage_dev_mode | bool else '' }}"
+  - "kolla_logs:/var/log/kolla/"
+vitrage_graph_default_volumes:
+  - "{{ node_config_directory }}/vitrage-graph/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "{{ kolla_dev_repos_directory ~ '/vitrage/vitrage:/var/lib/kolla/venv/lib/python2.7/site-packages/vitrage' if vitrage_dev_mode | bool else '' }}"
+  - "kolla_logs:/var/log/kolla/"
+vitrage_ml_default_volumes:
+  - "{{ node_config_directory }}/vitrage-ml/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "{{ kolla_dev_repos_directory ~ '/vitrage/vitrage:/var/lib/kolla/venv/lib/python2.7/site-packages/vitrage' if vitrage_dev_mode | bool else '' }}"
+  - "kolla_logs:/var/log/kolla/"
+
+vitrage_extra_volumes: "{{ default_extra_volumes }}"
+vitrage_api_extra_volumes: "{{ vitrage_extra_volumes }}"
+vitrage_notifier_extra_volumes: "{{ vitrage_extra_volumes }}"
+vitrage_graph_extra_volumes: "{{ vitrage_extra_volumes }}"
+vitrage_ml_extra_volumes: "{{ vitrage_extra_volumes }}"
+
 ####################
 # OpenStack
 ####################
diff --git a/ansible/roles/watcher/defaults/main.yml b/ansible/roles/watcher/defaults/main.yml
index aab03f6e7c..002167bf32 100644
--- a/ansible/roles/watcher/defaults/main.yml
+++ b/ansible/roles/watcher/defaults/main.yml
@@ -7,11 +7,7 @@ watcher_services:
     group: watcher-api
     enabled: true
     image: "{{ watcher_api_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/watcher-api/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "{{ kolla_dev_repos_directory ~ '/watcher/watcher:/var/lib/kolla/venv/lib/python2.7/site-packages/watcher' if watcher_dev_mode | bool else '' }}"
-      - "kolla_logs:/var/log/kolla/"
+    volumes: "{{ watcher_api_default_volumes + watcher_api_extra_volumes }}"
     dimensions: "{{ watcher_api_dimensions }}"
     haproxy:
       watcher_api:
@@ -29,22 +25,14 @@ watcher_services:
     group: watcher-applier
     enabled: true
     image: "{{ watcher_applier_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/watcher-applier/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "{{ kolla_dev_repos_directory ~ '/watcher/watcher:/var/lib/kolla/venv/lib/python2.7/site-packages/watcher' if watcher_dev_mode | bool else '' }}"
-      - "kolla_logs:/var/log/kolla/"
+    volumes: "{{ watcher_applier_default_volumes + watcher_applier_extra_volumes }}"
     dimensions: "{{ watcher_applier_dimensions }}"
   watcher-engine:
     container_name: watcher_engine
     group: watcher-engine
     enabled: true
     image: "{{ watcher_engine_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/watcher-engine/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "{{ kolla_dev_repos_directory ~ '/watcher/watcher:/var/lib/kolla/venv/lib/python2.7/site-packages/watcher' if watcher_dev_mode | bool else '' }}"
-      - "kolla_logs:/var/log/kolla/"
+    volumes: "{{ watcher_engine_default_volumes + watcher_engine_extra_volumes }}"
     dimensions: "{{ watcher_engine_dimensions }}"
 
 
@@ -78,6 +66,27 @@ watcher_api_dimensions: "{{ default_container_dimensions }}"
 watcher_applier_dimensions: "{{ default_container_dimensions }}"
 watcher_engine_dimensions: "{{ default_container_dimensions }}"
 
+watcher_api_default_volumes:
+  - "{{ node_config_directory }}/watcher-api/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "{{ kolla_dev_repos_directory ~ '/watcher/watcher:/var/lib/kolla/venv/lib/python2.7/site-packages/watcher' if watcher_dev_mode | bool else '' }}"
+  - "kolla_logs:/var/log/kolla/"
+watcher_applier_default_volumes:
+  - "{{ node_config_directory }}/watcher-applier/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "{{ kolla_dev_repos_directory ~ '/watcher/watcher:/var/lib/kolla/venv/lib/python2.7/site-packages/watcher' if watcher_dev_mode | bool else '' }}"
+  - "kolla_logs:/var/log/kolla/"
+watcher_engine_default_volumes:
+  - "{{ node_config_directory }}/watcher-engine/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "{{ kolla_dev_repos_directory ~ '/watcher/watcher:/var/lib/kolla/venv/lib/python2.7/site-packages/watcher' if watcher_dev_mode | bool else '' }}"
+  - "kolla_logs:/var/log/kolla/"
+
+watcher_extra_volumes: "{{ default_extra_volumes }}"
+watcher_api_extra_volumes: "{{ watcher_extra_volumes }}"
+watcher_applier_extra_volumes: "{{ watcher_extra_volumes }}"
+watcher_engine_extra_volumes: "{{ watcher_extra_volumes }}"
+
 ####################
 # OpenStack
 ####################
diff --git a/ansible/roles/zun/defaults/main.yml b/ansible/roles/zun/defaults/main.yml
index a8c2991eac..4ed55c6bb3 100644
--- a/ansible/roles/zun/defaults/main.yml
+++ b/ansible/roles/zun/defaults/main.yml
@@ -7,11 +7,7 @@ zun_services:
     group: zun-api
     enabled: true
     image: "{{ zun_api_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/zun-api/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "{{ kolla_dev_repos_directory ~ '/zun/zun:/var/lib/kolla/venv/lib/python2.7/site-packages/zun' if zun_dev_mode | bool else '' }}"
-      - "kolla_logs:/var/log/kolla/"
+    volumes: "{{ zun_api_default_volumes + zun_api_extra_volumes }}"
     dimensions: "{{ zun_api_dimensions }}"
     haproxy:
       zun_api:
@@ -29,11 +25,7 @@ zun_services:
     group: zun-wsproxy
     enabled: true
     image: "{{ zun_wsproxy_image_full }}"
-    volumes:
-      - "{{ node_config_directory }}/zun-wsproxy/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "{{ kolla_dev_repos_directory ~ '/zun/zun:/var/lib/kolla/venv/lib/python2.7/site-packages/zun' if zun_dev_mode | bool else '' }}"
-      - "kolla_logs:/var/log/kolla/"
+    volumes: "{{ zun_wsproxy_default_volumes + zun_wsproxy_extra_volumes }}"
     dimensions: "{{ zun_wsproxy_dimensions }}"
     haproxy:
       zun_wsproxy:
@@ -52,14 +44,7 @@ zun_services:
     enabled: true
     image: "{{ zun_compute_image_full }}"
     privileged: True
-    volumes:
-      - "{{ node_config_directory }}/zun-compute/:{{ container_config_directory }}/:ro"
-      - "/etc/localtime:/etc/localtime:ro"
-      - "kolla_logs:/var/log/kolla/"
-      - "{{ kolla_dev_repos_directory ~ '/zun/zun:/var/lib/kolla/venv/lib/python2.7/site-packages/zun' if zun_dev_mode | bool else '' }}"
-      - "/run:/run:shared"
-      - "/usr/lib/docker:/usr/lib/docker"
-      - "/var/lib/docker:/var/lib/docker"
+    volumes: "{{ zun_compute_default_volumes + zun_compute_extra_volumes }}"
     dimensions: "{{ zun_compute_dimensions }}"
 
 ####################
@@ -92,6 +77,29 @@ zun_api_dimensions: "{{ default_container_dimensions }}"
 zun_wsproxy_dimensions: "{{ default_container_dimensions }}"
 zun_compute_dimensions: "{{ default_container_dimensions }}"
 
+zun_api_default_volumes:
+  - "{{ node_config_directory }}/zun-api/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "{{ kolla_dev_repos_directory ~ '/zun/zun:/var/lib/kolla/venv/lib/python2.7/site-packages/zun' if zun_dev_mode | bool else '' }}"
+  - "kolla_logs:/var/log/kolla/"
+zun_wsproxy_default_volumes:
+  - "{{ node_config_directory }}/zun-wsproxy/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "{{ kolla_dev_repos_directory ~ '/zun/zun:/var/lib/kolla/venv/lib/python2.7/site-packages/zun' if zun_dev_mode | bool else '' }}"
+  - "kolla_logs:/var/log/kolla/"
+zun_compute_default_volumes:
+  - "{{ node_config_directory }}/zun-compute/:{{ container_config_directory }}/:ro"
+  - "/etc/localtime:/etc/localtime:ro"
+  - "kolla_logs:/var/log/kolla/"
+  - "{{ kolla_dev_repos_directory ~ '/zun/zun:/var/lib/kolla/venv/lib/python2.7/site-packages/zun' if zun_dev_mode | bool else '' }}"
+  - "/run:/run:shared"
+  - "/usr/lib/docker:/usr/lib/docker"
+  - "/var/lib/docker:/var/lib/docker"
+
+zun_extra_volumes: "{{ default_extra_volumes }}"
+zun_api_extra_volumes: "{{ zun_extra_volumes }}"
+zun_wsproxy_extra_volumes: "{{ zun_extra_volumes }}"
+zun_compute_extra_volumes: "{{ zun_extra_volumes }}"
 
 ####################
 ## OpenStack
diff --git a/doc/source/admin/advanced-configuration.rst b/doc/source/admin/advanced-configuration.rst
index 1869a8b1eb..9a07d043c5 100644
--- a/doc/source/admin/advanced-configuration.rst
+++ b/doc/source/admin/advanced-configuration.rst
@@ -288,3 +288,40 @@ By default, Swift and HAProxy use ``local0`` and ``local1``, respectively.
    syslog_swift_facility: "local0"
    syslog_haproxy_facility: "local1"
 
+Mount additional Docker volumes in containers
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+It is sometimes useful to be able to mount additional Docker volumes into
+one or more containers. This may be to integrate 3rd party components into
+OpenStack, or to provide access to site-specific data such as x.509
+certificate bundles.
+
+Additional volumes may be specified at three levels:
+
+* globally
+* per-service (e.g. nova)
+* per-container (e.g. ``nova-api``)
+
+To specify additional volumes globally for all containers, set
+``default_extra_volumes`` in ``globals.yml``. For example:
+
+.. code-block:: yaml
+
+  default_extra_volumes:
+    - "/etc/foo:/etc/foo"
+
+To specify additional volumes for all containers in a service, set
+``<service_name>_extra_volumes`` in ``globals.yml``. For example:
+
+.. code-block:: yaml
+
+  nova_extra_volumes:
+    - "/etc/foo:/etc/foo"
+
+To specify additional volumes for a single container, set
+``<container_name>_extra_volumes`` in ``globals.yml``. For example:
+
+.. code-block:: yaml
+
+  nova_libvirt_extra_volumes:
+    - "/etc/foo:/etc/foo"
diff --git a/releasenotes/notes/support_extra_volumes-0598122ed90c8d02.yaml b/releasenotes/notes/support_extra_volumes-0598122ed90c8d02.yaml
new file mode 100644
index 0000000000..50c1504a92
--- /dev/null
+++ b/releasenotes/notes/support_extra_volumes-0598122ed90c8d02.yaml
@@ -0,0 +1,5 @@
+---
+features:
+  - |
+    Adds support for configuring the extra volumes.
+    Split container volumes into `<service_name>_default_volumes` and `<service_name>_extra_volumes`.