From baad47ac61c4ebbc2db859b0ccdda7b84776645b Mon Sep 17 00:00:00 2001
From: Michal Arbet <michal.arbet@ultimum.io>
Date: Sun, 10 Jan 2021 19:51:55 +0000
Subject: [PATCH] Edit services roles to support database sharding

Depends-On: https://review.opendev.org/c/openstack/kolla/+/769385
Depends-On: https://review.opendev.org/c/openstack/kolla/+/765781

Change-Id: I3c4182a6556dafd2c936eaab109a068674058fca
---
 ansible/group_vars/all.yml                    |  5 +++++
 ansible/roles/aodh/defaults/main.yml          | 14 ++++++++++++++
 ansible/roles/aodh/tasks/bootstrap.yml        |  4 ++--
 ansible/roles/barbican/defaults/main.yml      | 13 +++++++++++++
 ansible/roles/barbican/tasks/bootstrap.yml    |  4 ++--
 ansible/roles/blazar/defaults/main.yml        | 13 +++++++++++++
 ansible/roles/blazar/tasks/bootstrap.yml      |  4 ++--
 ansible/roles/cinder/defaults/main.yml        | 14 ++++++++++++++
 ansible/roles/cinder/tasks/bootstrap.yml      |  4 ++--
 ansible/roles/cloudkitty/defaults/main.yml    | 13 +++++++++++++
 ansible/roles/cloudkitty/tasks/bootstrap.yml  |  4 ++--
 ansible/roles/cyborg/defaults/main.yml        | 14 ++++++++++++++
 ansible/roles/cyborg/tasks/bootstrap.yml      |  4 ++--
 ansible/roles/designate/defaults/main.yml     | 13 +++++++++++++
 ansible/roles/designate/tasks/bootstrap.yml   |  4 ++--
 ansible/roles/freezer/defaults/main.yml       | 14 ++++++++++++++
 ansible/roles/freezer/tasks/bootstrap.yml     |  4 ++--
 ansible/roles/glance/defaults/main.yml        | 13 +++++++++++++
 ansible/roles/glance/tasks/bootstrap.yml      |  4 ++--
 .../roles/glance/tasks/bootstrap_service.yml  |  4 ++--
 .../roles/glance/tasks/rolling_upgrade.yml    |  4 ++--
 ansible/roles/gnocchi/defaults/main.yml       | 13 +++++++++++++
 ansible/roles/gnocchi/tasks/bootstrap.yml     |  4 ++--
 ansible/roles/grafana/defaults/main.yml       | 14 ++++++++++++++
 ansible/roles/grafana/tasks/bootstrap.yml     |  4 ++--
 ansible/roles/heat/defaults/main.yml          | 13 +++++++++++++
 ansible/roles/heat/tasks/bootstrap.yml        |  4 ++--
 ansible/roles/horizon/defaults/main.yml       | 14 ++++++++++++++
 ansible/roles/horizon/tasks/bootstrap.yml     |  4 ++--
 ansible/roles/ironic/defaults/main.yml        | 16 ++++++++++++++++
 ansible/roles/ironic/tasks/bootstrap.yml      |  4 ++--
 ansible/roles/keystone/defaults/main.yml      | 13 +++++++++++++
 ansible/roles/keystone/tasks/bootstrap.yml    |  4 ++--
 ansible/roles/keystone/tasks/upgrade.yml      |  4 ++--
 ansible/roles/magnum/defaults/main.yml        | 13 +++++++++++++
 ansible/roles/magnum/tasks/bootstrap.yml      |  4 ++--
 ansible/roles/manila/defaults/main.yml        | 13 +++++++++++++
 ansible/roles/manila/tasks/bootstrap.yml      |  4 ++--
 ansible/roles/mariadb/defaults/main.yml       |  1 +
 ansible/roles/masakari/defaults/main.yml      | 14 ++++++++++++++
 ansible/roles/masakari/tasks/bootstrap.yml    |  4 ++--
 ansible/roles/mistral/defaults/main.yml       | 13 +++++++++++++
 ansible/roles/mistral/tasks/bootstrap.yml     |  4 ++--
 ansible/roles/monasca/defaults/main.yml       | 15 +++++++++++++++
 ansible/roles/monasca/tasks/bootstrap.yml     |  6 +++---
 ansible/roles/murano/defaults/main.yml        | 13 +++++++++++++
 ansible/roles/murano/tasks/bootstrap.yml      |  4 ++--
 ansible/roles/neutron/defaults/main.yml       | 13 +++++++++++++
 ansible/roles/neutron/tasks/bootstrap.yml     |  4 ++--
 ansible/roles/nova-cell/defaults/main.yml     | 19 ++++++++++++++++++-
 ansible/roles/nova/defaults/main.yml          | 19 +++++++++++++++++++
 ansible/roles/nova/tasks/bootstrap.yml        |  4 ++--
 ansible/roles/octavia/defaults/main.yml       | 13 +++++++++++++
 ansible/roles/octavia/tasks/bootstrap.yml     |  4 ++--
 ansible/roles/placement/defaults/main.yml     | 14 ++++++++++++++
 ansible/roles/placement/tasks/bootstrap.yml   |  4 ++--
 ansible/roles/prometheus/tasks/bootstrap.yml  | 13 ++++++++++---
 ansible/roles/sahara/defaults/main.yml        | 13 +++++++++++++
 ansible/roles/sahara/tasks/bootstrap.yml      |  4 ++--
 ansible/roles/senlin/defaults/main.yml        | 13 +++++++++++++
 ansible/roles/senlin/tasks/bootstrap.yml      |  4 ++--
 ansible/roles/solum/defaults/main.yml         | 13 +++++++++++++
 ansible/roles/solum/tasks/bootstrap.yml       |  4 ++--
 ansible/roles/tacker/defaults/main.yml        | 14 ++++++++++++++
 ansible/roles/tacker/tasks/bootstrap.yml      |  4 ++--
 ansible/roles/trove/defaults/main.yml         | 13 +++++++++++++
 ansible/roles/trove/tasks/bootstrap.yml       |  4 ++--
 ansible/roles/vitrage/defaults/main.yml       | 14 ++++++++++++++
 ansible/roles/vitrage/tasks/bootstrap.yml     |  4 ++--
 ansible/roles/watcher/defaults/main.yml       | 13 +++++++++++++
 ansible/roles/watcher/tasks/bootstrap.yml     |  4 ++--
 ansible/roles/zun/defaults/main.yml           | 13 +++++++++++++
 ansible/roles/zun/tasks/bootstrap.yml         |  4 ++--
 73 files changed, 557 insertions(+), 77 deletions(-)

diff --git a/ansible/group_vars/all.yml b/ansible/group_vars/all.yml
index f472a9d922..b0c4971767 100644
--- a/ansible/group_vars/all.yml
+++ b/ansible/group_vars/all.yml
@@ -1031,6 +1031,11 @@ nova_safety_upgrade: "no"
 # Valid options are [ none, novnc, spice ]
 nova_console: "novnc"
 
+#######################
+# Nova Database
+#######################
+nova_database_shard_id: "{{ mariadb_default_database_shard_id | int }}"
+
 #######################
 # Murano options
 #######################
diff --git a/ansible/roles/aodh/defaults/main.yml b/ansible/roles/aodh/defaults/main.yml
index aa35e37d9f..c3a888d0f1 100644
--- a/ansible/roles/aodh/defaults/main.yml
+++ b/ansible/roles/aodh/defaults/main.yml
@@ -63,6 +63,20 @@ aodh_database_name: "aodh"
 aodh_database_user: "{% if use_preconfigured_databases | bool and use_common_mariadb_user | bool %}{{ database_user }}{% else %}aodh{% endif %}"
 aodh_database_address: "{{ database_address | put_address_in_context('url') }}:{{ database_port }}"
 
+####################
+# Database sharding
+####################
+aodh_database_shard_root_user: "{% if enable_proxysql | bool %}root_shard_{{ aodh_database_shard_id }}{% else %}{{ database_user }}{% endif %}"
+aodh_database_shard_id: "{{ mariadb_default_database_shard_id | int }}"
+aodh_database_shard:
+  users:
+    - user: "{{ aodh_database_user }}"
+      password: "{{ aodh_database_password }}"
+  rules:
+    - schema: "{{ aodh_database_name }}"
+      shard_id: "{{ aodh_database_shard_id }}"
+
+
 ####################
 # Notification
 ####################
diff --git a/ansible/roles/aodh/tasks/bootstrap.yml b/ansible/roles/aodh/tasks/bootstrap.yml
index 97738e4bb4..a78c1c2afb 100644
--- a/ansible/roles/aodh/tasks/bootstrap.yml
+++ b/ansible/roles/aodh/tasks/bootstrap.yml
@@ -6,7 +6,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ aodh_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ aodh_database_name }}"
   run_once: True
@@ -21,7 +21,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ aodh_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ aodh_database_user }}"
       password: "{{ aodh_database_password }}"
