diff --git a/ansible/roles/aodh/defaults/main.yml b/ansible/roles/aodh/defaults/main.yml
index c3a888d0f1..ccae15b9f2 100644
--- a/ansible/roles/aodh/defaults/main.yml
+++ b/ansible/roles/aodh/defaults/main.yml
@@ -210,6 +210,7 @@ aodh_keystone_user: "aodh"
 
 openstack_aodh_auth: "{{ openstack_auth }}"
 
+aodh_api_workers: "{{ openstack_service_workers }}"
 
 ####################
 # Kolla
diff --git a/ansible/roles/aodh/templates/wsgi-aodh.conf.j2 b/ansible/roles/aodh/templates/wsgi-aodh.conf.j2
index 49aece190f..a1f61a0d0b 100644
--- a/ansible/roles/aodh/templates/wsgi-aodh.conf.j2
+++ b/ansible/roles/aodh/templates/wsgi-aodh.conf.j2
@@ -32,7 +32,7 @@ LogLevel info
   LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b %D \"%{Referer}i\" \"%{User-Agent}i\"" logformat
   CustomLog "{{ aodh_log_dir }}/aodh_wsgi_access.log" logformat
   WSGIApplicationGroup %{GLOBAL}
-  WSGIDaemonProcess aodh group=aodh processes={{ openstack_service_workers }} threads=1 user=aodh
+  WSGIDaemonProcess aodh group=aodh processes={{ aodh_api_workers }} threads=1 user=aodh
   WSGIProcessGroup aodh
   WSGIScriptAlias / "{{ binary_path }}/aodh-api"
 </VirtualHost>
diff --git a/ansible/roles/barbican/defaults/main.yml b/ansible/roles/barbican/defaults/main.yml
index 8463b3aa99..644dab37d8 100644
--- a/ansible/roles/barbican/defaults/main.yml
+++ b/ansible/roles/barbican/defaults/main.yml
@@ -160,6 +160,7 @@ barbican_audit_role: "audit"
 
 openstack_barbican_auth: "{{ openstack_auth }}"
 
+barbican_api_workers: "{{ openstack_service_workers }}"
 
 ####################
 # Kolla
