From 3e8db91a1e789f0c1d9952d1ba3b4006c31a8c9d Mon Sep 17 00:00:00 2001
From: Michal Arbet <michal.arbet@ultimum.io>
Date: Fri, 8 Oct 2021 15:43:02 +0200
Subject: [PATCH] Add api_workers for each service to defaults

Render {{ openstack_service_workers }} for workers
of each openstack service is not enough. There are
several services which has to have more workers because
there are more requests sent to them.

This patch is just adding default value for workers for
each service and sets {{ openstack_service_workers }} as
default, so value can be overrided in hostvars per server.
Nothing changed for normal user.

Change-Id: Ifa5863f8ec865bbf8e39c9b2add42c92abe40616
---
 ansible/roles/aodh/defaults/main.yml                 |  1 +
 ansible/roles/aodh/templates/wsgi-aodh.conf.j2       |  2 +-
 ansible/roles/barbican/defaults/main.yml             |  1 +
 ansible/roles/barbican/templates/barbican-api.ini.j2 |  2 +-
 ansible/roles/cinder/defaults/main.yml               |  1 +
 ansible/roles/cinder/templates/cinder-wsgi.conf.j2   |  2 +-
 ansible/roles/cloudkitty/defaults/main.yml           |  2 ++
 .../roles/cloudkitty/templates/cloudkitty.conf.j2    |  2 +-
 .../cloudkitty/templates/wsgi-cloudkitty.conf.j2     |  2 +-
 ansible/roles/designate/defaults/main.yml            |  6 ++++++
 ansible/roles/designate/templates/designate.conf.j2  | 12 ++++++------
 ansible/roles/freezer/defaults/main.yml              |  1 +
 .../roles/freezer/templates/wsgi-freezer-api.conf.j2 |  2 +-
 ansible/roles/glance/defaults/main.yml               |  2 ++
 ansible/roles/glance/templates/glance-api.conf.j2    |  2 +-
 ansible/roles/gnocchi/defaults/main.yml              |  2 ++
 ansible/roles/gnocchi/templates/wsgi-gnocchi.conf.j2 |  2 +-
 ansible/roles/heat/defaults/main.yml                 |  3 +++
 ansible/roles/heat/templates/heat.conf.j2            |  2 +-
 .../roles/heat/templates/wsgi-heat-api-cfn.conf.j2   |  2 +-
 ansible/roles/heat/templates/wsgi-heat-api.conf.j2   |  2 +-
 ansible/roles/ironic/defaults/main.yml               |  1 +
 .../roles/ironic/templates/ironic-api-wsgi.conf.j2   |  2 +-
 ansible/roles/keystone/defaults/main.yml             |  1 +
 .../roles/keystone/templates/wsgi-keystone.conf.j2   |  4 ++--
 ansible/roles/magnum/defaults/main.yml               |  2 ++
 ansible/roles/magnum/templates/magnum.conf.j2        |  7 ++++++-
 ansible/roles/manila/defaults/main.yml               |  1 +
 ansible/roles/manila/templates/manila.conf.j2        |  2 +-
 ansible/roles/masakari/defaults/main.yml             |  1 +
 .../roles/masakari/templates/wsgi-masakari.conf.j2   |  2 +-
 ansible/roles/mistral/defaults/main.yml              |  2 ++
 ansible/roles/mistral/templates/mistral.conf.j2      |  2 +-
 ansible/roles/monasca/defaults/main.yml              |  2 ++
 .../monasca/templates/monasca-api/wsgi-api.conf.j2   |  2 +-
 ansible/roles/murano/defaults/main.yml               |  3 +++
 ansible/roles/murano/templates/murano.conf.j2        |  4 ++--
 ansible/roles/neutron/defaults/main.yml              |  3 +++
 ansible/roles/neutron/templates/neutron.conf.j2      |  4 ++--
 ansible/roles/nova-cell/defaults/main.yml            |  2 ++
 ansible/roles/nova-cell/templates/nova.conf.j2       |  2 +-
 ansible/roles/nova/defaults/main.yml                 |  5 +++++
 ansible/roles/nova/templates/nova-api-wsgi.conf.j2   |  4 ++--
 ansible/roles/nova/templates/nova.conf.j2            |  4 ++--
 ansible/roles/octavia/defaults/main.yml              |  4 ++++
 ansible/roles/octavia/templates/octavia-wsgi.conf.j2 |  2 +-
 ansible/roles/octavia/templates/octavia.conf.j2      |  4 ++--
 ansible/roles/placement/defaults/main.yml            |  1 +
 .../placement/templates/placement-api-wsgi.conf.j2   |  2 +-
 ansible/roles/sahara/defaults/main.yml               |  1 +
 ansible/roles/sahara/templates/sahara.conf.j2        |  2 +-
 ansible/roles/senlin/defaults/main.yml               |  4 ++++
 ansible/roles/senlin/templates/senlin.conf.j2        |  8 ++++----
 ansible/roles/solum/defaults/main.yml                |  1 +
 ansible/roles/solum/templates/solum.conf.j2          |  2 +-
 ansible/roles/swift/defaults/main.yml                |  5 +++++
 ansible/roles/swift/templates/account.conf.j2        |  2 +-
 ansible/roles/swift/templates/container.conf.j2      |  2 +-
 ansible/roles/swift/templates/object.conf.j2         |  2 +-
 ansible/roles/swift/templates/proxy-server.conf.j2   |  2 +-
 ansible/roles/tacker/defaults/main.yml               |  2 ++
 ansible/roles/tacker/templates/tacker.conf.j2        |  2 +-
 ansible/roles/trove/defaults/main.yml                |  1 +
 ansible/roles/trove/templates/trove.conf.j2          |  2 +-
 ansible/roles/vitrage/defaults/main.yml              |  2 ++
 ansible/roles/vitrage/templates/wsgi-vitrage.conf.j2 |  2 +-
 ansible/roles/watcher/defaults/main.yml              |  1 +
 ansible/roles/watcher/templates/watcher.conf.j2      |  2 +-
 ansible/roles/zun/defaults/main.yml                  |  1 +
 ansible/roles/zun/templates/wsgi-zun.conf.j2         |  2 +-
 70 files changed, 123 insertions(+), 53 deletions(-)

