diff --git a/grafana/tasks/main.yml b/grafana/tasks/main.yml
index 6ddae6bf13813ac0f02aadf1720c5456fd95c643..4b961b97846e93d615a48e8c70b2b283cd5a6b15 100644
--- a/grafana/tasks/main.yml
+++ b/grafana/tasks/main.yml
@@ -81,6 +81,15 @@
     - config
     - grafana
 
+- import_tasks: postgres.yml
+  when:
+    - grafana_database is defined
+    - grafana_database.type == "postgres"
+    - grafana_database.host[0] == '/'
+  tags:
+    - grafana
+    - postgres
+
 - meta: flush_handlers
 
 - name: Enable and start Grafana
diff --git a/grafana/tasks/postgres.yml b/grafana/tasks/postgres.yml
new file mode 100644
index 0000000000000000000000000000000000000000..f69793bb92f49d36d184073ab8ee5fc288d41a62
--- /dev/null
+++ b/grafana/tasks/postgres.yml
@@ -0,0 +1,23 @@
+---
+
+- become: true
+  become_user: postgres
+  block:
+    - name: Create postgres user
+      postgresql_user:
+        name: grafana
+        state: present
+
+    - name: Create database
+      postgresql_db:
+        name: grafana
+        owner: grafana
+        state: present
+
+    - name: Grant database privileges
+      postgresql_privs:
+        database: grafana
+        privs: ALL
+        state: present
+        type: database
+        roles: grafana
diff --git a/grafana/templates/grafana.ini.j2 b/grafana/templates/grafana.ini.j2
index bbb00196406f57cc2c088ea7a3d89ca19fefeb7e..ac54026c0ea49ae6f95cc9392a4916c417ef4f9f 100644
--- a/grafana/templates/grafana.ini.j2
+++ b/grafana/templates/grafana.ini.j2
@@ -18,8 +18,14 @@ serve_from_sub_path = {{ grafana_serve_from_sub_path }}
 socket = /run/grafana/sock
 
 [database]
-{% if grafana_database_url is defined %}
-url = {{ grafana_database_url }}
+{% if grafana_database is defined %}
+type = {{ grafana_database.type }}
+host = {{ grafana_database.host }}
+name = {{ grafana_database.name }}
+user = {{ grafana_database.user }}
+{% if grafana_database.password is defined %}
+password = """{{ grafana_database.password }}"""
+{% endif %}
 {% endif %}
 
 [analytics]