diff --git a/ansible/roles/barbican/defaults/main.yml b/ansible/roles/barbican/defaults/main.yml
index 7efcae346c..8463b3aa99 100644
--- a/ansible/roles/barbican/defaults/main.yml
+++ b/ansible/roles/barbican/defaults/main.yml
@@ -48,6 +48,19 @@ barbican_database_name: "barbican"
 barbican_database_user: "{% if use_preconfigured_databases | bool and use_common_mariadb_user | bool %}{{ database_user }}{% else %}barbican{% endif %}"
 barbican_database_address: "{{ database_address | put_address_in_context('url') }}:{{ database_port }}"
 
+####################
+# Database sharding
+####################
+barbican_database_shard_root_user: "{% if enable_proxysql | bool %}root_shard_{{ barbican_database_shard_id }}{% else %}{{ database_user }}{% endif %}"
+barbican_database_shard_id: "{{ mariadb_default_database_shard_id | int }}"
+barbican_database_shard:
+  users:
+    - user: "{{ barbican_database_user }}"
+      password: "{{ barbican_database_password }}"
+  rules:
+    - schema: "{{ barbican_database_name }}"
+      shard_id: "{{ barbican_database_shard_id }}"
+
 
 ####################
 # Docker
diff --git a/ansible/roles/barbican/tasks/bootstrap.yml b/ansible/roles/barbican/tasks/bootstrap.yml
index e94dde3af4..7f80093f20 100644
--- a/ansible/roles/barbican/tasks/bootstrap.yml
+++ b/ansible/roles/barbican/tasks/bootstrap.yml
@@ -6,7 +6,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ barbican_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ barbican_database_name }}"
   run_once: True
@@ -21,7 +21,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ barbican_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ barbican_database_user }}"
       password: "{{ barbican_database_password }}"
diff --git a/ansible/roles/blazar/defaults/main.yml b/ansible/roles/blazar/defaults/main.yml
index 0d95469c6e..36d9d24a13 100644
--- a/ansible/roles/blazar/defaults/main.yml
+++ b/ansible/roles/blazar/defaults/main.yml
@@ -41,6 +41,19 @@ blazar_database_name: "blazar"
 blazar_database_user: "blazar"
 blazar_database_address: "{{ database_address | put_address_in_context('url') }}:{{ database_port }}"
 
+####################
+# Database sharding
+####################
+blazar_database_shard_root_user: "{% if enable_proxysql | bool %}root_shard_{{ blazar_database_shard_id }}{% else %}{{ database_user }}{% endif %}"
+blazar_database_shard_id: "{{ mariadb_default_database_shard_id | int }}"
+blazar_database_shard:
+  users:
+    - user: "{{ blazar_database_user }}"
+      password: "{{ blazar_database_password }}"
+  rules:
+    - schema: "{{ blazar_database_name }}"
+      shard_id: "{{ blazar_database_shard_id }}"
+
 
 ####################
 # Docker
diff --git a/ansible/roles/blazar/tasks/bootstrap.yml b/ansible/roles/blazar/tasks/bootstrap.yml
index f6a24d6db6..c46a8ee993 100644
--- a/ansible/roles/blazar/tasks/bootstrap.yml
+++ b/ansible/roles/blazar/tasks/bootstrap.yml
@@ -6,7 +6,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ blazar_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ blazar_database_name }}"
   run_once: True
@@ -21,7 +21,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ blazar_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ blazar_database_name }}"
       password: "{{ blazar_database_password }}"
diff --git a/ansible/roles/cinder/defaults/main.yml b/ansible/roles/cinder/defaults/main.yml
index e40083a57a..48a46318fa 100644
--- a/ansible/roles/cinder/defaults/main.yml
+++ b/ansible/roles/cinder/defaults/main.yml
@@ -59,6 +59,20 @@ cinder_database_name: "cinder"
 cinder_database_user: "{% if use_preconfigured_databases | bool and use_common_mariadb_user | bool %}{{ database_user }}{% else %}cinder{% endif %}"
 cinder_database_address: "{{ database_address | put_address_in_context('url') }}:{{ database_port }}"
 
+####################
+# Database sharding
+####################
+cinder_database_shard_root_user: "{% if enable_proxysql | bool %}root_shard_{{ cinder_database_shard_id }}{% else %}{{ database_user }}{% endif %}"
+cinder_database_shard_id: "{{ mariadb_default_database_shard_id | int }}"
+cinder_database_shard:
+  users:
+    - user: "{{ cinder_database_user }}"
+      password: "{{ cinder_database_password }}"
+  rules:
+    - schema: "{{ cinder_database_name }}"
+      shard_id: "{{ cinder_database_shard_id }}"
+
+
 ####################
 # Docker
 ####################
diff --git a/ansible/roles/cinder/tasks/bootstrap.yml b/ansible/roles/cinder/tasks/bootstrap.yml
index e36a403536..25f2e37338 100644
--- a/ansible/roles/cinder/tasks/bootstrap.yml
+++ b/ansible/roles/cinder/tasks/bootstrap.yml
@@ -6,7 +6,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ cinder_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ cinder_database_name }}"
   run_once: True
@@ -21,7 +21,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ cinder_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ cinder_database_user }}"
       password: "{{ cinder_database_password }}"
diff --git a/ansible/roles/cloudkitty/defaults/main.yml b/ansible/roles/cloudkitty/defaults/main.yml
index 2687a34af9..8627be1cb4 100644
--- a/ansible/roles/cloudkitty/defaults/main.yml
+++ b/ansible/roles/cloudkitty/defaults/main.yml
@@ -36,6 +36,19 @@ cloudkitty_database_name: "cloudkitty"
 cloudkitty_database_user: "{% if use_preconfigured_databases | bool and use_common_mariadb_user | bool %}{{ database_user }}{% else %}cloudkitty{% endif %}"
 cloudkitty_database_address: "{{ database_address | put_address_in_context('url') }}:{{ database_port }}"
 
+####################
+# Database sharding
+####################
+cloudkitty_database_shard_root_user: "{% if enable_proxysql | bool %}root_shard_{{ cloudkitty_database_shard_id }}{% else %}{{ database_user }}{% endif %}"
+cloudkitty_database_shard_id: "{{ mariadb_default_database_shard_id | int }}"
+cloudkitty_database_shard:
+  users:
+    - user: "{{ cloudkitty_database_user }}"
+      password: "{{ cloudkitty_database_password }}"
+  rules:
+    - schema: "{{ cloudkitty_database_name }}"
+      shard_id: "{{ cloudkitty_database_shard_id }}"
+
 
 ####################
 # Docker
diff --git a/ansible/roles/cloudkitty/tasks/bootstrap.yml b/ansible/roles/cloudkitty/tasks/bootstrap.yml
index 3960b15267..41348dc49a 100644
--- a/ansible/roles/cloudkitty/tasks/bootstrap.yml
+++ b/ansible/roles/cloudkitty/tasks/bootstrap.yml
@@ -6,7 +6,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ cloudkitty_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ cloudkitty_database_name }}"
   run_once: True
@@ -21,7 +21,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ cloudkitty_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ cloudkitty_database_user }}"
       password: "{{ cloudkitty_database_password }}"
diff --git a/ansible/roles/cyborg/defaults/main.yml b/ansible/roles/cyborg/defaults/main.yml
index 3f0e842ca5..f06034255f 100644
--- a/ansible/roles/cyborg/defaults/main.yml
+++ b/ansible/roles/cyborg/defaults/main.yml
@@ -33,6 +33,20 @@ cyborg_database_name: "cyborg"
 cyborg_database_user: "{% if use_preconfigured_databases | bool and use_common_mariadb_user | bool %}{{ database_user }}{% else %}cyborg{% endif %}"
 cyborg_database_address: "{{ database_address | put_address_in_context('url') }}:{{ database_port }}"
 
+####################
+# Database sharding
+####################
+cyborg_database_shard_root_user: "{% if enable_proxysql | bool %}root_shard_{{ cyborg_database_shard_id }}{% else %}{{ database_user }}{% endif %}"
+cyborg_database_shard_id: "{{ mariadb_default_database_shard_id | int }}"
+cyborg_database_shard:
+  users:
+    - user: "{{ cyborg_database_user }}"
+      password: "{{ cyborg_database_password }}"
+  rules:
+    - schema: "{{ cyborg_database_name }}"
+      shard_id: "{{ cyborg_database_shard_id }}"
+
+
 ####################
 # Docker
 ####################
diff --git a/ansible/roles/cyborg/tasks/bootstrap.yml b/ansible/roles/cyborg/tasks/bootstrap.yml
index b03cbad442..9739bed680 100644
--- a/ansible/roles/cyborg/tasks/bootstrap.yml
+++ b/ansible/roles/cyborg/tasks/bootstrap.yml
@@ -6,7 +6,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ cyborg_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ cyborg_database_name }}"
   run_once: True
@@ -21,7 +21,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ cyborg_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ cyborg_database_user }}"
       password: "{{ cyborg_database_password }}"