diff --git a/ansible/roles/aodh/defaults/main.yml b/ansible/roles/aodh/defaults/main.yml
index aa35e37d9f..d0c8190901 100644
--- a/ansible/roles/aodh/defaults/main.yml
+++ b/ansible/roles/aodh/defaults/main.yml
@@ -196,6 +196,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 13876f8e04..22671658f4 100644
--- a/ansible/roles/barbican/defaults/main.yml
+++ b/ansible/roles/barbican/defaults/main.yml
@@ -147,6 +147,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 fa29ffb46c..c992d0b68c 100644
--- a/ansible/roles/cinder/defaults/main.yml
+++ b/ansible/roles/cinder/defaults/main.yml
@@ -207,6 +207,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 e828edf9d8..631b3ce64f 100644
--- a/ansible/roles/cloudkitty/defaults/main.yml
+++ b/ansible/roles/cloudkitty/defaults/main.yml
@@ -108,6 +108,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 cb04b3b814..59c625c46f 100644
--- a/ansible/roles/cloudkitty/templates/cloudkitty.conf.j2
+++ b/ansible/roles/cloudkitty/templates/cloudkitty.conf.j2
@@ -90,7 +90,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 da9b647c22..a0d651242b 100644
--- a/ansible/roles/designate/defaults/main.yml
+++ b/ansible/roles/designate/defaults/main.yml
@@ -270,6 +270,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 51d9ea6460..24c5bdd90d 100644
--- a/ansible/roles/freezer/defaults/main.yml
+++ b/ansible/roles/freezer/defaults/main.yml
@@ -85,6 +85,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 694b98ed2b..7b6b5ccfd2 100644
--- a/ansible/roles/glance/defaults/main.yml
+++ b/ansible/roles/glance/defaults/main.yml
@@ -209,6 +209,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 64d2fdc5f3..41576b6f74 100644
--- a/ansible/roles/gnocchi/defaults/main.yml
+++ b/ansible/roles/gnocchi/defaults/main.yml
@@ -152,6 +152,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 3379137859..e0f685517e 100644
--- a/ansible/roles/heat/defaults/main.yml
+++ b/ansible/roles/heat/defaults/main.yml
@@ -166,6 +166,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 c391ed358f..a8530d7d9f 100644
--- a/ansible/roles/ironic/defaults/main.yml
+++ b/ansible/roles/ironic/defaults/main.yml
@@ -246,6 +246,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 d07c9a594e..78f2b38b48 100644
--- a/ansible/roles/keystone/defaults/main.yml
+++ b/ansible/roles/keystone/defaults/main.yml
@@ -153,6 +153,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 7e373e79bb..f97a410dfc 100644
--- a/ansible/roles/magnum/defaults/main.yml
+++ b/ansible/roles/magnum/defaults/main.yml
@@ -125,6 +125,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 19f815d6bb..da3a765297 100644
--- a/ansible/roles/manila/defaults/main.yml
+++ b/ansible/roles/manila/defaults/main.yml
@@ -188,6 +188,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 f3f40c376d..12b27b9c8b 100644
--- a/ansible/roles/masakari/defaults/main.yml
+++ b/ansible/roles/masakari/defaults/main.yml
@@ -119,6 +119,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 0538ddf637..225a645c3f 100644
--- a/ansible/roles/mistral/defaults/main.yml
+++ b/ansible/roles/mistral/defaults/main.yml
@@ -176,6 +176,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 7902044f6b..cfea924bfb 100644
--- a/ansible/roles/monasca/defaults/main.yml
+++ b/ansible/roles/monasca/defaults/main.yml
@@ -316,6 +316,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 aed194f0b4..014b674de9 100644
--- a/ansible/roles/murano/defaults/main.yml
+++ b/ansible/roles/murano/defaults/main.yml
@@ -80,6 +80,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 832b577197..961ff558b0 100644
--- a/ansible/roles/neutron/defaults/main.yml
+++ b/ansible/roles/neutron/defaults/main.yml
@@ -572,6 +572,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 4cbe04422d..9d01abc08a 100644
--- a/ansible/roles/nova-cell/defaults/main.yml
+++ b/ansible/roles/nova-cell/defaults/main.yml
@@ -493,6 +493,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 edb5aece53..d7ee9f8e92 100644
--- a/ansible/roles/nova/defaults/main.yml
+++ b/ansible/roles/nova/defaults/main.yml
@@ -188,6 +188,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 8af04ec28e..a07f281939 100644
--- a/ansible/roles/octavia/defaults/main.yml
+++ b/ansible/roles/octavia/defaults/main.yml
@@ -207,6 +207,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 081d9e5ee2..ce5fa02f8c 100644
--- a/ansible/roles/placement/defaults/main.yml
+++ b/ansible/roles/placement/defaults/main.yml
@@ -74,6 +74,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 54b3b7ab62..1fce34fbda 100644
--- a/ansible/roles/sahara/defaults/main.yml
+++ b/ansible/roles/sahara/defaults/main.yml
@@ -112,6 +112,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 d01c16f017..ef9ea38f57 100644
--- a/ansible/roles/senlin/defaults/main.yml
+++ b/ansible/roles/senlin/defaults/main.yml
@@ -175,6 +175,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 0832b5f9e8..0de5e410ea 100644
--- a/ansible/roles/solum/defaults/main.yml
+++ b/ansible/roles/solum/defaults/main.yml
@@ -190,6 +190,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 312db079f0..1a8642509f 100644
--- a/ansible/roles/tacker/defaults/main.yml
+++ b/ansible/roles/tacker/defaults/main.yml
@@ -122,6 +122,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 78e39c7da5..84bcb08834 100644
--- a/ansible/roles/trove/defaults/main.yml
+++ b/ansible/roles/trove/defaults/main.yml
@@ -144,6 +144,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 beb3938f11..95f4ae5806 100644
--- a/ansible/roles/vitrage/defaults/main.yml
+++ b/ansible/roles/vitrage/defaults/main.yml
@@ -203,6 +203,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 0b9fed7aa6..957047a9aa 100644
--- a/ansible/roles/watcher/defaults/main.yml
+++ b/ansible/roles/watcher/defaults/main.yml
@@ -141,6 +141,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 09ca763246..684ea86e74 100644
--- a/ansible/roles/zun/defaults/main.yml
+++ b/ansible/roles/zun/defaults/main.yml
@@ -194,6 +194,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>