diff --git a/ansible/kolla-openstack.yml b/ansible/kolla-openstack.yml
index a77776ffd535c4e67a3abed3340a00af2d006212..1437b5da5fbbb19a952644f4d27a30ab8b752e5c 100644
--- a/ansible/kolla-openstack.yml
+++ b/ansible/kolla-openstack.yml
@@ -104,6 +104,7 @@
             mime: False
           register: stat_result
           with_items:
+            - { name: aodh, file: aodh.conf }
             - { name: blazar, file: blazar.conf }
             - { name: ceilometer, file: ceilometer.conf }
             - { name: cinder, file: cinder.conf }
@@ -212,6 +213,7 @@
         auth_type: none
         endpoint_override: "http://{% raw %}{{ api_interface_address }}{% endraw %}:{{ inspector_store_port }}"
       # Extra free-form user-provided configuration.
+      kolla_extra_aodh: "{{ kolla_extra_config.aodh | default }}"
       kolla_extra_blazar: "{{ kolla_extra_config.blazar | default }}"
       kolla_extra_ceilometer: "{{ kolla_extra_config.ceilometer | default }}"
       kolla_extra_cinder: "{{ kolla_extra_config.cinder | default }}"
diff --git a/ansible/roles/kolla-openstack/defaults/main.yml b/ansible/roles/kolla-openstack/defaults/main.yml
index 7e5017cbe30df897efc59b80aaac3922c8269e1f..b2a4d41f503a1491193ca9f490ca77a0d206fd86 100644
--- a/ansible/roles/kolla-openstack/defaults/main.yml
+++ b/ansible/roles/kolla-openstack/defaults/main.yml
@@ -11,6 +11,15 @@ kolla_node_custom_config_path: /etc/kolla/config
 # Free form extra configuration to append to global.conf.
 kolla_extra_global:
 
+###############################################################################
+# Aodh configuration.
+
+# Whether to enable Aodh.
+kolla_enable_aodh:
+
+# Free form extra configuration to append to aodh.conf.
+kolla_extra_aodh:
+
 ###############################################################################
 # Barbican configuration.
 