diff --git a/ansible/roles/designate/defaults/main.yml b/ansible/roles/designate/defaults/main.yml
index da9b647c22..4346ca15ec 100644
--- a/ansible/roles/designate/defaults/main.yml
+++ b/ansible/roles/designate/defaults/main.yml
@@ -78,6 +78,19 @@ designate_database_name: "designate"
 designate_database_user: "{% if use_preconfigured_databases | bool and use_common_mariadb_user | bool %}{{ database_user }}{% else %}designate{% endif %}"
 designate_database_address: "{{ database_address | put_address_in_context('url') }}:{{ database_port }}"
 
+####################
+# Database sharding
+####################
+designate_database_shard_root_user: "{% if enable_proxysql | bool %}root_shard_{{ designate_database_shard_id }}{% else %}{{ database_user }}{% endif %}"
+designate_database_shard_id: "{{ mariadb_default_database_shard_id | int }}"
+designate_database_shard:
+  users:
+    - user: "{{ designate_database_user }}"
+      password: "{{ designate_database_password }}"
+  rules:
+    - schema: "{{ designate_database_name }}"
+      shard_id: "{{ designate_database_shard_id }}"
+
 
 ####################
 # Docker
diff --git a/ansible/roles/designate/tasks/bootstrap.yml b/ansible/roles/designate/tasks/bootstrap.yml
index a4bc32429e..8173bb120e 100644
--- a/ansible/roles/designate/tasks/bootstrap.yml
+++ b/ansible/roles/designate/tasks/bootstrap.yml
@@ -6,7 +6,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ designate_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ item }}"
   run_once: True
@@ -23,7 +23,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ designate_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ item.database_user }}"
       password: "{{ item.database_password }}"
diff --git a/ansible/roles/freezer/defaults/main.yml b/ansible/roles/freezer/defaults/main.yml
index 51d9ea6460..563f3e56e3 100644
--- a/ansible/roles/freezer/defaults/main.yml
+++ b/ansible/roles/freezer/defaults/main.yml
@@ -38,6 +38,20 @@ freezer_es_protocol: "{{ internal_protocol }}"
 freezer_es_address: "{{ elasticsearch_address }}"
 freezer_es_port: "{{ elasticsearch_port }}"
 
+####################
+# Database sharding
+####################
+freezer_database_shard_root_user: "{% if enable_proxysql | bool %}root_shard_{{ freezer_database_shard_id }}{% else %}{{ database_user }}{% endif %}"
+freezer_database_shard_id: "{{ mariadb_default_database_shard_id | int }}"
+freezer_database_shard:
+  users:
+    - user: "{{ freezer_database_user }}"
+      password: "{{ freezer_database_password }}"
+  rules:
+    - schema: "{{ freezer_database_name }}"
+      shard_id: "{{ freezer_database_shard_id }}"
+
+
 ####################
 # Docker
 ####################
diff --git a/ansible/roles/freezer/tasks/bootstrap.yml b/ansible/roles/freezer/tasks/bootstrap.yml
index 3399447036..952e85d1c2 100644
--- a/ansible/roles/freezer/tasks/bootstrap.yml
+++ b/ansible/roles/freezer/tasks/bootstrap.yml
@@ -5,7 +5,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ freezer_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ freezer_database_name }}"
   become: true
@@ -21,7 +21,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ freezer_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ freezer_database_user }}"
       password: "{{ freezer_database_password }}"
diff --git a/ansible/roles/glance/defaults/main.yml b/ansible/roles/glance/defaults/main.yml
index bfd5a0ea79..94023dcb40 100644
--- a/ansible/roles/glance/defaults/main.yml
+++ b/ansible/roles/glance/defaults/main.yml
@@ -104,6 +104,19 @@ glance_database_name: "glance"
 glance_database_user: "{% if use_preconfigured_databases | bool and use_common_mariadb_user | bool %}{{ database_user }}{% else %}glance{% endif %}"
 glance_database_address: "{{ database_address | put_address_in_context('url') }}:{{ database_port }}"
 
+####################
+# Database sharding
+####################
+glance_database_shard_root_user: "{% if enable_proxysql | bool %}root_shard_{{ glance_database_shard_id }}{% else %}{{ database_user }}{% endif %}"
+glance_database_shard_id: "{{ mariadb_default_database_shard_id | int }}"
+glance_database_shard:
+  users:
+    - user: "{{ glance_database_user }}"
+      password: "{{ glance_database_password }}"
+  rules:
+    - schema: "{{ glance_database_name }}"
+      shard_id: "{{ glance_database_shard_id }}"
+
 
 ####################
 # HAProxy
diff --git a/ansible/roles/glance/tasks/bootstrap.yml b/ansible/roles/glance/tasks/bootstrap.yml
index f80917486d..8bcf5a6f40 100644
--- a/ansible/roles/glance/tasks/bootstrap.yml
+++ b/ansible/roles/glance/tasks/bootstrap.yml
@@ -6,7 +6,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ glance_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ glance_database_name }}"
   run_once: True
@@ -21,7 +21,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ glance_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ glance_database_user }}"
       password: "{{ glance_database_password }}"
diff --git a/ansible/roles/glance/tasks/bootstrap_service.yml b/ansible/roles/glance/tasks/bootstrap_service.yml
index 0843153199..756d8cbf73 100644
--- a/ansible/roles/glance/tasks/bootstrap_service.yml
+++ b/ansible/roles/glance/tasks/bootstrap_service.yml
@@ -6,7 +6,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ glance_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       variable: log_bin_trust_function_creators
       value: 1
@@ -42,7 +42,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ glance_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       variable: log_bin_trust_function_creators
       value: 0
diff --git a/ansible/roles/glance/tasks/rolling_upgrade.yml b/ansible/roles/glance/tasks/rolling_upgrade.yml
index 6f9628b79d..2215616761 100644
--- a/ansible/roles/glance/tasks/rolling_upgrade.yml
+++ b/ansible/roles/glance/tasks/rolling_upgrade.yml
@@ -17,7 +17,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ glance_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       variable: log_bin_trust_function_creators
       value: 1
@@ -107,7 +107,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ glance_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       variable: log_bin_trust_function_creators
       value: 0
diff --git a/ansible/roles/gnocchi/defaults/main.yml b/ansible/roles/gnocchi/defaults/main.yml
index 64d2fdc5f3..615ed3bfb0 100644
--- a/ansible/roles/gnocchi/defaults/main.yml
+++ b/ansible/roles/gnocchi/defaults/main.yml
@@ -51,6 +51,19 @@ gnocchi_database_name: "gnocchi"
 gnocchi_database_user: "{% if use_preconfigured_databases | bool and use_common_mariadb_user | bool %}{{ database_user }}{% else %}gnocchi{% endif %}"
 gnocchi_database_address: "{{ database_address | put_address_in_context('url') }}:{{ database_port }}"
 
+####################
+# Database sharding
+####################
+gnocchi_database_shard_root_user: "{% if enable_proxysql | bool %}root_shard_{{ gnocchi_database_shard_id }}{% else %}{{ database_user }}{% endif %}"
+gnocchi_database_shard_id: "{{ mariadb_default_database_shard_id | int }}"
+gnocchi_database_shard:
+  users:
+    - user: "{{ gnocchi_database_user }}"
+      password: "{{ gnocchi_database_password }}"
+  rules:
+    - schema: "{{ gnocchi_database_name }}"
+      shard_id: "{{ gnocchi_database_shard_id }}"
+
 
 ####################
 # Docker
diff --git a/ansible/roles/gnocchi/tasks/bootstrap.yml b/ansible/roles/gnocchi/tasks/bootstrap.yml
index f86bdc9583..e2cb62e373 100644
--- a/ansible/roles/gnocchi/tasks/bootstrap.yml
+++ b/ansible/roles/gnocchi/tasks/bootstrap.yml
@@ -6,7 +6,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ gnocchi_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ gnocchi_database_name }}"
   run_once: True
@@ -21,7 +21,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ gnocchi_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ gnocchi_database_user }}"
       password: "{{ gnocchi_database_password }}"
diff --git a/ansible/roles/grafana/defaults/main.yml b/ansible/roles/grafana/defaults/main.yml
index 2d4b4e392b..18248c7f00 100644
--- a/ansible/roles/grafana/defaults/main.yml
+++ b/ansible/roles/grafana/defaults/main.yml
@@ -26,6 +26,20 @@ grafana_database_name: "grafana"
 grafana_database_user: "{% if use_preconfigured_databases | bool and use_common_mariadb_user | bool %}{{ database_user }}{% else %}grafana{% endif %}"
 grafana_database_address: "{{ database_address | put_address_in_context('url') }}:{{ database_port }}"
 
+####################
+# Database sharding
+####################
+grafana_database_shard_root_user: "{% if enable_proxysql | bool %}root_shard_{{ grafana_database_shard_id }}{% else %}{{ database_user }}{% endif %}"
+grafana_database_shard_id: "{{ mariadb_default_database_shard_id | int }}"
+grafana_database_shard:
+  users:
+    - user: "{{ grafana_database_user }}"
+      password: "{{ grafana_database_password }}"
+  rules:
+    - schema: "{{ grafana_database_name }}"
+      shard_id: "{{ grafana_database_shard_id }}"
+
+
 ####################
 # Datasource
 ####################