diff --git a/ansible/roles/barbican/templates/barbican-api.ini.j2 b/ansible/roles/barbican/templates/barbican-api.ini.j2
index d0dfbbd37e..e3a88e2790 100644
--- a/ansible/roles/barbican/templates/barbican-api.ini.j2
+++ b/ansible/roles/barbican/templates/barbican-api.ini.j2
@@ -4,7 +4,7 @@ https-socket = {{ api_interface_address | put_address_in_context('url') }}:{{ ba
 {% else %}
 http-socket = {{ api_interface_address | put_address_in_context('url') }}:{{ barbican_api_listen_port }}
 {% endif %}
-processes = {{ openstack_service_workers }}
+processes = {{ barbican_api_workers }}
 lazy = true
 vacuum = true
 no-default-app = true
diff --git a/ansible/roles/cinder/defaults/main.yml b/ansible/roles/cinder/defaults/main.yml
index 48a46318fa..8d2f896d90 100644
--- a/ansible/roles/cinder/defaults/main.yml
+++ b/ansible/roles/cinder/defaults/main.yml
@@ -221,6 +221,7 @@ openstack_cinder_auth: "{{ openstack_auth }}"
 # allow room for slowness.
 cinder_rpc_version_startup_delay: 30
 
+cinder_api_workers: "{{ openstack_service_workers }}"
 
 ####################
 # Cinder
diff --git a/ansible/roles/cinder/templates/cinder-wsgi.conf.j2 b/ansible/roles/cinder/templates/cinder-wsgi.conf.j2
index 5ca975c208..deb4447e73 100644
--- a/ansible/roles/cinder/templates/cinder-wsgi.conf.j2
+++ b/ansible/roles/cinder/templates/cinder-wsgi.conf.j2
@@ -18,7 +18,7 @@ LogLevel info
 {% endif %}
 
 <VirtualHost *:{{ cinder_api_listen_port }}>
-    WSGIDaemonProcess cinder-api processes={{ openstack_service_workers }} threads=1 user=cinder group=cinder display-name=cinder-api
+    WSGIDaemonProcess cinder-api processes={{ cinder_api_workers }} threads=1 user=cinder group=cinder display-name=cinder-api
     WSGIProcessGroup cinder-api
     WSGIScriptAlias / /var/www/cgi-bin/cinder/cinder-wsgi
     WSGIApplicationGroup %{GLOBAL}
diff --git a/ansible/roles/cloudkitty/defaults/main.yml b/ansible/roles/cloudkitty/defaults/main.yml
index 8627be1cb4..68fdb40d6b 100644
--- a/ansible/roles/cloudkitty/defaults/main.yml
+++ b/ansible/roles/cloudkitty/defaults/main.yml
@@ -121,6 +121,8 @@ cloudkitty_keystone_user: "cloudkitty"
 
 openstack_cloudkitty_auth: "{{ openstack_auth }}"
 
+cloudkitty_api_workers: "{{ openstack_service_workers }}"
+cloudkitty_processor_workers: "{{ openstack_service_workers }}"
 
 ####################
 # Cloudkitty
diff --git a/ansible/roles/cloudkitty/templates/cloudkitty.conf.j2 b/ansible/roles/cloudkitty/templates/cloudkitty.conf.j2
index aa844cfb01..539331acd5 100644
--- a/ansible/roles/cloudkitty/templates/cloudkitty.conf.j2
+++ b/ansible/roles/cloudkitty/templates/cloudkitty.conf.j2
@@ -108,7 +108,7 @@ port = {{ cloudkitty_api_port }}
 
 [orchestrator]
 coordination_url = mysql://{{ cloudkitty_database_user }}:{{ cloudkitty_database_password }}@{{ cloudkitty_database_address }}/{{ cloudkitty_database_name }}
-max_workers = {{ openstack_service_workers }}
+max_workers = {{ cloudkitty_processor_workers }}
 
 [storage]
 backend = {{ cloudkitty_storage_backend }}
diff --git a/ansible/roles/cloudkitty/templates/wsgi-cloudkitty.conf.j2 b/ansible/roles/cloudkitty/templates/wsgi-cloudkitty.conf.j2
index 2ebbf8ca61..38a3150050 100644
--- a/ansible/roles/cloudkitty/templates/wsgi-cloudkitty.conf.j2
+++ b/ansible/roles/cloudkitty/templates/wsgi-cloudkitty.conf.j2
@@ -23,7 +23,7 @@ LogLevel info
   LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b %D \"%{Referer}i\" \"%{User-Agent}i\"" logformat
   CustomLog "{{ cloudkitty_log_dir }}/cloudkitty-api-access.log" logformat
   WSGIApplicationGroup %{GLOBAL}
-  WSGIDaemonProcess cloudkitty group=cloudkitty processes={{ openstack_service_workers }} threads=1 user=cloudkitty
+  WSGIDaemonProcess cloudkitty group=cloudkitty processes={{ cloudkitty_api_workers }} threads=1 user=cloudkitty
   WSGIProcessGroup cloudkitty
   WSGIScriptAlias / "{{ binary_path }}/cloudkitty-api"
 
diff --git a/ansible/roles/designate/defaults/main.yml b/ansible/roles/designate/defaults/main.yml
index 4346ca15ec..527cd9eb09 100644
--- a/ansible/roles/designate/defaults/main.yml
+++ b/ansible/roles/designate/defaults/main.yml
@@ -283,6 +283,12 @@ designate_logging_debug: "{{ openstack_logging_debug }}"
 
 openstack_designate_auth: "{{ openstack_auth }}"
 
+designate_api_workers: "{{ openstack_service_workers }}"
+designate_worker_workers: "{{ openstack_service_workers }}"
+designate_producer_workers: "{{ openstack_service_workers }}"
+designate_central_workers: "{{ openstack_service_workers }}"
+designate_sink_workers: "{{ openstack_service_workers }}"
+designate_mdns_workers: "{{ openstack_service_workers }}"
 
 ####################
 # Kolla
diff --git a/ansible/roles/designate/templates/designate.conf.j2 b/ansible/roles/designate/templates/designate.conf.j2
index 50e4dc31ca..368a5280cc 100644
--- a/ansible/roles/designate/templates/designate.conf.j2
+++ b/ansible/roles/designate/templates/designate.conf.j2
@@ -8,12 +8,12 @@ transport_url = {{ rpc_transport_url }}
 
 [service:central]
 default_pool_id = {{ designate_pool_id }}
-workers = {{ openstack_service_workers }}
+workers = {{ designate_central_workers }}
 
 [service:api]
 listen = {{ api_interface_address | put_address_in_context('url') }}:{{ designate_api_listen_port }}
 api_base_uri = {{ designate_internal_endpoint }}
-workers = {{ openstack_service_workers }}
+workers = {{ designate_api_workers }}
 enable_api_admin = True
 enable_host_header = True
 enabled_extensions_admin = quotas, reports
@@ -40,14 +40,14 @@ memcached_servers = {% for host in groups['memcached'] %}{{ 'api' | kolla_addres
 {% if service_name == 'designate-mdns' %}
 [service:mdns]
 listen = {{ 'dns' | kolla_address | put_address_in_context('url') }}:{{ designate_mdns_port }}
-workers = {{ openstack_service_workers }}
+workers = {{ designate_mdns_workers }}
 {% endif %}
 
 [service:worker]
-workers = {{ openstack_service_workers }}
+workers = {{ designate_worker_workers }}
 
 [service:producer]
-workers = {{ openstack_service_workers }}
+workers = {{ designate_producer_workers }}
 threads = 1000
 enabled_tasks = None
 
@@ -62,7 +62,7 @@ idle_timeout = 3600
 {% if service_name == 'designate-sink' and designate_enable_notifications_sink | bool %}
 [service:sink]
 enabled_notification_handlers = nova_fixed, neutron_floatingip
-workers = {{ openstack_service_workers }}
+workers = {{ designate_sink_workers }}
 
 [handler:nova_fixed]
 #NOTE: zone_id must be manually filled an ID from openstack zone list
diff --git a/ansible/roles/freezer/defaults/main.yml b/ansible/roles/freezer/defaults/main.yml
index 563f3e56e3..6d7ae1a66d 100644
--- a/ansible/roles/freezer/defaults/main.yml
+++ b/ansible/roles/freezer/defaults/main.yml
@@ -99,6 +99,7 @@ freezer_keystone_user: "freezer"
 
 openstack_freezer_auth: "{{ openstack_auth }}"
 
+freezer_api_workers: "{{ openstack_service_workers }}"
 
 ####################
 # Kolla
diff --git a/ansible/roles/freezer/templates/wsgi-freezer-api.conf.j2 b/ansible/roles/freezer/templates/wsgi-freezer-api.conf.j2
index a4662d7d7e..4cb1db2fa4 100644
--- a/ansible/roles/freezer/templates/wsgi-freezer-api.conf.j2
+++ b/ansible/roles/freezer/templates/wsgi-freezer-api.conf.j2
@@ -18,7 +18,7 @@ LogLevel info
 {% endif %}
 
 <VirtualHost *:{{ freezer_api_port }}>
-    WSGIDaemonProcess freezer-api processes={{ openstack_service_workers }} threads=1 user=freezer display-name=freezer-api
+    WSGIDaemonProcess freezer-api processes={{ freezer_api_workers }} threads=1 user=freezer display-name=freezer-api
     WSGIProcessGroup freezer-api
     WSGIApplicationGroup %{GLOBAL}
     WSGIScriptAlias / {{ python_path }}/freezer_api/cmd/wsgi.py
diff --git a/ansible/roles/glance/defaults/main.yml b/ansible/roles/glance/defaults/main.yml
index 94023dcb40..c857c57468 100644
--- a/ansible/roles/glance/defaults/main.yml
+++ b/ansible/roles/glance/defaults/main.yml
@@ -222,6 +222,8 @@ glance_logging_debug: "{{ openstack_logging_debug }}"
 
 openstack_glance_auth: "{{ openstack_auth }}"
 
+glance_api_workers: "{{ openstack_service_workers }}"
+
 ###################
 # Kolla
 ###################
diff --git a/ansible/roles/glance/templates/glance-api.conf.j2 b/ansible/roles/glance/templates/glance-api.conf.j2
index f49b5a8b55..2fcbaf963b 100644
--- a/ansible/roles/glance/templates/glance-api.conf.j2
+++ b/ansible/roles/glance/templates/glance-api.conf.j2
@@ -11,7 +11,7 @@ bind_host = 127.0.0.1
 bind_host = {{ api_interface_address }}
 {% endif %}
 bind_port = {{ glance_api_listen_port }}
-workers = {{ openstack_service_workers }}
+workers = {{ glance_api_workers }}
 
 {% if glance_store_backends %}
 enabled_backends = {% for key in glance_store_backends %}{{ key.name }}:{{ key.type }}{% if not loop.last %}, {% endif %}{% endfor %}
diff --git a/ansible/roles/gnocchi/defaults/main.yml b/ansible/roles/gnocchi/defaults/main.yml
index 615ed3bfb0..ac50a45462 100644
--- a/ansible/roles/gnocchi/defaults/main.yml
+++ b/ansible/roles/gnocchi/defaults/main.yml
@@ -165,6 +165,8 @@ gnocchi_keystone_user: "gnocchi"
 
 openstack_gnocchi_auth: "{{ openstack_auth }}"
 
+gnocchi_api_workers: "{{ openstack_service_workers }}"
+
 ####################
 # Keystone
 ####################
diff --git a/ansible/roles/gnocchi/templates/wsgi-gnocchi.conf.j2 b/ansible/roles/gnocchi/templates/wsgi-gnocchi.conf.j2
index 9c1021f47f..f3309bfef0 100644
--- a/ansible/roles/gnocchi/templates/wsgi-gnocchi.conf.j2
+++ b/ansible/roles/gnocchi/templates/wsgi-gnocchi.conf.j2
@@ -23,7 +23,7 @@ LogLevel info
   LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b %D \"%{Referer}i\" \"%{User-Agent}i\"" logformat
   CustomLog "{{ gnocchi_log_dir }}/gnocchi-api-access.log" logformat
   WSGIApplicationGroup %{GLOBAL}
-  WSGIDaemonProcess gnocchi group=gnocchi processes={{ openstack_service_workers }} threads=1 user=gnocchi
+  WSGIDaemonProcess gnocchi group=gnocchi processes={{ gnocchi_api_workers }} threads=1 user=gnocchi
   WSGIProcessGroup gnocchi
   WSGIScriptAlias / "{{ wsgi_path }}/gnocchi-api"
 
diff --git a/ansible/roles/heat/defaults/main.yml b/ansible/roles/heat/defaults/main.yml
index 6d76eed2ba..f9d75159b0 100644
--- a/ansible/roles/heat/defaults/main.yml
+++ b/ansible/roles/heat/defaults/main.yml
@@ -179,6 +179,9 @@ heat_stack_owner_role: "heat_stack_owner"
 
 openstack_heat_auth: "{{ openstack_auth }}"
 
+heat_api_cfn_workers: "{{ openstack_service_workers }}"
+heat_api_workers: "{{ openstack_service_workers }}"
+heat_engine_workers: "{{ openstack_service_workers }}"
 
 ####################
 # Kolla
diff --git a/ansible/roles/heat/templates/heat.conf.j2 b/ansible/roles/heat/templates/heat.conf.j2
index 88e0076c08..54c9c6e689 100644
--- a/ansible/roles/heat/templates/heat.conf.j2
+++ b/ansible/roles/heat/templates/heat.conf.j2
@@ -13,7 +13,7 @@ stack_domain_admin_password = {{ heat_domain_admin_password }}
 stack_user_domain_name = heat_user_domain
 
 {% if service_name == 'heat-engine' %}
-num_engine_workers = {{ openstack_service_workers }}
+num_engine_workers = {{ heat_engine_workers }}
 {% endif %}
 
 transport_url = {{ rpc_transport_url }}
diff --git a/ansible/roles/heat/templates/wsgi-heat-api-cfn.conf.j2 b/ansible/roles/heat/templates/wsgi-heat-api-cfn.conf.j2
index 742d986347..8459acf809 100644
--- a/ansible/roles/heat/templates/wsgi-heat-api-cfn.conf.j2
+++ b/ansible/roles/heat/templates/wsgi-heat-api-cfn.conf.j2
@@ -29,7 +29,7 @@ CustomLog "{{ heat_log_dir }}/apache-cfn-access.log" common
 </IfModule>
 
 <VirtualHost *:{{ heat_api_cfn_listen_port }}>
-    WSGIDaemonProcess heat-api-cfn processes={{ openstack_service_workers }} threads=1 user=heat group=heat display-name=heat-api-cfn
+    WSGIDaemonProcess heat-api-cfn processes={{ heat_api_cfn_workers }} threads=1 user=heat group=heat display-name=heat-api-cfn
     WSGIProcessGroup heat-api-cfn
     WSGIScriptAlias / {{ binary_path }}/heat-wsgi-api-cfn
     WSGIApplicationGroup %{GLOBAL}
diff --git a/ansible/roles/heat/templates/wsgi-heat-api.conf.j2 b/ansible/roles/heat/templates/wsgi-heat-api.conf.j2
index 4874314db0..8500ee895e 100644
--- a/ansible/roles/heat/templates/wsgi-heat-api.conf.j2
+++ b/ansible/roles/heat/templates/wsgi-heat-api.conf.j2
@@ -29,7 +29,7 @@ CustomLog "{{ heat_log_dir }}/apache-access.log" common
 </IfModule>
 
 <VirtualHost *:{{ heat_api_listen_port }}>
-    WSGIDaemonProcess heat-api processes={{ openstack_service_workers }} threads=1 user=heat group=heat display-name=heat-api
+    WSGIDaemonProcess heat-api processes={{ heat_api_workers }} threads=1 user=heat group=heat display-name=heat-api
     WSGIProcessGroup heat-api
     WSGIScriptAlias / {{ binary_path }}/heat-wsgi-api
     WSGIApplicationGroup %{GLOBAL}
diff --git a/ansible/roles/ironic/defaults/main.yml b/ansible/roles/ironic/defaults/main.yml
index 4ff45493e3..f6ae0e3e18 100644
--- a/ansible/roles/ironic/defaults/main.yml
+++ b/ansible/roles/ironic/defaults/main.yml
@@ -262,6 +262,7 @@ openstack_ironic_auth: "{{ openstack_auth }}"
 
 openstack_ironic_inspector_auth: "{{ openstack_auth }}"
 
+ironic_api_workers: "{{ openstack_service_workers }}"
 
 #########
 # Ironic
diff --git a/ansible/roles/ironic/templates/ironic-api-wsgi.conf.j2 b/ansible/roles/ironic/templates/ironic-api-wsgi.conf.j2
index 7b05325182..40b0546c8b 100644
--- a/ansible/roles/ironic/templates/ironic-api-wsgi.conf.j2
+++ b/ansible/roles/ironic/templates/ironic-api-wsgi.conf.j2
@@ -32,7 +32,7 @@ LogLevel info
 {% endif %}
 
 <VirtualHost *:{{ ironic_api_listen_port }}>
-    WSGIDaemonProcess ironic-api processes={{ openstack_service_workers }} threads=1 user=ironic group=ironic display-name=ironic-api
+    WSGIDaemonProcess ironic-api processes={{ ironic_api_workers }} threads=1 user=ironic group=ironic display-name=ironic-api
     WSGIProcessGroup ironic-api
     WSGIScriptAlias / {{ wsgi_directory }}/ironic-api-wsgi
     WSGIApplicationGroup %{GLOBAL}
diff --git a/ansible/roles/keystone/defaults/main.yml b/ansible/roles/keystone/defaults/main.yml
index b525db561f..c07c0b1fc0 100644
--- a/ansible/roles/keystone/defaults/main.yml
+++ b/ansible/roles/keystone/defaults/main.yml
@@ -166,6 +166,7 @@ keystone_logging_debug: "{{ openstack_logging_debug }}"
 
 openstack_keystone_auth: "{{ openstack_auth }}"
 
+keystone_api_workers: "{{ openstack_service_workers }}"
 
 ####################
 # Kolla
diff --git a/ansible/roles/keystone/templates/wsgi-keystone.conf.j2 b/ansible/roles/keystone/templates/wsgi-keystone.conf.j2
index d2a31abd7d..bdb096167c 100644
--- a/ansible/roles/keystone/templates/wsgi-keystone.conf.j2
+++ b/ansible/roles/keystone/templates/wsgi-keystone.conf.j2
@@ -39,7 +39,7 @@ LogLevel info
 
 
 <VirtualHost *:{{ keystone_public_listen_port }}>
-    WSGIDaemonProcess keystone-public processes={{ openstack_service_workers }} threads=1 user=keystone group=keystone display-name=keystone-public
+    WSGIDaemonProcess keystone-public processes={{ keystone_api_workers }} threads=1 user=keystone group=keystone display-name=keystone-public
     WSGIProcessGroup keystone-public
     WSGIScriptAlias / {{ binary_path }}/keystone-wsgi-public
     WSGIApplicationGroup %{GLOBAL}
@@ -112,7 +112,7 @@ LogLevel info
 # NOTE(yoctozepto): Admin port settings are kept only for upgrade compatibility.
 # TODO(yoctozepto): Remove after Zed.
 <VirtualHost *:{{ keystone_admin_listen_port }}>
-    WSGIDaemonProcess keystone-admin processes={{ openstack_service_workers }} threads=1 user=keystone group=keystone display-name=keystone-admin
+    WSGIDaemonProcess keystone-admin processes={{ keystone_api_workers }} threads=1 user=keystone group=keystone display-name=keystone-admin
     WSGIProcessGroup keystone-admin
     WSGIScriptAlias / {{ binary_path }}/keystone-wsgi-admin
     WSGIApplicationGroup %{GLOBAL}
diff --git a/ansible/roles/magnum/defaults/main.yml b/ansible/roles/magnum/defaults/main.yml
index 67bccb9192..a21e1aedfb 100644
--- a/ansible/roles/magnum/defaults/main.yml
+++ b/ansible/roles/magnum/defaults/main.yml
@@ -138,6 +138,8 @@ magnum_trustee_domain: "magnum"
 
 openstack_magnum_auth: "{{ openstack_auth }}"
 
+magnum_api_workers: "{{ openstack_service_workers }}"
+magnum_conductor_workers: "{{ openstack_service_workers }}"
 
 ####################
 # Kolla
diff --git a/ansible/roles/magnum/templates/magnum.conf.j2 b/ansible/roles/magnum/templates/magnum.conf.j2
index 86d1b17959..e0a2e0a9cd 100644
--- a/ansible/roles/magnum/templates/magnum.conf.j2
+++ b/ansible/roles/magnum/templates/magnum.conf.j2
@@ -11,7 +11,12 @@ transport_url = {{ rpc_transport_url }}
 [api]
 port = {{ magnum_api_port }}
 host = {{ api_interface_address }}
-workers = {{ openstack_service_workers }}
+workers = {{ magnum_api_workers }}
+{% endif %}
+
+{% if service_name == 'magnum-conductor' %}
+[conductor]
+workers = {{ magnum_conductor_workers }}
 {% endif %}
 
 [database]
diff --git a/ansible/roles/manila/defaults/main.yml b/ansible/roles/manila/defaults/main.yml
index e01958c70a..7045160e67 100644
--- a/ansible/roles/manila/defaults/main.yml
+++ b/ansible/roles/manila/defaults/main.yml
@@ -201,6 +201,7 @@ manila_service_instance_password: "manila"
 
 openstack_manila_auth: "{{ openstack_auth }}"
 
+manila_api_workers: "{{ openstack_service_workers }}"
 
 ####################
 # Manila
diff --git a/ansible/roles/manila/templates/manila.conf.j2 b/ansible/roles/manila/templates/manila.conf.j2
index 22940e9110..0151d2b5e4 100644
--- a/ansible/roles/manila/templates/manila.conf.j2
+++ b/ansible/roles/manila/templates/manila.conf.j2
@@ -8,7 +8,7 @@ my_ip = {{ api_interface_address }}
 
 osapi_share_listen = {{ api_interface_address }}
 osapi_share_listen_port = {{ manila_api_port }}
-osapi_share_workers = {{ openstack_service_workers }}
+osapi_share_workers = {{ manila_api_workers }}
 
 rootwrap_config = /etc/manila/rootwrap.conf
 api_paste_config = /etc/manila/api-paste.ini
diff --git a/ansible/roles/masakari/defaults/main.yml b/ansible/roles/masakari/defaults/main.yml
index 4dffcdb1bf..d9bc87a6fe 100644
--- a/ansible/roles/masakari/defaults/main.yml
+++ b/ansible/roles/masakari/defaults/main.yml
@@ -133,6 +133,7 @@ masakari_keystone_user: "masakari"
 
 openstack_masakari_auth: "{{ openstack_auth }}"
 
+masakari_api_workers: "{{ openstack_service_workers }}"
 
 ####################
 # Kolla
diff --git a/ansible/roles/masakari/templates/wsgi-masakari.conf.j2 b/ansible/roles/masakari/templates/wsgi-masakari.conf.j2
index bf015d66c6..1891dcde81 100644
--- a/ansible/roles/masakari/templates/wsgi-masakari.conf.j2
+++ b/ansible/roles/masakari/templates/wsgi-masakari.conf.j2
@@ -31,7 +31,7 @@ LogLevel info
   LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b %D \"%{Referer}i\" \"%{User-Agent}i\"" logformat
   CustomLog "{{ masakari_log_dir }}/masakari_wsgi_access.log" logformat
   WSGIApplicationGroup %{GLOBAL}
-  WSGIDaemonProcess masakari group=masakari processes={{ openstack_service_workers }} threads=1 user=masakari
+  WSGIDaemonProcess masakari group=masakari processes={{ masakari_api_workers }} threads=1 user=masakari
   WSGIProcessGroup masakari
   WSGIScriptAlias / "{{ binary_path }}/masakari-wsgi"
 </VirtualHost>
diff --git a/ansible/roles/mistral/defaults/main.yml b/ansible/roles/mistral/defaults/main.yml
index 08bbfaafca..c63cfbc6f5 100644
--- a/ansible/roles/mistral/defaults/main.yml
+++ b/ansible/roles/mistral/defaults/main.yml
@@ -189,6 +189,8 @@ mistral_keystone_user: "mistral"
 
 openstack_mistral_auth: "{{ openstack_auth }}"
 
+mistral_api_workers: "{{ openstack_service_workers }}"
+
 ####################
 # Kolla
 ####################
diff --git a/ansible/roles/mistral/templates/mistral.conf.j2 b/ansible/roles/mistral/templates/mistral.conf.j2
index 50df4d9c26..45d39e38e6 100644
--- a/ansible/roles/mistral/templates/mistral.conf.j2
+++ b/ansible/roles/mistral/templates/mistral.conf.j2
@@ -20,7 +20,7 @@ transport_url = {{ rpc_transport_url }}
 [api]
 host = {{ api_interface_address }}
 port = {{ mistral_api_port }}
-api_workers = {{ openstack_service_workers }}
+api_workers = {{ mistral_api_workers }}
 {% elif service_name == 'mistral-engine' %}
 [engine]
 host = {{ api_interface_address }}
diff --git a/ansible/roles/monasca/defaults/main.yml b/ansible/roles/monasca/defaults/main.yml
index 248d0790d9..76a6133e6f 100644
--- a/ansible/roles/monasca/defaults/main.yml
+++ b/ansible/roles/monasca/defaults/main.yml
@@ -331,6 +331,8 @@ monasca_api_public_endpoint: "{{ monasca_api_public_base_endpoint }}/v2.0"
 
 monasca_logging_debug: "{{ openstack_logging_debug }}"
 
+monasca_api_workers: "{{ openstack_service_workers }}"
+
 ####################
 # Keystone
 ####################
diff --git a/ansible/roles/monasca/templates/monasca-api/wsgi-api.conf.j2 b/ansible/roles/monasca/templates/monasca-api/wsgi-api.conf.j2
index 848b39ab5b..3848610f45 100644
--- a/ansible/roles/monasca/templates/monasca-api/wsgi-api.conf.j2
+++ b/ansible/roles/monasca/templates/monasca-api/wsgi-api.conf.j2
@@ -22,7 +22,7 @@ LogLevel info
     LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b %D \"%{Referer}i\" \"%{User-Agent}i\"" logformat
     CustomLog "{{ monasca_log_dir }}/monasca-api-access.log" logformat
     WSGIApplicationGroup %{GLOBAL}
-    WSGIDaemonProcess monasca-api group=monasca processes={{ openstack_service_workers }} threads=1 user=monasca
+    WSGIDaemonProcess monasca-api group=monasca processes={{ monasca_api_workers }} threads=1 user=monasca
     WSGIProcessGroup  monasca-api
     WSGIScriptAlias / {{ wsgi_path }}/wsgi.py
     WSGIPassAuthorization On
diff --git a/ansible/roles/murano/defaults/main.yml b/ansible/roles/murano/defaults/main.yml
index e725979547..e97ce75dbb 100644
--- a/ansible/roles/murano/defaults/main.yml
+++ b/ansible/roles/murano/defaults/main.yml
@@ -93,6 +93,9 @@ openstack_murano_auth: "{{ openstack_auth }}"
 
 murano_agent_timeout: 3600
 
+murano_engine_workers: "{{ openstack_service_workers }}"
+murano_api_workers: "{{ openstack_service_workers }}"
+
 ####################
 # Kolla
 ####################
diff --git a/ansible/roles/murano/templates/murano.conf.j2 b/ansible/roles/murano/templates/murano.conf.j2
index 1545690630..fa4797e776 100644
--- a/ansible/roles/murano/templates/murano.conf.j2
+++ b/ansible/roles/murano/templates/murano.conf.j2
@@ -11,7 +11,7 @@ bind_port = {{ murano_api_port }}
 transport_url = {{ rpc_transport_url }}
 
 [engine]
-engine_workers = {{ openstack_service_workers }}
+engine_workers = {{ murano_engine_workers }}
 agent_timeout = {{ murano_agent_timeout }}
 
 [database]
@@ -50,7 +50,7 @@ cafile = {{ openstack_cacert }}
 
 [murano]
 url = {{ murano_internal_endpoint }}
-api_workers = {{ openstack_service_workers }}
+api_workers = {{ murano_api_workers }}
 
 [oslo_messaging_notifications]
 transport_url = {{ notify_transport_url }}
diff --git a/ansible/roles/neutron/defaults/main.yml b/ansible/roles/neutron/defaults/main.yml
index 0b8ff80b1a..16e6a58651 100644
--- a/ansible/roles/neutron/defaults/main.yml
+++ b/ansible/roles/neutron/defaults/main.yml
@@ -585,6 +585,9 @@ neutron_l3_agent_host_ipv6_neigh_gc_thresh1: "{{ neutron_l3_agent_host_ipv4_neig
 neutron_l3_agent_host_ipv6_neigh_gc_thresh2: "{{ neutron_l3_agent_host_ipv4_neigh_gc_thresh2 }}"
 neutron_l3_agent_host_ipv6_neigh_gc_thresh3: "{{ neutron_l3_agent_host_ipv4_neigh_gc_thresh3 }}"
 
+neutron_api_workers: "{{ openstack_service_workers }}"
+neutron_metadata_workers: "{{ openstack_service_workers }}"
+
 ####################
 # Subprojects
 ####################
diff --git a/ansible/roles/neutron/templates/neutron.conf.j2 b/ansible/roles/neutron/templates/neutron.conf.j2
index edc7a3e3c5..62bd1711cb 100644
--- a/ansible/roles/neutron/templates/neutron.conf.j2
+++ b/ansible/roles/neutron/templates/neutron.conf.j2
@@ -17,8 +17,8 @@ bind_port = {{ neutron_server_listen_port }}
 
 api_paste_config = /etc/neutron/api-paste.ini
 
-api_workers = {{ openstack_service_workers }}
-metadata_workers = {{ openstack_service_workers }}
+api_workers = {{ neutron_api_workers }}
+metadata_workers = {{ neutron_metadata_workers }}
 rpc_workers = {{ openstack_service_rpc_workers }}
 rpc_state_report_workers = {{ openstack_service_rpc_workers }}
 
diff --git a/ansible/roles/nova-cell/defaults/main.yml b/ansible/roles/nova-cell/defaults/main.yml
index 79c4f70077..f2c95471d2 100644
--- a/ansible/roles/nova-cell/defaults/main.yml
+++ b/ansible/roles/nova-cell/defaults/main.yml
@@ -510,6 +510,8 @@ nova_cell_conductor_has_api_database: "yes"
 # register itself.
 nova_compute_registration_fatal: false
 
+nova_cell_conductor_workers: "{{ openstack_service_workers }}"
+
 ####################
 # Notification
 ####################
diff --git a/ansible/roles/nova-cell/templates/nova.conf.j2 b/ansible/roles/nova-cell/templates/nova.conf.j2
index 67547b1f26..114480def4 100644
--- a/ansible/roles/nova-cell/templates/nova.conf.j2
+++ b/ansible/roles/nova-cell/templates/nova.conf.j2
@@ -37,7 +37,7 @@ compute_monitors=nova.compute.monitors.cpu.virt_driver
 transport_url = {{ nova_cell_rpc_transport_url }}
 
 [conductor]
-workers = {{ openstack_service_workers }}
+workers = {{ nova_cell_conductor_workers }}
 
 {% if nova_console == 'novnc' %}
 [vnc]
diff --git a/ansible/roles/nova/defaults/main.yml b/ansible/roles/nova/defaults/main.yml
index 7354a0f79d..d35d241f54 100644
--- a/ansible/roles/nova/defaults/main.yml
+++ b/ansible/roles/nova/defaults/main.yml
@@ -207,6 +207,11 @@ nova_services_require_policy_json:
 
 nova_enable_external_metadata: "no"
 
+nova_api_workers: "{{ openstack_service_workers }}"
+nova_superconductor_workers: "{{ openstack_service_workers }}"
+nova_metadata_api_workers: "{{ openstack_service_workers }}"
+nova_scheduler_workers: "{{ openstack_service_workers }}"
+
 ####################
 # Keystone
 ####################
diff --git a/ansible/roles/nova/templates/nova-api-wsgi.conf.j2 b/ansible/roles/nova/templates/nova-api-wsgi.conf.j2
index ad5d69a5d6..f75d7ca83e 100644
--- a/ansible/roles/nova/templates/nova-api-wsgi.conf.j2
+++ b/ansible/roles/nova/templates/nova-api-wsgi.conf.j2
@@ -33,7 +33,7 @@ LogLevel info
 {% endif %}
 
 <VirtualHost *:{{ nova_api_listen_port }}>
-    WSGIDaemonProcess nova-api processes={{ openstack_service_workers }} threads=1 user=nova group=nova display-name=nova-api
+    WSGIDaemonProcess nova-api processes={{ nova_api_workers }} threads=1 user=nova group=nova display-name=nova-api
     WSGIProcessGroup nova-api
     WSGIScriptAlias / {{ wsgi_directory }}/nova-api-wsgi
     WSGIApplicationGroup %{GLOBAL}
@@ -52,7 +52,7 @@ LogLevel info
 </VirtualHost>
 
 <VirtualHost *:{{ nova_metadata_listen_port }}>
-    WSGIDaemonProcess nova-metadata processes={{ openstack_service_workers }} threads=1 user=nova group=nova display-name=nova-metadata-api
+    WSGIDaemonProcess nova-metadata processes={{ nova_metadata_api_workers }} threads=1 user=nova group=nova display-name=nova-metadata-api
     WSGIProcessGroup nova-metadata
     WSGIScriptAlias / {{ wsgi_directory }}/nova-metadata-wsgi
     WSGIApplicationGroup %{GLOBAL}
diff --git a/ansible/roles/nova/templates/nova.conf.j2 b/ansible/roles/nova/templates/nova.conf.j2
index fe50ba6888..50f169ab08 100644
--- a/ansible/roles/nova/templates/nova.conf.j2
+++ b/ansible/roles/nova/templates/nova.conf.j2
@@ -47,7 +47,7 @@ vendordata_jsonfile_path = /etc/nova/vendordata.json
 
 # Super conductor
 [conductor]
-workers = {{ openstack_service_workers }}
+workers = {{ nova_superconductor_workers }}
 
 [oslo_middleware]
 enable_proxy_headers_parsing = True
@@ -167,7 +167,7 @@ max_attempts = 10
 # periodic run must be disabled to avoid random failures (where both try to map)
 # -1 is default and means periodic discovery is disabled
 discover_hosts_in_cells_interval = -1
-workers = {{ openstack_service_workers }}
+workers = {{ nova_scheduler_workers }}
 
 [placement]
 auth_type = password
diff --git a/ansible/roles/octavia/defaults/main.yml b/ansible/roles/octavia/defaults/main.yml
index 72eb1ba662..91f41f4352 100644
--- a/ansible/roles/octavia/defaults/main.yml
+++ b/ansible/roles/octavia/defaults/main.yml
@@ -220,6 +220,10 @@ octavia_service_auth_project: "service"
 
 openstack_octavia_auth: "{{ openstack_auth }}"
 
+octavia_api_workers: "{{ openstack_service_workers }}"
+octavia_healthmanager_health_workers: "{{ openstack_service_workers }}"
+octavia_healthmanager_stats_workers: "{{ openstack_service_workers }}"
+
 ####################
 # Keystone
 ####################
diff --git a/ansible/roles/octavia/templates/octavia-wsgi.conf.j2 b/ansible/roles/octavia/templates/octavia-wsgi.conf.j2
index 4cbb56fc99..b5e5d1dba8 100644
--- a/ansible/roles/octavia/templates/octavia-wsgi.conf.j2
+++ b/ansible/roles/octavia/templates/octavia-wsgi.conf.j2
@@ -19,7 +19,7 @@ LogLevel info
 {% endif %}
 
 <VirtualHost *:{{ octavia_api_listen_port }}>
-    WSGIDaemonProcess octavia-api processes={{ openstack_service_workers }} threads=1 user=octavia group=octavia display-name=octavia-api
+    WSGIDaemonProcess octavia-api processes={{ octavia_api_workers }} threads=1 user=octavia group=octavia display-name=octavia-api
     WSGIProcessGroup octavia-api
     WSGIScriptAlias / {{ wsgi_directory }}/octavia-wsgi
     WSGIApplicationGroup %{GLOBAL}
diff --git a/ansible/roles/octavia/templates/octavia.conf.j2 b/ansible/roles/octavia/templates/octavia.conf.j2
index c548963357..5a23a0f563 100644
--- a/ansible/roles/octavia/templates/octavia.conf.j2
+++ b/ansible/roles/octavia/templates/octavia.conf.j2
@@ -80,8 +80,8 @@ bind_ip = {{ octavia_network_interface_address }}
 heartbeat_key = insecure
 controller_ip_port_list = {% for host in groups['octavia-health-manager'] %}{{ 'octavia_network' | kolla_address(host) | put_address_in_context('url') }}:{{ octavia_health_manager_port }}{% if not loop.last %},{% endif %}{% endfor %}
 
-stats_update_threads = {{ openstack_service_workers }}
-health_update_threads = {{ openstack_service_workers }}
+stats_update_threads = {{ octavia_healthmanager_stats_workers }}
+health_update_threads = {{ octavia_healthmanager_health_workers }}
 
 [controller_worker]
 amp_ssh_key_name = {{ octavia_amp_ssh_key_name }}
diff --git a/ansible/roles/placement/defaults/main.yml b/ansible/roles/placement/defaults/main.yml
index 26532f30ef..3a222b719a 100644
--- a/ansible/roles/placement/defaults/main.yml
+++ b/ansible/roles/placement/defaults/main.yml
@@ -88,6 +88,7 @@ placement_logging_debug: "{{ openstack_logging_debug }}"
 
 openstack_placement_auth: "{{ openstack_auth }}"
 
+placement_api_workers: "{{ openstack_service_workers }}"
 
 ####################
 # Notification
diff --git a/ansible/roles/placement/templates/placement-api-wsgi.conf.j2 b/ansible/roles/placement/templates/placement-api-wsgi.conf.j2
index 8fe8be01e2..37fece7bb1 100644
--- a/ansible/roles/placement/templates/placement-api-wsgi.conf.j2
+++ b/ansible/roles/placement/templates/placement-api-wsgi.conf.j2
@@ -20,7 +20,7 @@ LogLevel info
 {% endif %}
 
 <VirtualHost *:{{ placement_api_listen_port }}>
-    WSGIDaemonProcess placement-api processes={{ openstack_service_workers }} threads=1 user=placement group=placement display-name=placement-api
+    WSGIDaemonProcess placement-api processes={{ placement_api_workers }} threads=1 user=placement group=placement display-name=placement-api
     WSGIProcessGroup placement-api
     WSGIScriptAlias / {{ wsgi_directory }}/placement-api
     WSGIApplicationGroup %{GLOBAL}
diff --git a/ansible/roles/sahara/defaults/main.yml b/ansible/roles/sahara/defaults/main.yml
index 0c1e146b8b..7f1a82b707 100644
--- a/ansible/roles/sahara/defaults/main.yml
+++ b/ansible/roles/sahara/defaults/main.yml
@@ -125,6 +125,7 @@ sahara_keystone_user: "sahara"
 
 openstack_sahara_auth: "{{ openstack_auth }}"
 
+sahara_api_workers: "{{ openstack_service_workers }}"
 
 ####################
 ## Kolla
diff --git a/ansible/roles/sahara/templates/sahara.conf.j2 b/ansible/roles/sahara/templates/sahara.conf.j2
index fe34315b4f..2fc1edd5ec 100644
--- a/ansible/roles/sahara/templates/sahara.conf.j2
+++ b/ansible/roles/sahara/templates/sahara.conf.j2
@@ -5,7 +5,7 @@ port = {{ sahara_api_port }}
 host = {{ api_interface_address }}
 transport_url = {{ rpc_transport_url }}
 
-api_workers = {{ openstack_service_workers }}
+api_workers = {{ sahara_api_workers }}
 use_floating_ips = False
 use_namespaces = True
 use_rootwrap = True
diff --git a/ansible/roles/senlin/defaults/main.yml b/ansible/roles/senlin/defaults/main.yml
index ed81609d7a..591885baab 100644
--- a/ansible/roles/senlin/defaults/main.yml
+++ b/ansible/roles/senlin/defaults/main.yml
@@ -188,6 +188,10 @@ senlin_keystone_user: "senlin"
 
 openstack_senlin_auth: "{{ openstack_auth }}"
 
+senlin_api_workers: "{{ openstack_service_workers }}"
+senlin_conductor_workers: "{{ openstack_service_workers }}"
+senlin_engine_workers: "{{ openstack_service_workers }}"
+senlin_health_manager_workers: "{{ openstack_service_workers }}"
 
 ####################
 # Kolla
diff --git a/ansible/roles/senlin/templates/senlin.conf.j2 b/ansible/roles/senlin/templates/senlin.conf.j2
index d320dd685d..1a4259d09c 100644
--- a/ansible/roles/senlin/templates/senlin.conf.j2
+++ b/ansible/roles/senlin/templates/senlin.conf.j2
@@ -9,7 +9,7 @@ transport_url = {{ rpc_transport_url }}
 [senlin_api]
 bind_host = {{ api_interface_address }}
 bind_port = {{ senlin_api_listen_port }}
-workers = {{ openstack_service_workers }}
+workers = {{ senlin_api_workers }}
 {% endif %}
 
 [authentication]
@@ -22,7 +22,7 @@ service_project_domain = default
 
 {% if service_name == 'senlin-conductor' %}
 [conductor]
-workers = {{ openstack_service_workers }}
+workers = {{ senlin_conductor_workers }}
 {% endif %}
 
 [database]
@@ -33,12 +33,12 @@ max_retries = -1
 
 {% if service_name == 'senlin-engine' %}
 [engine]
-workers = {{ openstack_service_workers }}
+workers = {{ senlin_engine_workers }}
 {% endif %}
 
 {% if service_name == 'senlin-health-manager' %}
 [health_manager]
-workers = {{ openstack_service_workers }}
+workers = {{ senlin_health_manager_workers }}
 {% endif %}
 
 [keystone_authtoken]
diff --git a/ansible/roles/solum/defaults/main.yml b/ansible/roles/solum/defaults/main.yml
index b1166446c9..77c2c4c795 100644
--- a/ansible/roles/solum/defaults/main.yml
+++ b/ansible/roles/solum/defaults/main.yml
@@ -203,6 +203,7 @@ solum_keystone_user: "solum"
 
 openstack_solum_auth: "{{ openstack_auth }}"
 
+solum_api_workers: "{{ openstack_service_workers }}"
 
 ####################
 # Kolla
diff --git a/ansible/roles/solum/templates/solum.conf.j2 b/ansible/roles/solum/templates/solum.conf.j2
index 2023e73459..a62dc6fde7 100644
--- a/ansible/roles/solum/templates/solum.conf.j2
+++ b/ansible/roles/solum/templates/solum.conf.j2
@@ -11,7 +11,7 @@ bind_port = {{ solum_application_deployment_port }}
 [api]
 image_format = vm
 port = {{ solum_application_deployment_port }}
-workers = {{ openstack_service_workers }}
+workers = {{ solum_api_workers }}
 {% if service_name == 'solum-api' %}
 host = {{ api_interface_address }}
 {% endif %}
diff --git a/ansible/roles/swift/defaults/main.yml b/ansible/roles/swift/defaults/main.yml
index 82180e164d..c1e64c8bdc 100644
--- a/ansible/roles/swift/defaults/main.yml
+++ b/ansible/roles/swift/defaults/main.yml
@@ -73,6 +73,11 @@ swift_enable_rolling_upgrade: "yes"
 
 swift_extra_ring_files: []
 
+swift_account_workers: "{{ openstack_service_workers }}"
+swift_container_workers: "{{ openstack_service_workers }}"
+swift_object_workers: "{{ openstack_service_workers }}"
+swift_proxy_server_workers: "{{ openstack_service_workers }}"
+
 ####################
 # Keystone
 ####################
diff --git a/ansible/roles/swift/templates/account.conf.j2 b/ansible/roles/swift/templates/account.conf.j2
index 3ec7d4371b..e12891c3c4 100644
--- a/ansible/roles/swift/templates/account.conf.j2
+++ b/ansible/roles/swift/templates/account.conf.j2
@@ -9,7 +9,7 @@ log_udp_port = {{ syslog_udp_port }}
 log_name = {{ service_name }}
 log_facility = {{ syslog_swift_facility }}
 log_level = {{ swift_log_level }}
-workers = {{ openstack_service_workers }}
+workers = {{ swift_account_workers }}
 
 [pipeline:main]
 pipeline = {% if enable_swift_recon %}recon {% endif %}account-server
diff --git a/ansible/roles/swift/templates/container.conf.j2 b/ansible/roles/swift/templates/container.conf.j2
index f0761c09f4..1c6a95b7e0 100644
--- a/ansible/roles/swift/templates/container.conf.j2
+++ b/ansible/roles/swift/templates/container.conf.j2
@@ -9,7 +9,7 @@ log_udp_port = {{ syslog_udp_port }}
 log_name = {{ service_name }}
 log_facility = {{ syslog_swift_facility }}
 log_level = {{ swift_log_level }}
-workers = {{ openstack_service_workers }}
+workers = {{ swift_container_workers }}
 
 [pipeline:main]
 pipeline = {% if enable_swift_recon %}recon {% endif %}container-server
diff --git a/ansible/roles/swift/templates/object.conf.j2 b/ansible/roles/swift/templates/object.conf.j2
index ff889ebe26..0c26734b67 100644
--- a/ansible/roles/swift/templates/object.conf.j2
+++ b/ansible/roles/swift/templates/object.conf.j2
@@ -10,7 +10,7 @@ log_udp_port = {{ syslog_udp_port }}
 log_name = {{ service_name }}
 log_facility = {{ syslog_swift_facility }}
 log_level = {{ swift_log_level }}
-workers = {{ openstack_service_workers }}
+workers = {{ swift_object_workers }}
 
 [pipeline:main]
 {% if service_name == 'swift-object-expirer' %}
diff --git a/ansible/roles/swift/templates/proxy-server.conf.j2 b/ansible/roles/swift/templates/proxy-server.conf.j2
index 734299f628..c2544cd0fa 100644
--- a/ansible/roles/swift/templates/proxy-server.conf.j2
+++ b/ansible/roles/swift/templates/proxy-server.conf.j2
@@ -7,7 +7,7 @@ log_udp_port = {{ syslog_udp_port }}
 log_name = {{ service_name }}
 log_facility = {{ syslog_swift_facility }}
 log_level = {{ swift_log_level }}
-workers = {{ openstack_service_workers }}
+workers = {{ swift_proxy_server_workers }}
 
 [pipeline:main]
 pipeline = catch_errors gatekeeper healthcheck cache container_sync bulk tempurl ratelimit authtoken {% if enable_swift_s3api | bool %}s3api s3token {% endif %}keystoneauth container_quotas account_quotas slo dlo {% if enable_ceilometer | bool %}ceilometer {% endif %}proxy-server
diff --git a/ansible/roles/tacker/defaults/main.yml b/ansible/roles/tacker/defaults/main.yml
index aa67d1a549..322dc3f7da 100644
--- a/ansible/roles/tacker/defaults/main.yml
+++ b/ansible/roles/tacker/defaults/main.yml
@@ -136,6 +136,8 @@ tacker_keystone_user: "tacker"
 
 openstack_tacker_auth: "{{ openstack_auth }}"
 
+tacker_api_workers: "{{ openstack_service_workers }}"
+
 ###################
 # Kolla
 ####################
diff --git a/ansible/roles/tacker/templates/tacker.conf.j2 b/ansible/roles/tacker/templates/tacker.conf.j2
index 54ee902a2c..c5fff78155 100644
--- a/ansible/roles/tacker/templates/tacker.conf.j2
+++ b/ansible/roles/tacker/templates/tacker.conf.j2
@@ -6,7 +6,7 @@ transport_url = {{ rpc_transport_url }}
 
 bind_host = {{ api_interface_address }}
 bind_port = {{ tacker_server_port }}
-api_workers = {{ openstack_service_workers }}
+api_workers = {{ tacker_api_workers }}
 service_plugins = nfvo,vnfm
 
 [nfvo]
diff --git a/ansible/roles/trove/defaults/main.yml b/ansible/roles/trove/defaults/main.yml
index 1a64457676..ec74b61580 100644
--- a/ansible/roles/trove/defaults/main.yml
+++ b/ansible/roles/trove/defaults/main.yml
@@ -157,6 +157,7 @@ trove_keystone_user: "trove"
 
 openstack_trove_auth: "{{ openstack_auth }}"
 
+trove_api_workers: "{{ openstack_service_workers }}"
 
 ####################
 # Kolla
diff --git a/ansible/roles/trove/templates/trove.conf.j2 b/ansible/roles/trove/templates/trove.conf.j2
index cd878394aa..993fe7984c 100644
--- a/ansible/roles/trove/templates/trove.conf.j2
+++ b/ansible/roles/trove/templates/trove.conf.j2
@@ -7,7 +7,7 @@ host = {{ api_interface_address }}
 
 bind_port = {{ trove_api_port }}
 bind_host = {{ api_interface_address }}
-trove_api_workers = {{ openstack_service_workers }}
+trove_api_workers = {{ trove_api_workers }}
 auth_strategy = keystone
 
 transport_url = {{ rpc_transport_url }}
diff --git a/ansible/roles/vitrage/defaults/main.yml b/ansible/roles/vitrage/defaults/main.yml
index cbc5ed5521..e5baff59dd 100644
--- a/ansible/roles/vitrage/defaults/main.yml
+++ b/ansible/roles/vitrage/defaults/main.yml
@@ -217,6 +217,8 @@ vitrage_keystone_user: "vitrage"
 
 openstack_vitrage_auth: "{{ openstack_auth }}"
 
+vitrage_api_workers: "{{ openstack_service_workers }}"
+
 #####################
 # Datasources
 #####################
diff --git a/ansible/roles/vitrage/templates/wsgi-vitrage.conf.j2 b/ansible/roles/vitrage/templates/wsgi-vitrage.conf.j2
index 9a843e8aaf..9b54e8b012 100644
--- a/ansible/roles/vitrage/templates/wsgi-vitrage.conf.j2
+++ b/ansible/roles/vitrage/templates/wsgi-vitrage.conf.j2
@@ -34,7 +34,7 @@ LogLevel info
   ServerSignature Off
   CustomLog "{{ vitrage_log_dir }}/vitrage_wsgi_access.log" combined
   WSGIApplicationGroup %{GLOBAL}
-  WSGIDaemonProcess vitrage group=vitrage processes={{ openstack_service_workers }} threads=1 user=vitrage
+  WSGIDaemonProcess vitrage group=vitrage processes={{ vitrage_api_workers }} threads=1 user=vitrage
   WSGIProcessGroup vitrage
   WSGIScriptAlias / "/var/www/cgi-bin/vitrage/app.wsgi"
 {% if enable_vitrage_prometheus_datasource | bool %}
diff --git a/ansible/roles/watcher/defaults/main.yml b/ansible/roles/watcher/defaults/main.yml
index 80ad86db57..39f498b273 100644
--- a/ansible/roles/watcher/defaults/main.yml
+++ b/ansible/roles/watcher/defaults/main.yml
@@ -154,6 +154,7 @@ watcher_keystone_user: "watcher"
 
 openstack_watcher_auth: "{{ openstack_auth }}"
 
+watcher_api_workers: "{{ openstack_service_workers }}"
 
 ####################
 # Kolla
diff --git a/ansible/roles/watcher/templates/watcher.conf.j2 b/ansible/roles/watcher/templates/watcher.conf.j2
index 99737d5b5e..c1c6213b9b 100644
--- a/ansible/roles/watcher/templates/watcher.conf.j2
+++ b/ansible/roles/watcher/templates/watcher.conf.j2
@@ -9,7 +9,7 @@ transport_url = {{ rpc_transport_url }}
 [api]
 host = {{ api_interface_address }}
 port = {{ watcher_api_port }}
-workers = {{ openstack_service_workers }}
+workers = {{ watcher_api_workers }}
 {% endif %}
 
 [database]
diff --git a/ansible/roles/zun/defaults/main.yml b/ansible/roles/zun/defaults/main.yml
index bcdd17192c..4f2889f779 100644
--- a/ansible/roles/zun/defaults/main.yml
+++ b/ansible/roles/zun/defaults/main.yml
@@ -207,6 +207,7 @@ zun_keystone_user: "zun"
 
 openstack_zun_auth: "{{ openstack_auth }}"
 
+zun_api_workers: "{{ openstack_service_workers }}"
 
 ####################
 # Kolla
diff --git a/ansible/roles/zun/templates/wsgi-zun.conf.j2 b/ansible/roles/zun/templates/wsgi-zun.conf.j2
index 9e09779b6e..725b95597f 100644
--- a/ansible/roles/zun/templates/wsgi-zun.conf.j2
+++ b/ansible/roles/zun/templates/wsgi-zun.conf.j2
@@ -35,7 +35,7 @@ LogLevel info
   LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b %D \"%{Referer}i\" \"%{User-Agent}i\"" logformat
   CustomLog "{{ zun_log_dir }}/zun_api_wsgi_access.log" logformat
   WSGIApplicationGroup %{GLOBAL}
-  WSGIDaemonProcess zun group=zun processes={{ openstack_service_workers }} threads=1 user=zun
+  WSGIDaemonProcess zun group=zun processes={{ zun_api_workers }} threads=1 user=zun
   WSGIProcessGroup zun
   WSGIScriptAlias / "/var/www/cgi-bin/zun/app.wsgi"
 </VirtualHost>