diff --git a/ansible/library/kolla_toolbox.py b/ansible/library/kolla_toolbox.py
new file mode 100644
index 0000000000000000000000000000000000000000..1548995282cdb5ca49f7dfb4968ed77957b94d8e
--- /dev/null
+++ b/ansible/library/kolla_toolbox.py
@@ -0,0 +1,121 @@
+#!/usr/bin/python
+
+# Copyright 2016 99cloud Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+DOCUMENTATION = '''
+---
+module: kolla_toolbox
+short_description: >
+  Module for invoking ansible module in kolla_toolbox container.
+description:
+  - A module targerting at invoking ansible module in kolla_toolbox
+    container as used by Kolla project.
+options:
+  module_name:
+    description:
+      - The module name to invoke
+    required: True
+    type: str
+  module_args:
+    description:
+      - The module args use by the module
+    required: False
+    type: str or dict
+author: Jeffrey Zhang
+'''
+
+EXAMPLES = '''
+- hosts: controller
+  tasks:
+    - name: Ensure the direct absent
+      kolla_toolbox:
+        module_name: file
+        module_args: path=/tmp/a state=absent
+    - name: Create mysql database
+      kolla_toolbox:
+        module_name: mysql_db
+        module_args:
+          login_host: 192.168.1.10
+          login_user: root
+          login_password: admin
+          name: testdb
+'''
+
+
+import docker
+import json
+import re
+
+
+JSON_REG = re.compile('^(?P<host>\w+) \| (?P<status>\w+)!? =>(?P<stdout>.*)$',
+                      re.MULTILINE | re.DOTALL)
+NON_JSON_REG = re.compile(('^(?P<host>\w+) \| (?P<status>\w+)!? \| '
+                           'rc=(?P<exit_code>\d+) >>\n(?P<stdout>.*)\n$'),
+                          re.MULTILINE | re.DOTALL)
+
+
+def gen_commandline(params):
+    command = ['ansible', 'localhost']
+    if params.get('module_name'):
+        command.extend(['-m', params.get('module_name')])
+    if params.get('module_args'):
+        module_args = params.get('module_args')
+        if isinstance(module_args, dict):
+            module_args = ' '.join("{}='{}'".format(key, value)
+                                   for key, value in module_args.items())
+        command.extend(['-a', module_args])
+    return command
+
+
+def main():
+    specs = dict(
+        module_name=dict(type='str'),
+        module_args=dict(type='str')
+        )
+    module = AnsibleModule(argument_spec=specs, bypass_checks=True)
+    client = docker.Client()
+    command_line = gen_commandline(module.params)
+    kolla_toolbox = client.containers(all=True,
+                                      filters=dict(name='kolla_toolbox'))
+    if not kolla_toolbox:
+        module.fail_json(msg='Can not find kolla_toolbox container in target')
+    kolla_toolbox = kolla_toolbox[0]
+    if kolla_toolbox['State'] != 'running':
+        module.fail_json(msg='kolla_toolbox container is not running')
+
+    job = client.exec_create(kolla_toolbox, command_line)
+    output = client.exec_start(job)
+
+    for exp in [JSON_REG, NON_JSON_REG]:
+        m = exp.match(output)
+        if m:
+            inner_output = m.groupdict().get('stdout')
+            break
+    else:
+        module.fail_json(
+            msg='Can not parse the inner module output: %s' % output)
+
+    ret = dict()
+    try:
+        ret = json.loads(inner_output)
+    except ValueError:
+        ret['stdout'] = inner_output
+
+    module.exit_json(**ret)
+
+
+from ansible.module_utils.basic import *  # noqa
+if __name__ == "__main__":
+    main()
diff --git a/ansible/roles/aodh/tasks/bootstrap.yml b/ansible/roles/aodh/tasks/bootstrap.yml
index e532e899d9f96dccbc16f6a8f2c94e0081928abd..7c34e9397be3b6f34160749029bf249cf4afd3fb 100644
--- a/ansible/roles/aodh/tasks/bootstrap.yml
+++ b/ansible/roles/aodh/tasks/bootstrap.yml
@@ -1,41 +1,32 @@
 ---
 - name: Creating aodh database
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_db
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ aodh_database_name }}'"
+  kolla_toolbox:
+    module_name: mysql_db
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ aodh_database_name }}"
   register: database
-  changed_when: "{{ database.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database.stdout.split()[2] != 'SUCCESS'
   run_once: True
   delegate_to: "{{ groups['aodh-api'][0] }}"
 
-- name: Reading json from variable
-  set_fact:
-    database_created: "{{ (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-
 - name: Creating aodh database user and setting permissions
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_user
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ aodh_database_name }}'
-        password='{{ aodh_database_password }}'
-        host='%'
-        priv='{{ aodh_database_name }}.*:ALL'
-        append_privs='yes'"
-  register: database_user_create
-  changed_when: "{{ database_user_create.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database_user_create.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database_user_create.stdout.split()[2] != 'SUCCESS'
+  kolla_toolbox:
+    module_name: mysql_user
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ aodh_database_name }}"
+      password: "{{ aodh_database_password }}"
+      host: "%"
+      priv: "{{ aodh_database_name }}.*:ALL"
+      append_privs: "yes"
   run_once: True
   delegate_to: "{{ groups['aodh-api'][0] }}"
 
 - include: bootstrap_service.yml
-  when: database_created
+  when: database.changed
diff --git a/ansible/roles/barbican/tasks/bootstrap.yml b/ansible/roles/barbican/tasks/bootstrap.yml
index b37ae864281d5204fb8c53708be1dfd6f92fa52c..a2775dcfdaed76f74bfa9c7887a9a890af7dc32f 100644
--- a/ansible/roles/barbican/tasks/bootstrap.yml
+++ b/ansible/roles/barbican/tasks/bootstrap.yml
@@ -1,41 +1,32 @@
 ---
 - name: Creating barbican database
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_db
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ barbican_database_name }}'"
+  kolla_toolbox:
+    module_name: mysql_db
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ barbican_database_name }}"
   register: database
-  changed_when: "{{ database.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database.stdout.split()[2] != 'SUCCESS'
   run_once: True
   delegate_to: "{{ groups['barbican-api'][0] }}"
 
-- name: Reading json from variable
-  set_fact:
-    database_created: "{{ (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-
 - name: Creating barbican database user and setting permissions
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_user
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ barbican_database_name }}'
-        password='{{ barbican_database_password }}'
-        host='%'
-        priv='{{ barbican_database_name }}.*:ALL'
-        append_privs='yes'"
-  register: database_user_create
-  changed_when: "{{ database_user_create.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database_user_create.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database_user_create.stdout.split()[2] != 'SUCCESS'
+  kolla_toolbox:
+    module_name: mysql_user
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ barbican_database_name }}"
+      password: "{{ barbican_database_password }}"
+      host: "%"
+      priv: "{{ barbican_database_name }}.*:ALL"
+      append_privs: "yes"
   run_once: True
   delegate_to: "{{ groups['barbican-api'][0] }}"
 
 - include: bootstrap_service.yml
-  when: database_created
+  when: database.changed
diff --git a/ansible/roles/ceilometer/tasks/bootstrap.yml b/ansible/roles/ceilometer/tasks/bootstrap.yml
index 7078709ed61dbc5fe483827de4e29d77d6e443e7..31085c8533baec2621b32335690148140d210a56 100644
--- a/ansible/roles/ceilometer/tasks/bootstrap.yml
+++ b/ansible/roles/ceilometer/tasks/bootstrap.yml
@@ -11,13 +11,14 @@
     - ceilometer_database_type == "mongodb"
 
 - name: Checking Ceilometer mysql database
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_db
-    -a "login_host='{{ ceilometer_database_mysql_address }}'
-        login_port='{{ ceilometer_database_port }}'
-        login_user='{{ ceilometer_database_user }}'
-        login_password='{{ ceilometer_database_password }}'
-        name='{{ ceilometer_database_name }}'"
+  kolla_toolbox:
+    module_name: mysql_db
+    module_args:
+      login_host: "{{ ceilometer_database_mysql_address }}"
+      login_port: "{{ ceilometer_database_port }}"
+      login_user: "{{ ceilomter_database_user }}"
+      login_password: "{{ ceilometer_database_password }}"
+      name: "{{ ceilometer_database_name }}"
   register: mysql_access
   failed_when: False
   changed_when: False
@@ -26,17 +27,15 @@
     - ceilometer_database_type == "mysql"
 
 - name: Creating Ceilometer mysql database
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_db
-    -a "login_host='{{ ceilometer_database_mysql_address }}'
-        login_port='{{ ceilometer_database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ ceilometer_database_name }}'"
+  kolla_toolbox:
+    module_name: mysql_db
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ ceilometer_database_name }}"
   register: mysql_ceilometer_database
-  changed_when: "{{ mysql_ceilometer_database.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (mysql_ceilometer_database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: mysql_ceilometer_database.stdout.split()[2] != 'SUCCESS'
   run_once: True
   delegate_to: "{{ groups['ceilometer-api'][0] }}"
   when:
@@ -44,21 +43,18 @@
     - "'FAILED' in mysql_access.stdout"
 
 - name: Creating Ceilometer database user and setting permissions
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_user
-    -a "login_host='{{ ceilometer_database_mysql_address }}'
-        login_port='{{ ceilometer_database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ ceilometer_database_name }}'
-        password='{{ ceilometer_database_password }}'
-        host='%'
-        priv='{{ ceilometer_database_name }}.*:ALL'
-        append_privs='yes'"
-  register: database_user_create
-  changed_when: "{{ database_user_create.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database_user_create.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database_user_create.stdout.split()[2] != 'SUCCESS'
+  kolla_toolbox:
+    module_name: mysql_user
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ ceilometer_database_name }}"
+      password: "{{ ceilometer_database_password }}"
+      host: "%"
+      priv: "{{ ceilometer_database_name }}.*:ALL"
+      append_privs: "yes"
   run_once: True
   delegate_to: "{{ groups['ceilometer-api'][0] }}"
   when:
@@ -69,5 +65,5 @@
 # NOTE(vbel): bootstrapping of mysql db for ceilometer is idempotent
 - include: bootstrap_service.yml
   when: ((ceilometer_database_type == "mongodb" and mongodb_ceilometer_database.changed)
-         or ceilometer_database_type == "mysql"
+         or (ceilometer_database_type == "mysql" and mysql_ceilometer_database.changed )
          or ceilometer_database_type == "gnocchi")
diff --git a/ansible/roles/cinder/tasks/bootstrap.yml b/ansible/roles/cinder/tasks/bootstrap.yml
index f2a62dc141d4c7e7e6c8477bff486d6026f5c6d0..5a38351fc40fd32c58006790318270e16a77cbd6 100644
--- a/ansible/roles/cinder/tasks/bootstrap.yml
+++ b/ansible/roles/cinder/tasks/bootstrap.yml
@@ -1,41 +1,32 @@
 ---
 - name: Creating Cinder database
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_db
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ cinder_database_name }}'"
+  kolla_toolbox:
+    module_name: mysql_db
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ cinder_database_name }}"
   register: database
-  changed_when: "{{ database.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database.stdout.split()[2] != 'SUCCESS'
   run_once: True
   delegate_to: "{{ groups['cinder-api'][0] }}"
 
-- name: Reading json from variable
-  set_fact:
-    database_created: "{{ (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-
 - name: Creating Cinder database user and setting permissions
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_user
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ cinder_database_name }}'
-        password='{{ cinder_database_password }}'
-        host='%'
-        priv='{{ cinder_database_name }}.*:ALL'
-        append_privs='yes'"
-  register: database_user_create
-  changed_when: "{{ database_user_create.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database_user_create.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database_user_create.stdout.split()[2] != 'SUCCESS'
+  kolla_toolbox:
+    module_name: mysql_user
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ cinder_database_name }}"
+      password: "{{ cinder_database_password }}"
+      host: "%"
+      priv: "{{ cinder_database_name }}.*:ALL"
+      append_privs: "yes"
   run_once: True
   delegate_to: "{{ groups['cinder-api'][0] }}"
 
 - include: bootstrap_service.yml
-  when: database_created
+  when: database.changed
diff --git a/ansible/roles/cloudkitty/tasks/bootstrap.yml b/ansible/roles/cloudkitty/tasks/bootstrap.yml
index 4e9de7a173a1c3d1134923ca3e4dde3df1db7826..47f85002ebdcabe958f5ee40850915c47d5fa53c 100644
--- a/ansible/roles/cloudkitty/tasks/bootstrap.yml
+++ b/ansible/roles/cloudkitty/tasks/bootstrap.yml
@@ -1,41 +1,32 @@
 ---
 - name: Creating Cloudkitty database
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_db
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ cloudkitty_database_name }}'"
+  kolla_toolbox:
+    module_name: mysql_db
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ cloudkitty_database_name }}"
   register: database
-  changed_when: "{{ database.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database.stdout.split()[2] != 'SUCCESS'
   run_once: True
   delegate_to: "{{ groups['cloudkitty-api'][0] }}"
 
-- name: Reading json from variable
-  set_fact:
-    database_created: "{{ (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-
 - name: Creating Cloudkitty database user and setting permissions
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_user
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ cloudkitty_database_name }}'
-        password='{{ cloudkitty_database_password }}'
-        host='%'
-        priv='{{ cloudkitty_database_name }}.*:ALL'
-        append_privs='yes'"
-  register: database_user_create
-  changed_when: "{{ database_user_create.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database_user_create.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database_user_create.stdout.split()[2] != 'SUCCESS'
+  kolla_toolbox:
+    module_name: mysql_user
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ cloudkitty_database_name }}"
+      password: "{{ cloudkitty_database_password }}"
+      host: "%"
+      priv: "{{ cloudkitty_database_name }}.*:ALL"
+      append_privs: "yes"
   run_once: True
   delegate_to: "{{ groups['cloudkitty-api'][0] }}"
 
 - include: bootstrap_service.yml
-  when: database_created
+  when: database.changed
diff --git a/ansible/roles/congress/tasks/bootstrap.yml b/ansible/roles/congress/tasks/bootstrap.yml
index 30495941603fe0c838e29051a100d12f87787651..86b49fd8e28fec0908943e4bb9eaaf4d0de2d14b 100644
--- a/ansible/roles/congress/tasks/bootstrap.yml
+++ b/ansible/roles/congress/tasks/bootstrap.yml
@@ -1,41 +1,32 @@
 ---
 - name: Creating congress database
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_db
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ congress_database_name }}'"
+  kolla_toolbox:
+    module_name: mysql_db
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ congress_database_name }}"
   register: database
-  changed_when: "{{ database.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database.stdout.split()[2] != 'SUCCESS'
   run_once: True
   delegate_to: "{{ groups['congress-api'][0] }}"
 
-- name: Reading json from variable
-  set_fact:
-    database_created: "{{ (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-
 - name: Creating congress database user and setting permissions
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_user
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ congress_database_name }}'
-        password='{{ congress_database_password }}'
-        host='%'
-        priv='{{ congress_database_name }}.*:ALL'
-        append_privs='yes'"
-  register: database_user_create
-  changed_when: "{{ database_user_create.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database_user_create.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database_user_create.stdout.split()[2] != 'SUCCESS'
+  kolla_toolbox:
+    module_name: mysql_user
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ congress_database_name }}"
+      password: "{{ congress_database_password }}"
+      host: "%"
+      priv: "{{ congress_database_name }}.*:ALL"
+      append_privs: "yes"
   run_once: True
   delegate_to: "{{ groups['congress-api'][0] }}"
 
 - include: bootstrap_service.yml
-  when: database_created
+  when: database.changed
diff --git a/ansible/roles/glance/tasks/bootstrap.yml b/ansible/roles/glance/tasks/bootstrap.yml
index 10d650d926905701a7962ffbe618a948615f1cc9..cafdfd4cf81f737747561375e561d6803c6a4050 100644
--- a/ansible/roles/glance/tasks/bootstrap.yml
+++ b/ansible/roles/glance/tasks/bootstrap.yml
@@ -1,41 +1,32 @@
 ---
 - name: Creating Glance database
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_db
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ glance_database_name }}'"
+  kolla_toolbox:
+    module_name: mysql_db
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ glance_database_name }}"
   register: database
-  changed_when: "{{ database.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database.stdout.split()[2] != 'SUCCESS'
   run_once: True
   delegate_to: "{{ groups['glance-api'][0] }}"
 
-- name: Reading json from variable
-  set_fact:
-    database_created: "{{ (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-
 - name: Creating Glance database user and setting permissions
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_user
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ glance_database_name }}'
-        password='{{ glance_database_password }}'
-        host='%'
-        priv='{{ glance_database_name }}.*:ALL'
-        append_privs='yes'"
-  register: database_user_create
-  changed_when: "{{ database_user_create.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database_user_create.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database_user_create.stdout.split()[2] != 'SUCCESS'
+  kolla_toolbox:
+    module_name: mysql_user
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ glance_database_name }}"
+      password: "{{ glance_database_password }}"
+      host: "%"
+      priv: "{{ glance_database_name }}.*:ALL"
+      append_privs: "yes"
   run_once: True
   delegate_to: "{{ groups['glance-api'][0] }}"
 
 - include: bootstrap_service.yml
-  when: database_created
+  when: database.changed
diff --git a/ansible/roles/gnocchi/tasks/bootstrap.yml b/ansible/roles/gnocchi/tasks/bootstrap.yml
index 70611b85d5002fc9703c266ec0dd15b1a78e8a2b..671dfac5ed9f1cec22886b80341ac9437b33add5 100644
--- a/ansible/roles/gnocchi/tasks/bootstrap.yml
+++ b/ansible/roles/gnocchi/tasks/bootstrap.yml
@@ -1,41 +1,32 @@
 ---
 - name: Creating gnocchi database
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_db
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ gnocchi_database_name }}'"
+  kolla_toolbox:
+    module_name: mysql_db
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ gnocchi_database_name }}"
   register: database
-  changed_when: "{{ database.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database.stdout.split()[2] != 'SUCCESS'
   run_once: True
   delegate_to: "{{ groups['gnocchi-api'][0] }}"
 
-- name: Reading json from variable
-  set_fact:
-    database_created: "{{ (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-
 - name: Creating gnocchi database user and setting permissions
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_user
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ gnocchi_database_name }}'
-        password='{{ gnocchi_database_password }}'
-        host='%'
-        priv='{{ gnocchi_database_name }}.*:ALL'
-        append_privs='yes'"
-  register: database_user_create
-  changed_when: "{{ database_user_create.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database_user_create.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database_user_create.stdout.split()[2] != 'SUCCESS'
+  kolla_toolbox:
+    module_name: mysql_user
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ gnocchi_database_name }}"
+      password: "{{ gnocchi_database_password }}"
+      host: "%"
+      priv: "{{ gnocchi_database_name }}.*:ALL"
+      append_privs: "yes"
   run_once: True
   delegate_to: "{{ groups['gnocchi-api'][0] }}"
 
 - include: bootstrap_service.yml
-  when: database_created
+  when: database.changed
diff --git a/ansible/roles/grafana/tasks/bootstrap.yml b/ansible/roles/grafana/tasks/bootstrap.yml
index 492b516e20e3a0d24e3805e0b198ae826950eec3..dba3614aec1d0d849bc50df97d19d729f15f9656 100644
--- a/ansible/roles/grafana/tasks/bootstrap.yml
+++ b/ansible/roles/grafana/tasks/bootstrap.yml
@@ -1,38 +1,24 @@
 ---
 - name: Creating grafana database
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_db
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ grafana_database_name }}'"
-  register: database
-  changed_when: "{{ database.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database.stdout.split()[2] != 'SUCCESS'
+  mysql_db:
+    login_host: "{{ database_address }}"
+    login_port: "{{ database_port }}"
+    login_user: "{{ database_user }}"
+    login_password: "{{ database_password }}"
+    name: "{{ grafana_database_name }}"
   run_once: True
   delegate_to: "{{ groups['grafana'][0] }}"
 
-- name: Reading json from variable
-  set_fact:
-    database_created: "{{ (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-
 - name: Creating grafana database user and setting permissions
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_user
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ grafana_database_name }}'
-        password='{{ grafana_database_password }}'
-        host='%'
-        priv='{{ grafana_database_name }}.*:ALL'
-        append_privs='yes'"
-  register: database_user_create
-  changed_when: "{{ database_user_create.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database_user_create.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database_user_create.stdout.split()[2] != 'SUCCESS'
+  mysql_user:
+    login_host: "{{ database_address }}"
+    login_port: "{{ database_port }}"
+    login_user: "{{ database_user }}"
+    login_password: "{{ database_password }}"
+    name: "{{ grafana_database_name }}"
+    password: "{{ grafana_database_password }}"
+    host: "%"
+    priv: "{{ grafana_database_name }}.*:ALL"
+    append_privs: "yes"
   run_once: True
   delegate_to: "{{ groups['grafana'][0] }}"
diff --git a/ansible/roles/heat/tasks/bootstrap.yml b/ansible/roles/heat/tasks/bootstrap.yml
index 50c74920b2db123d8101019d1df1c4f603ca7f70..2895989b2651b89a9bac551057b08ec99dac2aab 100644
--- a/ansible/roles/heat/tasks/bootstrap.yml
+++ b/ansible/roles/heat/tasks/bootstrap.yml
@@ -1,41 +1,32 @@
 ---
 - name: Creating Heat database
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_db
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ heat_database_name }}'"
+  kolla_toolbox:
+    module_name: mysql_db
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ heat_database_name }}"
   register: database
-  changed_when: "{{ database.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database.stdout.split()[2] != 'SUCCESS'
   run_once: True
   delegate_to: "{{ groups['heat-api'][0] }}"
 
-- name: Reading json from variable
-  set_fact:
-    database_created: "{{ (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-
 - name: Creating Heat database user and setting permissions
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_user
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ heat_database_name }}'
-        password='{{ heat_database_password }}'
-        host='%'
-        priv='{{ heat_database_name }}.*:ALL'
-        append_privs='yes'"
-  register: database_user_create
-  changed_when: "{{ database_user_create.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database_user_create.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database_user_create.stdout.split()[2] != 'SUCCESS'
+  kolla_toolbox:
+    module_name: mysql_user
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ heat_database_name }}"
+      password: "{{ heat_database_password }}"
+      host: "%"
+      priv: "{{ heat_database_name }}.*:ALL"
+      append_privs: "yes"
   run_once: True
   delegate_to: "{{ groups['heat-api'][0] }}"
 
 - include: bootstrap_service.yml
-  when: database_created
+  when: database.changed
diff --git a/ansible/roles/horizon/tasks/bootstrap.yml b/ansible/roles/horizon/tasks/bootstrap.yml
index 6e6127495a7926d5d7db83f118afe924929eacb7..ae924745740c6b930714812c907da068bda361aa 100644
--- a/ansible/roles/horizon/tasks/bootstrap.yml
+++ b/ansible/roles/horizon/tasks/bootstrap.yml
@@ -1,41 +1,32 @@
 ---
 - name: Creating Horizon database
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_db
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ horizon_database_name }}'"
+  kolla_toolbox:
+    module_name: mysql_db
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ horizon_database_name }}"
   register: database
-  changed_when: "{{ database.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database.stdout.split()[2] != 'SUCCESS'
   run_once: True
   delegate_to: "{{ groups['horizon'][0] }}"
 
-- name: Reading json from variable
-  set_fact:
-    database_created: "{{ (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-
 - name: Creating Horizon database user and setting permissions
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_user
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ horizon_database_name }}'
-        password='{{ horizon_database_password }}'
-        host='%'
-        priv='{{ horizon_database_name }}.*:ALL'
-        append_privs='yes'"
-  register: database_user_create
-  changed_when: "{{ database_user_create.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database_user_create.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database_user_create.stdout.split()[2] != 'SUCCESS'
+  kolla_toolbox:
+    module_name: mysql_user
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ horizon_database_name }}"
+      password: "{{ horizon_database_password }}"
+      host: "%"
+      priv: "{{ horizon_database_name }}.*:ALL"
+      append_privs: "yes"
   run_once: True
   delegate_to: "{{ groups['horizon'][0] }}"
 
 - include: bootstrap_service.yml
-  when: database_created
+  when: database.changed
diff --git a/ansible/roles/ironic/tasks/bootstrap.yml b/ansible/roles/ironic/tasks/bootstrap.yml
index 54eecc0f0e224b78a5410832aa6d4a516c749480..bbeba8e5f9b8bf7704ca35e1de554250d4809616 100644
--- a/ansible/roles/ironic/tasks/bootstrap.yml
+++ b/ansible/roles/ironic/tasks/bootstrap.yml
@@ -1,44 +1,35 @@
 ---
 - name: Creating Ironic database
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_db
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ ironic_database_name }}'"
+  kolla_toolbox:
+    module_name: mysql_db
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ ironic_database_name }}"
   register: database
-  changed_when: "{{ database.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database.stdout.split()[2] != 'SUCCESS'
   run_once: True
   delegate_to: "{{ groups['ironic-api'][0] }}"
 
-- name: Reading json from variable
-  set_fact:
-    database_created: "{{ (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-
 - name: Creating Ironic database user and setting permissions
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_user
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ ironic_database_name }}'
-        password='{{ ironic_database_password }}'
-        host='%'
-        priv='{{ ironic_database_name }}.*:ALL'
-        append_privs='yes'"
-  register: database_user_create
-  changed_when: "{{ database.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database_user_create.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database_user_create.stdout.split()[2] != 'SUCCESS'
+  kolla_toolbox:
+    module_name: mysql_user
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ ironic_database_name }}"
+      password: "{{ ironic_database_password }}"
+      host: "%"
+      priv: "{{ ironic_database_name }}.*:ALL"
+      append_privs: "yes"
   run_once: True
   delegate_to: "{{ groups['ironic-api'][0] }}"
 
 - include: bootstrap_service.yml
-  when: database_created
+  when: database.changed
 
 - name: Running Ironic-PXE bootstrap container
   kolla_docker:
diff --git a/ansible/roles/keystone/tasks/bootstrap.yml b/ansible/roles/keystone/tasks/bootstrap.yml
index 301933e47cd6158c1b4552de64464c6aabf144a8..1ac7b6aeca0c168803d0aceee541b8bcbd469abb 100644
--- a/ansible/roles/keystone/tasks/bootstrap.yml
+++ b/ansible/roles/keystone/tasks/bootstrap.yml
@@ -1,41 +1,32 @@
 ---
-- name: Creating Keystone database
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_db
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ keystone_database_name }}'"
+- name: Creating keystone database
+  kolla_toolbox:
+    module_name: mysql_db
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ keystone_database_name }}"
   register: database
-  changed_when: "{{ database.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database.stdout.split()[2] != 'SUCCESS'
   run_once: True
   delegate_to: "{{ groups['keystone'][0] }}"
 
-- name: Reading json from variable
-  set_fact:
-    database_created: "{{ (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-
 - name: Creating Keystone database user and setting permissions
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_user
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ keystone_database_name }}'
-        password='{{ keystone_database_password }}'
-        host='%'
-        priv='{{ keystone_database_name }}.*:ALL'
-        append_privs='yes'"
-  register: database_user_create
-  changed_when: "{{ database_user_create.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database_user_create.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database_user_create.stdout.split()[2] != 'SUCCESS'
+  kolla_toolbox:
+    module_name: mysql_user
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ keystone_database_name }}"
+      password: "{{ keystone_database_password }}"
+      host: "%"
+      priv: "{{ keystone_database_name }}.*:ALL"
+      append_privs: "yes"
   run_once: True
   delegate_to: "{{ groups['keystone'][0] }}"
 
 - include: bootstrap_service.yml
-  when: database_created
+  when: database.changed
diff --git a/ansible/roles/magnum/tasks/bootstrap.yml b/ansible/roles/magnum/tasks/bootstrap.yml
index af9d640fbe7e5755b735b8b1139e7093a5ad75ca..87f5268200c68e04f97e0453ebb42662dc2891b3 100644
--- a/ansible/roles/magnum/tasks/bootstrap.yml
+++ b/ansible/roles/magnum/tasks/bootstrap.yml
@@ -1,41 +1,32 @@
 ---
 - name: Creating Magnum database
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_db
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ magnum_database_name }}'"
+  kolla_toolbox:
+    module_name: mysql_db
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ magnum_database_name }}"
   register: database
-  changed_when: "{{ database.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database.stdout.split()[2] != 'SUCCESS'
   run_once: True
   delegate_to: "{{ groups['magnum-api'][0] }}"
 
-- name: Reading json from variable
-  set_fact:
-    database_created: "{{ (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-
 - name: Creating Magnum database user and setting permissions
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_user
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ magnum_database_name }}'
-        password='{{ magnum_database_password }}'
-        host='%'
-        priv='{{ magnum_database_name }}.*:ALL'
-        append_privs='yes'"
-  register: database_user_create
-  changed_when: "{{ database_user_create.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database_user_create.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database_user_create.stdout.split()[2] != 'SUCCESS'
+  kolla_toolbox:
+    module_name: mysql_user
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ magnum_database_name }}"
+      password: "{{ magnum_database_password }}"
+      host: "%"
+      priv: "{{ magnum_database_name }}.*:ALL"
+      append_privs: "yes"
   run_once: True
   delegate_to: "{{ groups['magnum-api'][0] }}"
 
 - include: bootstrap_service.yml
-  when: database_created
+  when: database.changed
diff --git a/ansible/roles/manila/tasks/bootstrap.yml b/ansible/roles/manila/tasks/bootstrap.yml
index 0d51963b0ee54bd7ea338e34d7dff6ca2740ce77..58051d1c664e798552c63cef9cd188254fbf8ce6 100644
--- a/ansible/roles/manila/tasks/bootstrap.yml
+++ b/ansible/roles/manila/tasks/bootstrap.yml
@@ -1,41 +1,32 @@
 ---
 - name: Creating Manila database
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_db
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ manila_database_name }}'"
+  kolla_toolbox:
+    module_name: mysql_db
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ manila_database_name }}"
   register: database
-  changed_when: "{{ database.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database.stdout.split()[2] != 'SUCCESS'
   run_once: True
   delegate_to: "{{ groups['manila-api'][0] }}"
 
-- name: Reading json from variable
-  set_fact:
-    database_created: "{{ (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-
 - name: Creating Manila database user and setting permissions
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_user
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ manila_database_name }}'
-        password='{{ manila_database_password }}'
-        host='%'
-        priv='{{ manila_database_name }}.*:ALL'
-        append_privs='yes'"
-  register: database_user_create
-  changed_when: "{{ database_user_create.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database_user_create.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database_user_create.stdout.split()[2] != 'SUCCESS'
+  kolla_toolbox:
+    module_name: mysql_user
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ manila_database_name }}"
+      password: "{{ manila_database_password }}"
+      host: "%"
+      priv: "{{ manila_database_name }}.*:ALL"
+      append_privs: "yes"
   run_once: True
   delegate_to: "{{ groups['manila-api'][0] }}"
 
 - include: bootstrap_service.yml
-  when: database_created
+  when: database.changed
diff --git a/ansible/roles/mistral/tasks/bootstrap.yml b/ansible/roles/mistral/tasks/bootstrap.yml
index 10f8a7773ffd31933301d09ecc1ac40152a40deb..0623cad26ad988256cb7d177a77e494c0801e103 100644
--- a/ansible/roles/mistral/tasks/bootstrap.yml
+++ b/ansible/roles/mistral/tasks/bootstrap.yml
@@ -1,41 +1,32 @@
 ---
 - name: Creating Mistral database
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_db
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ mistral_database_name }}'"
+  kolla_toolbox:
+    module_name: mysql_db
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ mistral_database_name }}"
   register: database
-  changed_when: "{{ database.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database.stdout.split()[2] != 'SUCCESS'
   run_once: True
   delegate_to: "{{ groups['mistral-api'][0] }}"
 
-- name: Reading json from variable
-  set_fact:
-    database_created: "{{ (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-
 - name: Creating Mistral database user and setting permissions
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_user
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ mistral_database_name }}'
-        password='{{ mistral_database_password }}'
-        host='%'
-        priv='{{ mistral_database_name }}.*:ALL'
-        append_privs='yes'"
-  register: database_user_create
-  changed_when: "{{ database_user_create.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database_user_create.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database_user_create.stdout.split()[2] != 'SUCCESS'
+  kolla_toolbox:
+    module_name: mysql_user
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ mistral_database_name }}"
+      password: "{{ mistral_database_password }}"
+      host: "%"
+      priv: "{{ mistral_database_name }}.*:ALL"
+      append_privs: "yes"
   run_once: True
   delegate_to: "{{ groups['mistral-api'][0] }}"
 
 - include: bootstrap_service.yml
-  when: database_created
+  when: database.changed
diff --git a/ansible/roles/murano/tasks/bootstrap.yml b/ansible/roles/murano/tasks/bootstrap.yml
index 931636ee82064130388e8c863df03a23f37f9f2b..800233c8a4d544b9f835dfefced8b02432669b3a 100644
--- a/ansible/roles/murano/tasks/bootstrap.yml
+++ b/ansible/roles/murano/tasks/bootstrap.yml
@@ -1,41 +1,32 @@
 ---
 - name: Creating Murano database
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_db
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ murano_database_name }}'"
+  kolla_toolbox:
+    module_name: mysql_db
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ murano_database_name }}"
   register: database
-  changed_when: "{{ database.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database.stdout.split()[2] != 'SUCCESS'
   run_once: True
   delegate_to: "{{ groups['murano-api'][0] }}"
 
-- name: Reading json from variable
-  set_fact:
-    database_created: "{{ (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-
 - name: Creating Murano database user and setting permissions
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_user
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ murano_database_name }}'
-        password='{{ murano_database_password }}'
-        host='%'
-        priv='{{ murano_database_name }}.*:ALL'
-        append_privs='yes'"
-  register: database_user_create
-  changed_when: "{{ database_user_create.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database_user_create.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database_user_create.stdout.split()[2] != 'SUCCESS'
+  kolla_toolbox:
+    module_name: mysql_user
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ murano_database_name }}"
+      password: "{{ murano_database_password }}"
+      host: "%"
+      priv: "{{ murano_database_name }}.*:ALL"
+      append_privs: "yes"
   run_once: True
   delegate_to: "{{ groups['murano-api'][0] }}"
 
 - include: bootstrap_service.yml
-  when: database_created
+  when: database.changed
diff --git a/ansible/roles/neutron/tasks/bootstrap.yml b/ansible/roles/neutron/tasks/bootstrap.yml
index 526743fb935d106c503e0429d84dc3069ca5e399..13d70b627c229f4e491ea4a2a5d7bf13c14d765a 100644
--- a/ansible/roles/neutron/tasks/bootstrap.yml
+++ b/ansible/roles/neutron/tasks/bootstrap.yml
@@ -1,41 +1,32 @@
 ---
 - name: Creating Neutron database
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_db
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ neutron_database_name }}'"
+  kolla_toolbox:
+    module_name: mysql_db
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ neutron_database_name }}"
   register: database
-  changed_when: "{{ database.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database.stdout.split()[2] != 'SUCCESS'
   run_once: True
   delegate_to: "{{ groups['neutron-server'][0] }}"
 
-- name: Reading json from variable
-  set_fact:
-    database_created: "{{ (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-
 - name: Creating Neutron database user and setting permissions
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_user
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ neutron_database_name }}'
-        password='{{ neutron_database_password }}'
-        host='%'
-        priv='{{ neutron_database_name }}.*:ALL'
-        append_privs='yes'"
-  register: database_user_create
-  changed_when: "{{ database_user_create.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database_user_create.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database_user_create.stdout.split()[2] != 'SUCCESS'
+  kolla_toolbox:
+    module_name: mysql_user
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ neutron_database_name }}"
+      password: "{{ neutron_database_password }}"
+      host: "%"
+      priv: "{{ neutron_database_name }}.*:ALL"
+      append_privs: "yes"
   run_once: True
   delegate_to: "{{ groups['neutron-server'][0] }}"
 
 - include: bootstrap_service.yml
-  when: database_created
+  when: database.changed
diff --git a/ansible/roles/nova/tasks/bootstrap.yml b/ansible/roles/nova/tasks/bootstrap.yml
index dd2222591e8d059266519c02522f39cbf1d31f6b..adfd64a454864b2fa539a79b9c8f248708b1fb89 100644
--- a/ansible/roles/nova/tasks/bootstrap.yml
+++ b/ansible/roles/nova/tasks/bootstrap.yml
@@ -1,79 +1,41 @@
 ---
-- name: Creating Nova database
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_db
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ nova_database_name }}'"
+- name: Creating Nova databases
+  kolla_toolbox:
+    module_name: mysql_db
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ item }}"
   register: database
-  changed_when: "{{ database.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database.stdout.split()[2] != 'SUCCESS'
   run_once: True
   delegate_to: "{{ groups['nova-api'][0] }}"
+  with_items:
+    - "{{ nova_database_name }}"
+    - "{{ nova_api_database_name }}"
 
-- name: Reading json from variable
-  set_fact:
-    database_created: "{{ (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-
-- name: Creating Nova-api database
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_db
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ nova_api_database_name }}'"
-  register: database_api
-  changed_when: "{{ database_api.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database_api.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database_api.stdout.split()[2] != 'SUCCESS'
-  run_once: True
-  delegate_to: "{{ groups['nova-api'][0] }}"
-
-- name: Reading json from variable
-  set_fact:
-    database_api_created: "{{ (database_api.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-
-- name: Creating Nova database user and setting permissions
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_user
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ nova_database_name }}'
-        password='{{ nova_database_password }}'
-        host='%'
-        priv='{{ nova_database_name }}.*:ALL'
-        append_privs='yes'"
+- name: Creating Nova databases user and setting permissions
+  kolla_toolbox:
+    module_name: mysql_user
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ item.database_name }}"
+      password: "{{ item.database_password }}"
+      host: "%"
+      priv: "{{ item.database_name }}.*:ALL"
+      append_privs: "yes"
   register: database_user_create
-  changed_when: "{{ database_user_create.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database_user_create.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database_user_create.stdout.split()[2] != 'SUCCESS'
-  run_once: True
-  delegate_to: "{{ groups['nova-api'][0] }}"
-
-- name: Creating Nova-api database user and setting permissions
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_user
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ nova_api_database_name }}'
-        password='{{ nova_api_database_password }}'
-        host='%'
-        priv='{{ nova_api_database_name }}.*:ALL'
-        append_privs='yes'"
-  register: database_api_user_create
-  changed_when: "{{ database_api_user_create.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database_api_user_create.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database_api_user_create.stdout.split()[2] != 'SUCCESS'
+  with_items:
+    - database_name: "{{ nova_database_name }}"
+      database_password: "{{ nova_database_password }}"
+    - database_name: "{{ nova_api_database_name }}"
+      database_password: "{{ nova_api_database_password }}"
   run_once: True
   delegate_to: "{{ groups['nova-api'][0] }}"
 
 - include: bootstrap_service.yml
-  when: database_created
+  when: database.changed
diff --git a/ansible/roles/octavia/tasks/bootstrap.yml b/ansible/roles/octavia/tasks/bootstrap.yml
index 5676e387a6e10bd993a1233447a1287898c78bb3..787c647beee3d26ea747b674dce24695924387f9 100644
--- a/ansible/roles/octavia/tasks/bootstrap.yml
+++ b/ansible/roles/octavia/tasks/bootstrap.yml
@@ -1,41 +1,32 @@
 ---
 - name: Creating Octavia database
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_db
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ octavia_database_name }}'"
+  kolla_toolbox:
+    module_name: mysql_db
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ octavia_database_name }}"
   register: database
-  changed_when: "{{ database.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database.stdout.split()[2] != 'SUCCESS'
   run_once: True
   delegate_to: "{{ groups['octavia-api'][0] }}"
 
-- name: Reading json from variable
-  set_fact:
-    database_created: "{{ (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-
 - name: Creating Octavia database user and setting permissions
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_user
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ octavia_database_name }}'
-        password='{{ octavia_database_password }}'
-        host='%'
-        priv='{{ octavia_database_name }}.*:ALL'
-        append_privs='yes'"
-  register: database_user_create
-  changed_when: "{{ database_user_create.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database_user_create.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database_user_create.stdout.split()[2] != 'SUCCESS'
+  kolla_toolbox:
+    module_name: mysql_user
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ octavia_database_name }}"
+      password: "{{ octavia_database_password }}"
+      host: "%"
+      priv: "{{ octavia_database_name }}.*:ALL"
+      append_privs: "yes"
   run_once: True
   delegate_to: "{{ groups['octavia-api'][0] }}"
 
 - include: bootstrap_service.yml
-  when: database_created
+  when: database.changed
diff --git a/ansible/roles/rally/tasks/bootstrap.yml b/ansible/roles/rally/tasks/bootstrap.yml
index 9875c3e57b8cd5def37e0381a5ac4e980724d40f..37e5bfa5d909e9012d1ad7e54194acb0f986244a 100644
--- a/ansible/roles/rally/tasks/bootstrap.yml
+++ b/ansible/roles/rally/tasks/bootstrap.yml
@@ -1,41 +1,32 @@
 ---
 - name: Creating rally database
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_db
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ rally_database_name }}'"
+  kolla_toolbox:
+    module_name: mysql_db
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ rally_database_name }}"
   register: database
-  changed_when: "{{ database.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database.stdout.split()[2] != 'SUCCESS'
   run_once: True
   delegate_to: "{{ groups['rally'][0] }}"
 
-- name: Reading json from variable
-  set_fact:
-    database_created: "{{ (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-
 - name: Creating rally database user and setting permissions
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_user
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ rally_database_name }}'
-        password='{{ rally_database_password }}'
-        host='%'
-        priv='{{ rally_database_name }}.*:ALL'
-        append_privs='yes'"
-  register: database_user_create
-  changed_when: "{{ database_user_create.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database_user_create.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database_user_create.stdout.split()[2] != 'SUCCESS'
+  kolla_toolbox:
+    module_name: mysql_user
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ rally_database_name }}"
+      password: "{{ rally_database_password }}"
+      host: "%"
+      priv: "{{ rally_database_name }}.*:ALL"
+      append_privs: "yes"
   run_once: True
   delegate_to: "{{ groups['rally'][0] }}"
 
 - include: bootstrap_service.yml
-  when: database_created
+  when: database.changed
diff --git a/ansible/roles/sahara/tasks/bootstrap.yml b/ansible/roles/sahara/tasks/bootstrap.yml
index 6e98f125b89d30851fe1c3096dfdea8dd66324dd..8a668fc83f526606c0cbc7df6d7b9948791c0faa 100644
--- a/ansible/roles/sahara/tasks/bootstrap.yml
+++ b/ansible/roles/sahara/tasks/bootstrap.yml
@@ -1,41 +1,32 @@
 ---
 - name: Creating sahara database
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_db
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ sahara_database_name }}'"
+  kolla_toolbox:
+    module_name: mysql_db
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ sahara_database_name }}"
   register: database
-  changed_when: "{{ database.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database.stdout.split()[2] != 'SUCCESS'
   run_once: True
   delegate_to: "{{ groups['sahara-api'][0] }}"
 
-- name: Reading json from variable
-  set_fact:
-    database_created: "{{ (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-
 - name: Creating sahara database user and setting permissions
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_user
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ sahara_database_name }}'
-        password='{{ sahara_database_password }}'
-        host='%'
-        priv='{{ sahara_database_name }}.*:ALL'
-        append_privs='yes'"
-  register: database_user_create
-  changed_when: "{{ database_user_create.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database_user_create.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database_user_create.stdout.split()[2] != 'SUCCESS'
+  kolla_toolbox:
+    module_name: mysql_user
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ sahara_database_name }}"
+      password: "{{ sahara_database_password }}"
+      host: "%"
+      priv: "{{ sahara_database_name }}.*:ALL"
+      append_privs: "yes"
   run_once: True
   delegate_to: "{{ groups['sahara-api'][0] }}"
 
 - include: bootstrap_service.yml
-  when: database_created
+  when: database.changed
diff --git a/ansible/roles/senlin/tasks/bootstrap.yml b/ansible/roles/senlin/tasks/bootstrap.yml
index 95a599b1797e59273aac53058ac2d7d4c7b907f8..6599961ac73584f83780914bfd3efe6bbff27390 100644
--- a/ansible/roles/senlin/tasks/bootstrap.yml
+++ b/ansible/roles/senlin/tasks/bootstrap.yml
@@ -1,41 +1,32 @@
 ---
 - name: Creating Senlin database
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_db
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ senlin_database_name }}'"
+  kolla_toolbox:
+    module_name: mysql_db
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ senlin_database_name }}"
   register: database
-  changed_when: "{{ database.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database.stdout.split()[2] != 'SUCCESS'
   run_once: True
   delegate_to: "{{ groups['senlin-api'][0] }}"
 
-- name: Reading json from variable
-  set_fact:
-    database_created: "{{ (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-
 - name: Creating Senlin database user and setting permissions
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_user
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ senlin_database_name }}'
-        password='{{ senlin_database_password }}'
-        host='%'
-        priv='{{ senlin_database_name }}.*:ALL'
-        append_privs='yes'"
-  register: database_user_create
-  changed_when: "{{ database_user_create.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database_user_create.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database_user_create.stdout.split()[2] != 'SUCCESS'
+  kolla_toolbox:
+    module_name: mysql_user
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ senlin_database_name }}"
+      password: "{{ senlin_database_password }}"
+      host: "%"
+      priv: "{{ senlin_database_name }}.*:ALL"
+      append_privs: "yes"
   run_once: True
   delegate_to: "{{ groups['senlin-api'][0] }}"
 
 - include: bootstrap_service.yml
-  when: database_created
+  when: database.changed
diff --git a/ansible/roles/solum/tasks/bootstrap.yml b/ansible/roles/solum/tasks/bootstrap.yml
index 3d1ff9e15e2293ac292128f9c703ad0c05f9d248..cf3063abc5bb943252a55ee2126ee2139cc8c3f8 100644
--- a/ansible/roles/solum/tasks/bootstrap.yml
+++ b/ansible/roles/solum/tasks/bootstrap.yml
@@ -1,41 +1,32 @@
 ---
 - name: Creating Solum database
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_db
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ solum_database_name }}'"
+  kolla_toolbox:
+    module_name: mysql_db
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ solum_database_name }}"
   register: database
-  changed_when: "{{ database.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database.stdout.split()[2] != 'SUCCESS'
   run_once: True
   delegate_to: "{{ groups['solum-api'][0] }}"
 
-- name: Reading json from variable
-  set_fact:
-    database_created: "{{ (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-
 - name: Creating Solum database user and setting permissions
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_user
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ solum_database_name }}'
-        password='{{ solum_database_password }}'
-        host='%'
-        priv='{{ solum_database_name }}.*:ALL'
-        append_privs='yes'"
-  register: database_user_create
-  changed_when: "{{ database_user_create.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database_user_create.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database_user_create.stdout.split()[2] != 'SUCCESS'
+  kolla_toolbox:
+    module_name: mysql_user
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ solum_database_name }}"
+      password: "{{ solum_database_password }}"
+      host: "%"
+      priv: "{{ solum_database_name }}.*:ALL"
+      append_privs: "yes"
   run_once: True
   delegate_to: "{{ groups['solum-api'][0] }}"
 
 - include: bootstrap_service.yml
-  when: database_created
+  when: database.changed
diff --git a/ansible/roles/tacker/tasks/bootstrap.yml b/ansible/roles/tacker/tasks/bootstrap.yml
index 5937c2add8119cf7e0afcf9b1bfdd9c78409cc12..7a8f4aa868e05c7a37e11848daa4e250f1875407 100644
--- a/ansible/roles/tacker/tasks/bootstrap.yml
+++ b/ansible/roles/tacker/tasks/bootstrap.yml
@@ -1,41 +1,32 @@
 ---
 - name: Creating tacker database
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_db
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ tacker_database_name }}'"
+  kolla_toolbox:
+    module_name: mysql_db
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ tacker_database_name }}"
   register: database
-  changed_when: "{{ database.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database.stdout.split()[2] != 'SUCCESS'
   run_once: True
   delegate_to: "{{ groups['tacker'][0] }}"
 
-- name: Reading json from variable
-  set_fact:
-    database_created: "{{ (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-
 - name: Creating tacker database user and setting permissions
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_user
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ tacker_database_name }}'
-        password='{{ tacker_database_password }}'
-        host='%'
-        priv='{{ tacker_database_name }}.*:ALL'
-        append_privs='yes'"
-  register: database_user_create
-  changed_when: "{{ database_user_create.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database_user_create.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database_user_create.stdout.split()[2] != 'SUCCESS'
+  kolla_toolbox:
+    module_name: mysql_user
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ tacker_database_name }}"
+      password: "{{ tacker_database_password }}"
+      host: "%"
+      priv: "{{ tacker_database_name }}.*:ALL"
+      append_privs: "yes"
   run_once: True
   delegate_to: "{{ groups['tacker'][0] }}"
 
 - include: bootstrap_service.yml
-  when: database_created
+  when: database.changed
diff --git a/ansible/roles/trove/tasks/bootstrap.yml b/ansible/roles/trove/tasks/bootstrap.yml
index 56f6bf12c1aa6b859092712b052d2bda2f3c813f..6764c6ea41669bf981c892eef26517e1dafeabda 100644
--- a/ansible/roles/trove/tasks/bootstrap.yml
+++ b/ansible/roles/trove/tasks/bootstrap.yml
@@ -1,41 +1,32 @@
 ---
 - name: Creating trove database
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_db
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ trove_database_name }}'"
+  kolla_toolbox:
+    module_name: mysql_db
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ trove_database_name }}"
   register: database
-  changed_when: "{{ database.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database.stdout.split()[2] != 'SUCCESS'
   run_once: True
   delegate_to: "{{ groups['trove-api'][0] }}"
 
-- name: Reading json from variable
-  set_fact:
-    database_created: "{{ (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-
 - name: Creating trove database user and setting permissions
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_user
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ trove_database_name }}'
-        password='{{ trove_database_password }}'
-        host='%'
-        priv='{{ trove_database_name }}.*:ALL'
-        append_privs='yes'"
-  register: database_user_create
-  changed_when: "{{ database_user_create.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database_user_create.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database_user_create.stdout.split()[2] != 'SUCCESS'
+  kolla_toolbox:
+    module_name: mysql_user
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ trove_database_name }}"
+      password: "{{ trove_database_password }}"
+      host: "%"
+      priv: "{{ trove_database_name }}.*:ALL"
+      append_privs: "yes"
   run_once: True
   delegate_to: "{{ groups['trove-api'][0] }}"
 
 - include: bootstrap_service.yml
-  when: database_created
+  when: database.changed
diff --git a/ansible/roles/watcher/tasks/bootstrap.yml b/ansible/roles/watcher/tasks/bootstrap.yml
index fa63250e36c37e30267c0007336e4ca14a9fc8b0..58da9f296c2f0d10d55531d639ef36ca3efeadca 100644
--- a/ansible/roles/watcher/tasks/bootstrap.yml
+++ b/ansible/roles/watcher/tasks/bootstrap.yml
@@ -1,41 +1,32 @@
 ---
 - name: Creating Watcher database
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_db
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ watcher_database_name }}'"
+  kolla_toolbox:
+    module_name: mysql_db
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ wather_database_name }}"
   register: database
-  changed_when: "{{ database.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database.stdout.split()[2] != 'SUCCESS'
   run_once: True
   delegate_to: "{{ groups['watcher-api'][0] }}"
 
-- name: Reading json from variable
-  set_fact:
-    database_created: "{{ (database.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-
 - name: Creating Watcher database user and setting permissions
-  command: docker exec -t kolla_toolbox /usr/bin/ansible localhost
-    -m mysql_user
-    -a "login_host='{{ database_address }}'
-        login_port='{{ database_port }}'
-        login_user='{{ database_user }}'
-        login_password='{{ database_password }}'
-        name='{{ watcher_database_name }}'
-        password='{{ watcher_database_password }}'
-        host='%'
-        priv='{{ watcher_database_name }}.*:ALL'
-        append_privs='yes'"
-  register: database_user_create
-  changed_when: "{{ database_user_create.stdout.find('localhost | SUCCESS => ') != -1 and
-                    (database_user_create.stdout.split('localhost | SUCCESS => ')[1]|from_json).changed }}"
-  failed_when: database_user_create.stdout.split()[2] != 'SUCCESS'
+  kolla_toolbox:
+    module_name: mysql_user
+    module_args:
+      login_host: "{{ database_address }}"
+      login_port: "{{ database_port }}"
+      login_user: "{{ database_user }}"
+      login_password: "{{ database_password }}"
+      name: "{{ wather_database_name }}"
+      password: "{{ wather_database_password }}"
+      host: "%"
+      priv: "{{ wather_database_name }}.*:ALL"
+      append_privs: "yes"
   run_once: True
   delegate_to: "{{ groups['watcher-api'][0] }}"
 
 - include: bootstrap_service.yml
-  when: database_created
+  when: database.changed