diff --git a/ansible/roles/grafana/tasks/bootstrap.yml b/ansible/roles/grafana/tasks/bootstrap.yml
index 4fcec904e6..5c4e56c400 100644
--- a/ansible/roles/grafana/tasks/bootstrap.yml
+++ b/ansible/roles/grafana/tasks/bootstrap.yml
@@ -6,7 +6,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ grafana_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ grafana_database_name }}"
   run_once: True
@@ -21,7 +21,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ grafana_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ grafana_database_user }}"
       password: "{{ grafana_database_password }}"
diff --git a/ansible/roles/heat/defaults/main.yml b/ansible/roles/heat/defaults/main.yml
index 3379137859..6d76eed2ba 100644
--- a/ansible/roles/heat/defaults/main.yml
+++ b/ansible/roles/heat/defaults/main.yml
@@ -62,6 +62,19 @@ heat_database_name: "heat"
 heat_database_user: "{% if use_preconfigured_databases | bool and use_common_mariadb_user | bool %}{{ database_user }}{% else %}heat{% endif %}"
 heat_database_address: "{{ database_address | put_address_in_context('url') }}:{{ database_port }}"
 
+####################
+# Database sharding
+####################
+heat_database_shard_root_user: "{% if enable_proxysql | bool %}root_shard_{{ heat_database_shard_id }}{% else %}{{ database_user }}{% endif %}"
+heat_database_shard_id: "{{ mariadb_default_database_shard_id | int }}"
+heat_database_shard:
+  users:
+    - user: "{{ heat_database_user }}"
+      password: "{{ heat_database_password }}"
+  rules:
+    - schema: "{{ heat_database_name }}"
+      shard_id: "{{ heat_database_shard_id }}"
+
 
 ####################
 # Docker
diff --git a/ansible/roles/heat/tasks/bootstrap.yml b/ansible/roles/heat/tasks/bootstrap.yml
index 16e970813b..50d8b27138 100644
--- a/ansible/roles/heat/tasks/bootstrap.yml
+++ b/ansible/roles/heat/tasks/bootstrap.yml
@@ -6,7 +6,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ heat_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ heat_database_name }}"
   run_once: True
@@ -21,7 +21,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ heat_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ heat_database_user }}"
       password: "{{ heat_database_password }}"
diff --git a/ansible/roles/horizon/defaults/main.yml b/ansible/roles/horizon/defaults/main.yml
index 345334fdb2..989d8d5e9d 100644
--- a/ansible/roles/horizon/defaults/main.yml
+++ b/ansible/roles/horizon/defaults/main.yml
@@ -84,6 +84,20 @@ horizon_database_name: "horizon"
 horizon_database_user: "{% if use_preconfigured_databases | bool and use_common_mariadb_user | bool %}{{ database_user }}{% else %}horizon{% endif %}"
 horizon_database_address: "{{ database_address | put_address_in_context('url') }}:{{ database_port }}"
 
+####################
+# Database sharding
+####################
+horizon_database_shard_root_user: "{% if enable_proxysql | bool %}root_shard_{{ horizon_database_shard_id }}{% else %}{{ database_user }}{% endif %}"
+horizon_database_shard_id: "{{ mariadb_default_database_shard_id | int }}"
+horizon_database_shard:
+  users:
+    - user: "{{ horizon_database_user }}"
+      password: "{{ horizon_database_password }}"
+  rules:
+    - schema: "{{ horizon_database_name }}"
+      shard_id: "{{ horizon_database_shard_id }}"
+
+
 ####################
 # Docker
 ####################
diff --git a/ansible/roles/horizon/tasks/bootstrap.yml b/ansible/roles/horizon/tasks/bootstrap.yml
index 74f67f2a62..ecac253e2c 100644
--- a/ansible/roles/horizon/tasks/bootstrap.yml
+++ b/ansible/roles/horizon/tasks/bootstrap.yml
@@ -6,7 +6,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ horizon_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ horizon_database_name }}"
   run_once: True
@@ -21,7 +21,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ horizon_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ horizon_database_user }}"
       password: "{{ horizon_database_password }}"
diff --git a/ansible/roles/ironic/defaults/main.yml b/ansible/roles/ironic/defaults/main.yml
index d4af66ef5d..4ff45493e3 100644
--- a/ansible/roles/ironic/defaults/main.yml
+++ b/ansible/roles/ironic/defaults/main.yml
@@ -96,6 +96,22 @@ ironic_inspector_database_name: "ironic_inspector"
 ironic_inspector_database_user: "{% if use_preconfigured_databases | bool and use_common_mariadb_user | bool %}{{ database_user }}{% else %}ironic_inspector{% endif %}"
 ironic_inspector_database_address: "{{ database_address | put_address_in_context('url') }}:{{ database_port }}"
 
+####################
+# Database sharding
+####################
+ironic_database_shard_root_user: "{% if enable_proxysql | bool %}root_shard_{{ ironic_database_shard_id }}{% else %}{{ database_user }}{% endif %}"
+ironic_database_shard:
+  users:
+    - user: "{{ ironic_database_user }}"
+      password: "{{ ironic_database_password }}"
+    - user: "{{ ironic_inspector_database_user }}"
+      password: "{{ ironic_inspector_database_password }}"
+  rules:
+    - schema: "{{ ironic_database_name }}"
+      shard_id: "{{ ironic_database_shard_id }}"
+    - schema: "{{ ironic_inspector_database_name }}"
+      shard_id: "{{ ironic_database_shard_id }}"
+
 
 ####################
 # Docker
diff --git a/ansible/roles/ironic/tasks/bootstrap.yml b/ansible/roles/ironic/tasks/bootstrap.yml
index e021492922..e1b9c164ae 100644
--- a/ansible/roles/ironic/tasks/bootstrap.yml
+++ b/ansible/roles/ironic/tasks/bootstrap.yml
@@ -6,7 +6,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ ironic_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ item.database_name }}"
   run_once: True
@@ -27,7 +27,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ ironic_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ item.database_user }}"
       password: "{{ item.database_password }}"
diff --git a/ansible/roles/keystone/defaults/main.yml b/ansible/roles/keystone/defaults/main.yml
index d07c9a594e..b525db561f 100644
--- a/ansible/roles/keystone/defaults/main.yml
+++ b/ansible/roles/keystone/defaults/main.yml
@@ -68,6 +68,19 @@ keystone_database_name: "keystone"
 keystone_database_user: "{% if use_preconfigured_databases | bool and use_common_mariadb_user | bool %}{{ database_user }}{% else %}keystone{% endif %}"
 keystone_database_address: "{{ database_address | put_address_in_context('url') }}:{{ database_port }}"
 
+####################
+# Database sharding
+####################
+keystone_database_shard_root_user: "{% if enable_proxysql | bool %}root_shard_{{ keystone_database_shard_id }}{% else %}{{ database_user }}{% endif %}"
+keystone_database_shard_id: "{{ mariadb_default_database_shard_id | int }}"
+keystone_database_shard:
+  users:
+    - user: "{{ keystone_database_user }}"
+      password: "{{ keystone_database_password }}"
+  rules:
+    - schema: "{{ keystone_database_name }}"
+      shard_id: "{{ keystone_database_shard_id }}"
+
 
 ####################
 # Fernet
diff --git a/ansible/roles/keystone/tasks/bootstrap.yml b/ansible/roles/keystone/tasks/bootstrap.yml
index 413830864b..15f19d2b5b 100644
--- a/ansible/roles/keystone/tasks/bootstrap.yml
+++ b/ansible/roles/keystone/tasks/bootstrap.yml
@@ -6,7 +6,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ keystone_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ keystone_database_name }}"
   run_once: True
@@ -21,7 +21,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ keystone_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ keystone_database_user }}"
       password: "{{ keystone_database_password }}"
diff --git a/ansible/roles/keystone/tasks/upgrade.yml b/ansible/roles/keystone/tasks/upgrade.yml
index 8f98db175f..7a1df217d6 100644
--- a/ansible/roles/keystone/tasks/upgrade.yml
+++ b/ansible/roles/keystone/tasks/upgrade.yml
@@ -10,7 +10,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ keystone_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       variable: log_bin_trust_function_creators
       value: 1
@@ -39,7 +39,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ keystone_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       variable: log_bin_trust_function_creators
       value: 0
diff --git a/ansible/roles/magnum/defaults/main.yml b/ansible/roles/magnum/defaults/main.yml
index 7e373e79bb..67bccb9192 100644
--- a/ansible/roles/magnum/defaults/main.yml
+++ b/ansible/roles/magnum/defaults/main.yml
@@ -39,6 +39,19 @@ magnum_database_name: "magnum"
 magnum_database_user: "{% if use_preconfigured_databases | bool and use_common_mariadb_user | bool %}{{ database_user }}{% else %}magnum{% endif %}"
 magnum_database_address: "{{ database_address | put_address_in_context('url') }}:{{ database_port }}"
 