diff --git a/ansible/roles/kolla-openstack/molecule/default/tests/test_default.py b/ansible/roles/kolla-openstack/molecule/default/tests/test_default.py
index 69a6c1d4f5689872e2600698880502db7d83ef71..b1bd3dec30c599610e5df4d22503179361430167 100644
--- a/ansible/roles/kolla-openstack/molecule/default/tests/test_default.py
+++ b/ansible/roles/kolla-openstack/molecule/default/tests/test_default.py
@@ -37,7 +37,8 @@ def test_service_config_directory(host, path):
 
 @pytest.mark.parametrize(
     'path',
-    ['cinder',
+    ['aodh',
+     'cinder',
      'cloudkitty',
      'designate',
      'glance',
diff --git a/ansible/roles/kolla-openstack/molecule/enable-everything/molecule.yml b/ansible/roles/kolla-openstack/molecule/enable-everything/molecule.yml
index a9e68b759c80bbcf5bae5204624179f861d46a58..1981d1b44992d3e7d6738b7ded8d2a09bdc1fb7c 100644
--- a/ansible/roles/kolla-openstack/molecule/enable-everything/molecule.yml
+++ b/ansible/roles/kolla-openstack/molecule/enable-everything/molecule.yml
@@ -14,6 +14,10 @@ provisioner:
     group_vars:
       all:
         kolla_extra_config_path:
+        kolla_enable_aodh: true
+        kolla_extra_aodh: |
+          [extra-aodh.conf]
+          foo=bar
         kolla_enable_blazar: true
         kolla_extra_blazar: |
           [extra-blazar.conf]
diff --git a/ansible/roles/kolla-openstack/molecule/enable-everything/tests/test_default.py b/ansible/roles/kolla-openstack/molecule/enable-everything/tests/test_default.py
index d4bc9f2ea56a3539ce18107e5775711a7fc755cb..873b1630d64b699f6cac3d81e9c3d7ecb619090f 100644
--- a/ansible/roles/kolla-openstack/molecule/enable-everything/tests/test_default.py
+++ b/ansible/roles/kolla-openstack/molecule/enable-everything/tests/test_default.py
@@ -27,7 +27,8 @@ testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner(
 
 @pytest.mark.parametrize(
     'path',
-    ['cinder',
+    ['aodh',
+     'cinder',
      'cloudkitty',
      'designate',
      'fluentd/filter',
@@ -61,7 +62,8 @@ def test_service_config_directory(host, path):
 
 @pytest.mark.parametrize(
     'path',
-    ['cinder.conf',
+    ['aodh.conf',
+     'cinder.conf',
      'cloudkitty.conf',
      'designate.conf',
      'galera.cnf',
diff --git a/ansible/roles/kolla-openstack/tasks/config.yml b/ansible/roles/kolla-openstack/tasks/config.yml
index 94ccd18227faa3ee2205f6a29fbd7c584f604b4b..a123252b213d99526a7c71a3e8b7d01da3100752 100644
--- a/ansible/roles/kolla-openstack/tasks/config.yml
+++ b/ansible/roles/kolla-openstack/tasks/config.yml
@@ -13,6 +13,7 @@
     dest: "{{ kolla_node_custom_config_path }}/{{ item.dest }}"
     mode: 0640
   with_items:
+    - { src: aodh.conf.j2, dest: aodh.conf, enabled: "{{ kolla_enable_aodh }}" }
     - { src: blazar.conf.j2, dest: blazar.conf, enabled: "{{ kolla_enable_blazar }}" }
     - { src: ceilometer.conf.j2, dest: ceilometer.conf, enabled: "{{ kolla_enable_ceilometer }}" }
     - { src: cinder.conf.j2, dest: cinder.conf, enabled: "{{ kolla_enable_cinder }}" }
diff --git a/ansible/roles/kolla-openstack/templates/aodh.conf.j2 b/ansible/roles/kolla-openstack/templates/aodh.conf.j2
new file mode 100644
index 0000000000000000000000000000000000000000..5d7d4c1e0636d9323d7be9db721fd9998cbdd724
--- /dev/null
+++ b/ansible/roles/kolla-openstack/templates/aodh.conf.j2
@@ -0,0 +1,10 @@
+# {{ ansible_managed }}
+
+{% if kolla_extra_aodh %}
+#######################
+# Extra configuration
+#######################
+
+{{ kolla_extra_aodh }}
+{% endif %}
+
diff --git a/ansible/roles/kolla-openstack/vars/main.yml b/ansible/roles/kolla-openstack/vars/main.yml
index 4a98a8a62f54775497d96ad82074eda8202e19ca..207d3d9ad1d5728c2ef4869e82134e249a021c88 100644
--- a/ansible/roles/kolla-openstack/vars/main.yml
+++ b/ansible/roles/kolla-openstack/vars/main.yml
@@ -9,6 +9,11 @@
 #         the destination, and will not be removed from the destination, even
 #         if disabled or unexpected.
 kolla_openstack_custom_config:
+  # Aodh.
+  - src: "{{ kolla_extra_config_path }}/aodh"
+    dest: "{{ kolla_node_custom_config_path }}/aodh"
+    patterns: "*"
+    enabled: "{{ kolla_enable_aodh }}"
   # Barbican.
   - src: "{{ kolla_extra_config_path }}/barbican"
     dest: "{{ kolla_node_custom_config_path }}/barbican"
diff --git a/doc/source/configuration/kolla-ansible.rst b/doc/source/configuration/kolla-ansible.rst
index 0e94a6e7b8839303ff7fad7c826f5288c881bb87..3ca225843e82c07379a7e931e4d7d4d4c94d5e65 100644
--- a/doc/source/configuration/kolla-ansible.rst
+++ b/doc/source/configuration/kolla-ansible.rst
@@ -502,6 +502,8 @@ which files are supported.
    =============================== =======================================================
    File                            Purpose
    =============================== =======================================================
+   ``aodh.conf``                   Aodh configuration.
+   ``aodh/*``                      Extended Aodh configuration.
    ``backup.my.cnf``               Mariabackup configuration.
    ``barbican/*``                  Extended Barbican configuration.
    ``blazar.conf``                 Blazar configuration.
diff --git a/releasenotes/notes/add-support-for-custom-aodh-conf-81a5a623f771d1c2.yaml b/releasenotes/notes/add-support-for-custom-aodh-conf-81a5a623f771d1c2.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..3882de5140191a043b9e40b8d8cf3a5c5dc205b8
--- /dev/null
+++ b/releasenotes/notes/add-support-for-custom-aodh-conf-81a5a623f771d1c2.yaml
@@ -0,0 +1,3 @@
+---
+features:
+  - Adds support for custom Aodh configuration.