+####################
+# Database sharding
+####################
+magnum_database_shard_root_user: "{% if enable_proxysql | bool %}root_shard_{{ magnum_database_shard_id }}{% else %}{{ database_user }}{% endif %}"
+magnum_database_shard_id: "{{ mariadb_default_database_shard_id | int }}"
+magnum_database_shard:
+  users:
+    - user: "{{ magnum_database_user }}"
+      password: "{{ magnum_database_password }}"
+  rules:
+    - schema: "{{ magnum_database_name }}"
+      shard_id: "{{ magnum_database_shard_id }}"
+
 
 ####################
 # Magnum
diff --git a/ansible/roles/magnum/tasks/bootstrap.yml b/ansible/roles/magnum/tasks/bootstrap.yml
index a60ae37f74..bf0afa219a 100644
--- a/ansible/roles/magnum/tasks/bootstrap.yml
+++ b/ansible/roles/magnum/tasks/bootstrap.yml
@@ -6,7 +6,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ magnum_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ magnum_database_name }}"
   run_once: True
@@ -21,7 +21,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ magnum_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ magnum_database_user }}"
       password: "{{ magnum_database_password }}"
diff --git a/ansible/roles/manila/defaults/main.yml b/ansible/roles/manila/defaults/main.yml
index 7a0c12f89d..e01958c70a 100644
--- a/ansible/roles/manila/defaults/main.yml
+++ b/ansible/roles/manila/defaults/main.yml
@@ -54,6 +54,19 @@ manila_database_name: "manila"
 manila_database_user: "{% if use_preconfigured_databases | bool and use_common_mariadb_user | bool %}{{ database_user }}{% else %}manila{% endif %}"
 manila_database_address: "{{ database_address | put_address_in_context('url') }}:{{ database_port }}"
 
+####################
+# Database sharding
+####################
+manila_database_shard_root_user: "{% if enable_proxysql | bool %}root_shard_{{ manila_database_shard_id }}{% else %}{{ database_user }}{% endif %}"
+manila_database_shard_id: "{{ mariadb_default_database_shard_id | int }}"
+manila_database_shard:
+  users:
+    - user: "{{ manila_database_user }}"
+      password: "{{ manila_database_password }}"
+  rules:
+    - schema: "{{ manila_database_name }}"
+      shard_id: "{{ manila_database_shard_id }}"
+
 
 #####################
 ## Docker
diff --git a/ansible/roles/manila/tasks/bootstrap.yml b/ansible/roles/manila/tasks/bootstrap.yml
index 76dcffc0a9..061c27dedd 100644
--- a/ansible/roles/manila/tasks/bootstrap.yml
+++ b/ansible/roles/manila/tasks/bootstrap.yml
@@ -6,7 +6,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ manila_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ manila_database_name }}"
   run_once: True
@@ -21,7 +21,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ manila_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ manila_database_user }}"
       password: "{{ manila_database_password }}"
diff --git a/ansible/roles/mariadb/defaults/main.yml b/ansible/roles/mariadb/defaults/main.yml
index 2aae9220c7..5ab183c395 100644
--- a/ansible/roles/mariadb/defaults/main.yml
+++ b/ansible/roles/mariadb/defaults/main.yml
@@ -120,3 +120,4 @@ enable_mariadb_clustercheck: "{{ enable_haproxy }}"
 # Sharding
 ####################
 mariadb_shard_database_user: "{% if mariadb_loadbalancer == 'haproxy' %}{{ database_user }}{% else %}{{ mariadb_shard_root_user_prefix }}{{ mariadb_shard_id | string }}{% endif %}"
+mariadb_database_shard: "{{ mariadb_shards_info }}"
diff --git a/ansible/roles/masakari/defaults/main.yml b/ansible/roles/masakari/defaults/main.yml
index f3f40c376d..4dffcdb1bf 100644
--- a/ansible/roles/masakari/defaults/main.yml
+++ b/ansible/roles/masakari/defaults/main.yml
@@ -50,6 +50,20 @@ masakari_database_name: "masakari"
 masakari_database_user: "{% if use_preconfigured_databases | bool and use_common_mariadb_user | bool %}{{ database_user }}{% else %}masakari{% endif %}"
 masakari_database_address: "{{ database_address | put_address_in_context('url') }}:{{ database_port }}"
 
+####################
+# Database sharding
+####################
+masakari_database_shard_root_user: "{% if enable_proxysql | bool %}root_shard_{{ masakari_database_shard_id }}{% else %}{{ database_user }}{% endif %}"
+masakari_database_shard_id: "{{ mariadb_default_database_shard_id | int }}"
+masakari_database_shard:
+  users:
+    - user: "{{ masakari_database_user }}"
+      password: "{{ masakari_database_password }}"
+  rules:
+    - schema: "{{ masakari_database_name }}"
+      shard_id: "{{ masakari_database_shard_id }}"
+
+
 ####################
 # Docker
 ####################
diff --git a/ansible/roles/masakari/tasks/bootstrap.yml b/ansible/roles/masakari/tasks/bootstrap.yml
index 6e15a7f1eb..518b4bf3cc 100644
--- a/ansible/roles/masakari/tasks/bootstrap.yml
+++ b/ansible/roles/masakari/tasks/bootstrap.yml
@@ -6,7 +6,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ masakari_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ masakari_database_name }}"
   run_once: True
@@ -21,7 +21,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ masakari_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ masakari_database_user }}"
       password: "{{ masakari_database_password }}"
diff --git a/ansible/roles/mistral/defaults/main.yml b/ansible/roles/mistral/defaults/main.yml
index 0538ddf637..08bbfaafca 100644
--- a/ansible/roles/mistral/defaults/main.yml
+++ b/ansible/roles/mistral/defaults/main.yml
@@ -52,6 +52,19 @@ mistral_database_name: "mistral"
 mistral_database_user: "{% if use_preconfigured_databases | bool and use_common_mariadb_user | bool %}{{ database_user }}{% else %}mistral{% endif %}"
 mistral_database_address: "{{ database_address | put_address_in_context('url') }}:{{ database_port }}"
 
+####################
+# Database sharding
+####################
+mistral_database_shard_root_user: "{% if enable_proxysql | bool %}root_shard_{{ mistral_database_shard_id }}{% else %}{{ database_user }}{% endif %}"
+mistral_database_shard_id: "{{ mariadb_default_database_shard_id | int }}"
+mistral_database_shard:
+  users:
+    - user: "{{ mistral_database_user }}"
+      password: "{{ mistral_database_password }}"
+  rules:
+    - schema: "{{ mistral_database_name }}"
+      shard_id: "{{ mistral_database_shard_id }}"
+
 
 ####################
 # Docker
diff --git a/ansible/roles/mistral/tasks/bootstrap.yml b/ansible/roles/mistral/tasks/bootstrap.yml
index 3757ff081b..d553572ff5 100644
--- a/ansible/roles/mistral/tasks/bootstrap.yml
+++ b/ansible/roles/mistral/tasks/bootstrap.yml
@@ -6,7 +6,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ mistral_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ mistral_database_name }}"
   run_once: True
@@ -21,7 +21,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ mistral_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ mistral_database_user }}"
       password: "{{ mistral_database_password }}"
diff --git a/ansible/roles/monasca/defaults/main.yml b/ansible/roles/monasca/defaults/main.yml
index 9ef43a5a0e..248d0790d9 100644
--- a/ansible/roles/monasca/defaults/main.yml
+++ b/ansible/roles/monasca/defaults/main.yml
@@ -95,6 +95,21 @@ monasca_influxdb_retention_policy:
   duration: "1w"
   replication_count: 1
 
+####################
+# Database sharding
+####################
+monasca_database_shard_root_user: "{% if enable_proxysql | bool %}root_shard_{{ monasca_database_shard_id }}{% else %}{{ database_user }}{% endif %}"
+monasca_database_shard:
+  users:
+    - user: "{{ monasca_database_user }}"
+      password: "{{ monasca_database_password }}"
+  rules:
+    - schema: "{{ monasca_database_name }}"
+      shard_id: "{{ monasca_database_shard_id }}"
+    - schema: "{{ monasca_grafana_database_name }}"
+      shard_id: "{{ monasca_database_shard_id }}"
+
+
 ####################
 # Monasca
 ####################
diff --git a/ansible/roles/monasca/tasks/bootstrap.yml b/ansible/roles/monasca/tasks/bootstrap.yml
index 0ae726e0fd..1536bcc1c3 100644
--- a/ansible/roles/monasca/tasks/bootstrap.yml
+++ b/ansible/roles/monasca/tasks/bootstrap.yml
@@ -1,12 +1,12 @@
 ---
-- name: Creating monasca database
+- name: Creating monasca databases
   become: true
   kolla_toolbox:
     module_name: mysql_db
     module_args:
       login_host: "{{ monasca_database_address }}"
       login_port: "{{ monasca_database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ monasca_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ item }}"
   run_once: True
@@ -23,7 +23,7 @@
     module_args:
       login_host: "{{ monasca_database_address }}"
       login_port: "{{ monasca_database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ monasca_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ monasca_database_user }}"
       password: "{{ monasca_database_password }}"
diff --git a/ansible/roles/murano/defaults/main.yml b/ansible/roles/murano/defaults/main.yml
index aed194f0b4..e725979547 100644
--- a/ansible/roles/murano/defaults/main.yml
+++ b/ansible/roles/murano/defaults/main.yml
@@ -34,6 +34,19 @@ murano_database_name: "murano"
 murano_database_user: "{% if use_preconfigured_databases | bool and use_common_mariadb_user | bool %}{{ database_user }}{% else %}murano{% endif %}"
 murano_database_address: "{{ database_address | put_address_in_context('url') }}:{{ database_port }}"
 
+####################
+# Database sharding
+####################
+murano_database_shard_root_user: "{% if enable_proxysql | bool %}root_shard_{{ murano_database_shard_id }}{% else %}{{ database_user }}{% endif %}"
+murano_database_shard_id: "{{ mariadb_default_database_shard_id | int }}"
+murano_database_shard:
+  users:
+    - user: "{{ murano_database_user }}"
+      password: "{{ murano_database_password }}"
+  rules:
+    - schema: "{{ murano_database_name }}"
+      shard_id: "{{ murano_database_shard_id }}"
+
 
 ####################
 # Docker
diff --git a/ansible/roles/murano/tasks/bootstrap.yml b/ansible/roles/murano/tasks/bootstrap.yml
index 9698807dce..00ce24f37e 100644
--- a/ansible/roles/murano/tasks/bootstrap.yml
+++ b/ansible/roles/murano/tasks/bootstrap.yml
@@ -6,7 +6,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ murano_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ murano_database_name }}"
   run_once: True
@@ -21,7 +21,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ murano_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ murano_database_user }}"
       password: "{{ murano_database_password }}"
diff --git a/ansible/roles/neutron/defaults/main.yml b/ansible/roles/neutron/defaults/main.yml
index 835c2f3333..0b8ff80b1a 100644
--- a/ansible/roles/neutron/defaults/main.yml
+++ b/ansible/roles/neutron/defaults/main.yml
@@ -206,6 +206,19 @@ neutron_database_name: "neutron"
 neutron_database_user: "{% if use_preconfigured_databases | bool and use_common_mariadb_user | bool %}{{ database_user }}{% else %}neutron{% endif %}"
 neutron_database_address: "{{ database_address | put_address_in_context('url') }}:{{ database_port }}"
 
+####################
+# Database sharding
+####################
+neutron_database_shard_root_user: "{% if enable_proxysql | bool %}root_shard_{{ neutron_database_shard_id }}{% else %}{{ database_user }}{% endif %}"
+neutron_database_shard_id: "{{ mariadb_default_database_shard_id | int }}"
+neutron_database_shard:
+  users:
+    - user: "{{ neutron_database_user }}"
+      password: "{{ neutron_database_password }}"
+  rules:
+    - schema: "{{ neutron_database_name }}"
+      shard_id: "{{ neutron_database_shard_id }}"
+
 
 ####################
 # Docker
diff --git a/ansible/roles/neutron/tasks/bootstrap.yml b/ansible/roles/neutron/tasks/bootstrap.yml
index 89502be09e..7dc876bcb1 100644
--- a/ansible/roles/neutron/tasks/bootstrap.yml
+++ b/ansible/roles/neutron/tasks/bootstrap.yml
@@ -6,7 +6,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ neutron_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ neutron_database_name }}"
   run_once: True
@@ -21,7 +21,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ neutron_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ neutron_database_user }}"
       password: "{{ neutron_database_password }}"
diff --git a/ansible/roles/nova-cell/defaults/main.yml b/ansible/roles/nova-cell/defaults/main.yml
index 4cbe04422d..79c4f70077 100644
--- a/ansible/roles/nova-cell/defaults/main.yml
+++ b/ansible/roles/nova-cell/defaults/main.yml
@@ -136,7 +136,7 @@ nova_cell_serialproxy_group: 'nova-serialproxy'
 ####################
 # Database
 ####################
-nova_cell_database_admin_user: "{{ database_user }}"
+nova_cell_database_admin_user: "{{ nova_cell_database_shard_root_user }}"
 nova_cell_database_admin_password: "{{ database_password }}"
 
 nova_cell_database_name: "{{ 'nova_' ~ nova_cell_name if nova_cell_name else 'nova' }}"
@@ -156,6 +156,23 @@ nova_api_database_address: "{{ database_address | put_address_in_context('url')
 # Optional group for cell database. If this is not defined, then the top level database is used.
 # nova_cell_database_group:
 
+####################
+# Database sharding
+####################
+# If nova-cell is used and proxied through proxysql
+# define nova_cell_database_shard_id to shard_id
+# where cell's DB will be installed.
+#
+# If nova-cell is not used and DBs are proxied
+# through proxysql shards are same:
+#  - nova_cell_database_shard_id = nova_database_shard_id
+nova_cell_database_shard_root_user: "{% if enable_proxysql | bool %}root_shard_{{ nova_cell_database_shard_id | default(nova_database_shard_id) }}{% else %}{{ database_user }}{% endif %}"
+nova_cell_database_shard:
+  users:
+    - user: "{{ nova_cell_database_user }}"
+      password: "{{ nova_cell_database_password }}"
+  rules: "{% set rules = [] %}{% for host in groups['nova-conductor'] %}{{ rules.append({'schema': 'nova_' ~ hostvars[host]['nova_cell_name'] if hostvars[host]['nova_cell_name'] is defined else 'nova', 'shard_id': hostvars[host]['nova_cell_database_shard_id'] if (hostvars[host]['nova_cell_name'] is defined and hostvars[host]['nova_cell_database_shard_id'] is defined ) else nova_database_shard_id}) }}{% endfor %}{{ rules }}"
+
 ####################
 # RabbitMQ
 ####################
diff --git a/ansible/roles/nova/defaults/main.yml b/ansible/roles/nova/defaults/main.yml
index ffdcf2ee1f..7354a0f79d 100644
--- a/ansible/roles/nova/defaults/main.yml
+++ b/ansible/roles/nova/defaults/main.yml
@@ -72,6 +72,25 @@ nova_api_database_name: "nova_api"
 nova_api_database_user: "{% if use_preconfigured_databases | bool and use_common_mariadb_user | bool %}{{ database_user }}{% else %}nova_api{% endif %}"
 nova_api_database_address: "{{ database_address | put_address_in_context('url') }}:{{ database_port }}"
 
+####################
+# Database sharding
+####################
+nova_database_shard_root_user: "{% if enable_proxysql | bool %}root_shard_{{ nova_database_shard_id }}{% else %}{{ database_user }}{% endif %}"
+nova_database_shard:
+  users:
+    - user: "{{ nova_database_user }}"
+      password: "{{ nova_database_password }}"
+    - user: "{{ nova_api_database_user }}"
+      password: "{{ nova_api_database_password }}"
+  rules:
+    - schema: "{{ nova_database_name }}"
+      shard_id: "{{ nova_database_shard_id }}"
+    - schema: "{{ nova_cell0_database_name }}"
+      shard_id: "{{ nova_database_shard_id }}"
+    - schema: "{{ nova_api_database_name }}"
+      shard_id: "{{ nova_database_shard_id }}"
+
+
 ####################
 # Docker
 ####################
diff --git a/ansible/roles/nova/tasks/bootstrap.yml b/ansible/roles/nova/tasks/bootstrap.yml
index e770dfe039..a1375720bb 100644
--- a/ansible/roles/nova/tasks/bootstrap.yml
+++ b/ansible/roles/nova/tasks/bootstrap.yml
@@ -6,7 +6,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ nova_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ item }}"
   run_once: True
@@ -23,7 +23,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ nova_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ item.database_username }}"
       password: "{{ item.database_password }}"
diff --git a/ansible/roles/octavia/defaults/main.yml b/ansible/roles/octavia/defaults/main.yml
index 8af04ec28e..72eb1ba662 100644
--- a/ansible/roles/octavia/defaults/main.yml
+++ b/ansible/roles/octavia/defaults/main.yml
@@ -70,6 +70,19 @@ octavia_database_name: "octavia"
 octavia_database_user: "{% if use_preconfigured_databases | bool and use_common_mariadb_user | bool %}{{ database_user }}{% else %}octavia{% endif %}"
 octavia_database_address: "{{ database_address | put_address_in_context('url') }}:{{ database_port }}"
 
+####################
+# Database sharding
+####################
+octavia_database_shard_root_user: "{% if enable_proxysql | bool %}root_shard_{{ octavia_database_shard_id }}{% else %}{{ database_user }}{% endif %}"
+octavia_database_shard_id: "{{ mariadb_default_database_shard_id | int }}"
+octavia_database_shard:
+  users:
+    - user: "{{ octavia_database_user }}"
+      password: "{{ octavia_database_password }}"
+  rules:
+    - schema: "{{ octavia_database_name }}"
+      shard_id: "{{ octavia_database_shard_id }}"
+
 
 ####################
 # Docker
diff --git a/ansible/roles/octavia/tasks/bootstrap.yml b/ansible/roles/octavia/tasks/bootstrap.yml
index 4b76ea70a9..9fb146b02e 100644
--- a/ansible/roles/octavia/tasks/bootstrap.yml
+++ b/ansible/roles/octavia/tasks/bootstrap.yml
@@ -6,7 +6,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ octavia_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ octavia_database_name }}"
   run_once: True
@@ -21,7 +21,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ octavia_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ octavia_database_user }}"
       password: "{{ octavia_database_password }}"
diff --git a/ansible/roles/placement/defaults/main.yml b/ansible/roles/placement/defaults/main.yml
index 081d9e5ee2..26532f30ef 100644
--- a/ansible/roles/placement/defaults/main.yml
+++ b/ansible/roles/placement/defaults/main.yml
@@ -31,6 +31,20 @@ placement_database_name: "placement"
 placement_database_user: "{% if use_preconfigured_databases | bool and use_common_mariadb_user | bool %}{{ database_user }}{% else %}placement{% endif %}"
 placement_database_address: "{{ database_address | put_address_in_context('url') }}:{{ database_port }}"
 
+####################
+# Database sharding
+####################
+placement_database_shard_root_user: "{% if enable_proxysql | bool %}root_shard_{{ placement_database_shard_id }}{% else %}{{ database_user }}{% endif %}"
+placement_database_shard_id: "{{ mariadb_default_database_shard_id | int }}"
+placement_database_shard:
+  users:
+    - user: "{{ placement_database_user }}"
+      password: "{{ placement_database_password }}"
+  rules:
+    - schema: "{{ placement_database_name }}"
+      shard_id: "{{ placement_database_shard_id }}"
+
+
 ####################
 # Docker
 ####################
diff --git a/ansible/roles/placement/tasks/bootstrap.yml b/ansible/roles/placement/tasks/bootstrap.yml
index 92e0f4cb1a..62b4317a92 100644
--- a/ansible/roles/placement/tasks/bootstrap.yml
+++ b/ansible/roles/placement/tasks/bootstrap.yml
@@ -6,7 +6,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ placement_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ placement_database_name }}"
   run_once: True
@@ -21,7 +21,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ placement_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ placement_database_user }}"
       password: "{{ placement_database_password }}"
diff --git a/ansible/roles/prometheus/tasks/bootstrap.yml b/ansible/roles/prometheus/tasks/bootstrap.yml
index 62420b24f5..79d847a030 100644
--- a/ansible/roles/prometheus/tasks/bootstrap.yml
+++ b/ansible/roles/prometheus/tasks/bootstrap.yml
@@ -1,20 +1,27 @@
 ---
 - name: Creating prometheus database user and setting permissions
   become: true
+  vars:
+    shard_id: "{{ item.key }}"
+    shard_root_user: "{{ mariadb_shard_root_user_prefix }}{{ shard_id | string }}"
+    shard_host: "{{ mariadb_shards_info.shards[shard_id].hosts[0] }}"
   kolla_toolbox:
     module_name: mysql_user
     module_args:
       login_host: "{{ database_address }}"
-      login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_port: "{{ mariadb_port }}"
+      login_user: "{{ shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ prometheus_mysql_exporter_database_user }}"
       password: "{{ prometheus_mysql_exporter_database_password }}"
       host: "%"
       priv: "*.*:PROCESS,SLAVE MONITOR,SELECT"
       append_privs: "yes"
+  with_dict: "{{ mariadb_shards_info.shards }}"
+  loop_control:
+    label: "{{ shard_host }}"
   run_once: True
-  delegate_to: "{{ groups['prometheus'][0] }}"
   when:
+    - inventory_hostname == groups['prometheus'][0]
     - enable_prometheus_mysqld_exporter | bool
     - not use_preconfigured_databases | bool
diff --git a/ansible/roles/sahara/defaults/main.yml b/ansible/roles/sahara/defaults/main.yml
index 54b3b7ab62..0c1e146b8b 100644
--- a/ansible/roles/sahara/defaults/main.yml
+++ b/ansible/roles/sahara/defaults/main.yml
@@ -37,6 +37,19 @@ sahara_database_name: "sahara"
 sahara_database_user: "{% if use_preconfigured_databases | bool and use_common_mariadb_user | bool %}{{ database_user }}{% else %}sahara{% endif %}"
 sahara_database_address: "{{ database_address | put_address_in_context('url') }}:{{ database_port }}"
 
+####################
+# Database sharding
+####################
+sahara_database_shard_root_user: "{% if enable_proxysql | bool %}root_shard_{{ sahara_database_shard_id }}{% else %}{{ database_user }}{% endif %}"
+sahara_database_shard_id: "{{ mariadb_default_database_shard_id | int }}"
+sahara_database_shard:
+  users:
+    - user: "{{ sahara_database_user }}"
+      password: "{{ sahara_database_password }}"
+  rules:
+    - schema: "{{ sahara_database_name }}"
+      shard_id: "{{ sahara_database_shard_id }}"
+
 
 ####################
 # Docker
diff --git a/ansible/roles/sahara/tasks/bootstrap.yml b/ansible/roles/sahara/tasks/bootstrap.yml
index f25439f6c1..0ab7ce99e4 100644
--- a/ansible/roles/sahara/tasks/bootstrap.yml
+++ b/ansible/roles/sahara/tasks/bootstrap.yml
@@ -6,7 +6,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ sahara_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ sahara_database_name }}"
   run_once: True
@@ -21,7 +21,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ sahara_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ sahara_database_user }}"
       password: "{{ sahara_database_password }}"
diff --git a/ansible/roles/senlin/defaults/main.yml b/ansible/roles/senlin/defaults/main.yml
index d01c16f017..ed81609d7a 100644
--- a/ansible/roles/senlin/defaults/main.yml
+++ b/ansible/roles/senlin/defaults/main.yml
@@ -53,6 +53,19 @@ senlin_database_name: "senlin"
 senlin_database_user: "{% if use_preconfigured_databases | bool and use_common_mariadb_user | bool %}{{ database_user }}{% else %}senlin{% endif %}"
 senlin_database_address: "{{ database_address | put_address_in_context('url') }}:{{ database_port }}"
 
+####################
+# Database sharding
+####################
+senlin_database_shard_root_user: "{% if enable_proxysql | bool %}root_shard_{{ senlin_database_shard_id }}{% else %}{{ database_user }}{% endif %}"
+senlin_database_shard_id: "{{ mariadb_default_database_shard_id | int }}"
+senlin_database_shard:
+  users:
+    - user: "{{ senlin_database_user }}"
+      password: "{{ senlin_database_password }}"
+  rules:
+    - schema: "{{ senlin_database_name }}"
+      shard_id: "{{ senlin_database_shard_id }}"
+
 
 ####################
 # Docker
diff --git a/ansible/roles/senlin/tasks/bootstrap.yml b/ansible/roles/senlin/tasks/bootstrap.yml
index fed3edbd1d..8ff87b92a4 100644
--- a/ansible/roles/senlin/tasks/bootstrap.yml
+++ b/ansible/roles/senlin/tasks/bootstrap.yml
@@ -6,7 +6,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ senlin_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ senlin_database_name }}"
   run_once: True
@@ -21,7 +21,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ senlin_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ senlin_database_user }}"
       password: "{{ senlin_database_password }}"
diff --git a/ansible/roles/solum/defaults/main.yml b/ansible/roles/solum/defaults/main.yml
index 0832b5f9e8..b1166446c9 100644
--- a/ansible/roles/solum/defaults/main.yml
+++ b/ansible/roles/solum/defaults/main.yml
@@ -65,6 +65,19 @@ solum_database_name: "solum"
 solum_database_user: "{% if use_preconfigured_databases | bool and use_common_mariadb_user | bool %}{{ database_user }}{% else %}solum{% endif %}"
 solum_database_address: "{{ database_address | put_address_in_context('url') }}:{{ database_port }}"
 
+####################
+# Database sharding
+####################
+solum_database_shard_root_user: "{% if enable_proxysql | bool %}root_shard_{{ solum_database_shard_id }}{% else %}{{ database_user }}{% endif %}"
+solum_database_shard_id: "{{ mariadb_default_database_shard_id | int }}"
+solum_database_shard:
+  users:
+    - user: "{{ solum_database_user }}"
+      password: "{{ solum_database_password }}"
+  rules:
+    - schema: "{{ solum_database_name }}"
+      shard_id: "{{ solum_database_shard_id }}"
+
 
 ####################
 # Docker
diff --git a/ansible/roles/solum/tasks/bootstrap.yml b/ansible/roles/solum/tasks/bootstrap.yml
index e89d04bbf7..cf38cbb42f 100644
--- a/ansible/roles/solum/tasks/bootstrap.yml
+++ b/ansible/roles/solum/tasks/bootstrap.yml
@@ -6,7 +6,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ solum_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ solum_database_name }}"
   run_once: True
@@ -21,7 +21,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ solum_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ solum_database_user }}"
       password: "{{ solum_database_password }}"
diff --git a/ansible/roles/tacker/defaults/main.yml b/ansible/roles/tacker/defaults/main.yml
index d7b11dccb5..aa67d1a549 100644
--- a/ansible/roles/tacker/defaults/main.yml
+++ b/ansible/roles/tacker/defaults/main.yml
@@ -39,6 +39,20 @@ tacker_database_name: "tacker"
 tacker_database_user: "{% if use_preconfigured_databases | bool and use_common_mariadb_user | bool %}{{ database_user }}{% else %}tacker{% endif %}"
 tacker_database_address: "{{ database_address | put_address_in_context('url') }}:{{ database_port }}"
 
+####################
+# Database sharding
+####################
+tacker_database_shard_root_user: "{% if enable_proxysql | bool %}root_shard_{{ tacker_database_shard_id }}{% else %}{{ database_user }}{% endif %}"
+tacker_database_shard_id: "{{ mariadb_default_database_shard_id | int }}"
+tacker_database_shard:
+  users:
+    - user: "{{ tacker_database_user }}"
+      password: "{{ tacker_database_password }}"
+  rules:
+    - schema: "{{ tacker_database_name }}"
+      shard_id: "{{ tacker_database_shard_id }}"
+
+
 ########
 # Docker
 ########
diff --git a/ansible/roles/tacker/tasks/bootstrap.yml b/ansible/roles/tacker/tasks/bootstrap.yml
index 1025cb28a4..623ca52130 100644
--- a/ansible/roles/tacker/tasks/bootstrap.yml
+++ b/ansible/roles/tacker/tasks/bootstrap.yml
@@ -6,7 +6,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ tacker_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ tacker_database_name }}"
   run_once: True
@@ -21,7 +21,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ tacker_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ tacker_database_user }}"
       password: "{{ tacker_database_password }}"
diff --git a/ansible/roles/trove/defaults/main.yml b/ansible/roles/trove/defaults/main.yml
index 78e39c7da5..1a64457676 100644
--- a/ansible/roles/trove/defaults/main.yml
+++ b/ansible/roles/trove/defaults/main.yml
@@ -44,6 +44,19 @@ trove_database_name: "trove"
 trove_database_user: "{% if use_preconfigured_databases | bool and use_common_mariadb_user | bool %}{{ database_user }}{% else %}trove{% endif %}"
 trove_database_address: "{{ database_address | put_address_in_context('url') }}:{{ database_port }}"
 
+####################
+# Database sharding
+####################
+trove_database_shard_root_user: "{% if enable_proxysql | bool %}root_shard_{{ trove_database_shard_id }}{% else %}{{ database_user }}{% endif %}"
+trove_database_shard_id: "{{ mariadb_default_database_shard_id | int }}"
+trove_database_shard:
+  users:
+    - user: "{{ trove_database_user }}"
+      password: "{{ trove_database_password }}"
+  rules:
+    - schema: "{{ trove_database_name }}"
+      shard_id: "{{ trove_database_shard_id }}"
+
 
 ####################
 # Docker
diff --git a/ansible/roles/trove/tasks/bootstrap.yml b/ansible/roles/trove/tasks/bootstrap.yml
index f1f88fb729..c3d5ba5787 100644
--- a/ansible/roles/trove/tasks/bootstrap.yml
+++ b/ansible/roles/trove/tasks/bootstrap.yml
@@ -6,7 +6,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ trove_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ trove_database_name }}"
   run_once: True
@@ -21,7 +21,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ trove_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ trove_database_user }}"
       password: "{{ trove_database_password }}"
diff --git a/ansible/roles/vitrage/defaults/main.yml b/ansible/roles/vitrage/defaults/main.yml
index beb3938f11..cbc5ed5521 100644
--- a/ansible/roles/vitrage/defaults/main.yml
+++ b/ansible/roles/vitrage/defaults/main.yml
@@ -59,6 +59,20 @@ vitrage_database_name: "vitrage"
 vitrage_database_user: "{% if use_preconfigured_databases | bool and use_common_mariadb_user | bool %}{{ database_user }}{% else %}vitrage{% endif %}"
 vitrage_database_address: "{{ database_address | put_address_in_context('url') }}:{{ database_port }}"
 
+####################
+# Database sharding
+####################
+vitrage_database_shard_root_user: "{% if enable_proxysql | bool %}root_shard_{{ vitrage_database_shard_id }}{% else %}{{ database_user }}{% endif %}"
+vitrage_database_shard_id: "{{ mariadb_default_database_shard_id | int }}"
+vitrage_database_shard:
+  users:
+    - user: "{{ vitrage_database_user }}"
+      password: "{{ vitrage_database_password }}"
+  rules:
+    - schema: "{{ vitrage_database_name }}"
+      shard_id: "{{ vitrage_database_shard_id }}"
+
+
 ####################
 # Docker
 ####################
diff --git a/ansible/roles/vitrage/tasks/bootstrap.yml b/ansible/roles/vitrage/tasks/bootstrap.yml
index a9565717cf..2670fbf7a7 100644
--- a/ansible/roles/vitrage/tasks/bootstrap.yml
+++ b/ansible/roles/vitrage/tasks/bootstrap.yml
@@ -6,7 +6,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ vitrage_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ vitrage_database_name }}"
   run_once: True
@@ -21,7 +21,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ vitrage_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ vitrage_database_user }}"
       password: "{{ vitrage_database_password }}"
diff --git a/ansible/roles/watcher/defaults/main.yml b/ansible/roles/watcher/defaults/main.yml
index 0b9fed7aa6..80ad86db57 100644
--- a/ansible/roles/watcher/defaults/main.yml
+++ b/ansible/roles/watcher/defaults/main.yml
@@ -44,6 +44,19 @@ watcher_database_name: "watcher"
 watcher_database_user: "{% if use_preconfigured_databases | bool and use_common_mariadb_user | bool %}{{ database_user }}{% else %}watcher{% endif %}"
 watcher_database_address: "{{ database_address | put_address_in_context('url') }}:{{ database_port }}"
 
+####################
+# Database sharding
+####################
+watcher_database_shard_root_user: "{% if enable_proxysql | bool %}root_shard_{{ watcher_database_shard_id }}{% else %}{{ database_user }}{% endif %}"
+watcher_database_shard_id: "{{ mariadb_default_database_shard_id | int }}"
+watcher_database_shard:
+  users:
+    - user: "{{ watcher_database_user }}"
+      password: "{{ watcher_database_password }}"
+  rules:
+    - schema: "{{ watcher_database_name }}"
+      shard_id: "{{ watcher_database_shard_id }}"
+
 
 ####################
 # Docker
diff --git a/ansible/roles/watcher/tasks/bootstrap.yml b/ansible/roles/watcher/tasks/bootstrap.yml
index 20732674be..d1622da412 100644
--- a/ansible/roles/watcher/tasks/bootstrap.yml
+++ b/ansible/roles/watcher/tasks/bootstrap.yml
@@ -6,7 +6,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ watcher_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ watcher_database_name }}"
   run_once: True
@@ -21,7 +21,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ watcher_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ watcher_database_user }}"
       password: "{{ watcher_database_password }}"
diff --git a/ansible/roles/zun/defaults/main.yml b/ansible/roles/zun/defaults/main.yml
index 09ca763246..bcdd17192c 100644
--- a/ansible/roles/zun/defaults/main.yml
+++ b/ansible/roles/zun/defaults/main.yml
@@ -64,6 +64,19 @@ zun_database_name: "zun"
 zun_database_user: "{% if use_preconfigured_databases | bool and use_common_mariadb_user | bool %}{{ database_user }}{% else %}zun{% endif %}"
 zun_database_address: "{{ database_address | put_address_in_context('url') }}:{{ database_port }}"
 
+####################
+# Database sharding
+####################
+zun_database_shard_root_user: "{% if enable_proxysql | bool %}root_shard_{{ zun_database_shard_id }}{% else %}{{ database_user }}{% endif %}"
+zun_database_shard_id: "{{ mariadb_default_database_shard_id | int }}"
+zun_database_shard:
+  users:
+    - user: "{{ zun_database_user }}"
+      password: "{{ zun_database_password }}"
+  rules:
+    - schema: "{{ zun_database_name }}"
+      shard_id: "{{ zun_database_shard_id }}"
+
 
 ####################
 ## Docker
diff --git a/ansible/roles/zun/tasks/bootstrap.yml b/ansible/roles/zun/tasks/bootstrap.yml
index 94c40d0090..6b45af6eaf 100644
--- a/ansible/roles/zun/tasks/bootstrap.yml
+++ b/ansible/roles/zun/tasks/bootstrap.yml
@@ -6,7 +6,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ zun_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ zun_database_name }}"
   run_once: True
@@ -21,7 +21,7 @@
     module_args:
       login_host: "{{ database_address }}"
       login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
+      login_user: "{{ zun_database_shard_root_user }}"
       login_password: "{{ database_password }}"
       name: "{{ zun_database_user }}"
       password: "{{ zun_database_password }}"