diff --git a/ansible/group_vars/all.yml b/ansible/group_vars/all.yml
index cd12cec83f..00489fef51 100644
--- a/ansible/group_vars/all.yml
+++ b/ansible/group_vars/all.yml
@@ -519,6 +519,11 @@ designate_ns_record: "sample.openstack.org"
 #######################
 neutron_bgp_router_id: "1.1.1.1"
 neutron_bridge_name: "br-ex"
+# Comma-separated type of enabled ml2 type drivers
+neutron_type_drivers: "flat,vlan,vxlan"
+# Comma-separated types of tenant networks (should be listed in 'neutron_type_drivers')
+# NOTE: for ironic this list should also contain 'flat'
+neutron_tenant_network_types: "vxlan"
 
 computes_need_external_bridge: "{{ enable_neutron_dvr | bool or enable_neutron_provider_networks | bool }}"
 
diff --git a/ansible/roles/ironic/tasks/precheck.yml b/ansible/roles/ironic/tasks/precheck.yml
index 2bf0a4a664..8a1b476bb4 100644
--- a/ansible/roles/ironic/tasks/precheck.yml
+++ b/ansible/roles/ironic/tasks/precheck.yml
@@ -38,3 +38,9 @@
   with_items:
     - "ironic-agent.kernel"
     - "ironic-agent.initramfs"
+
+- name: Looking for 'flat' in tenant network types
+  local_action: fail msg="'flat' is not in neutron_tenant_network_types [{{ neutron_tenant_network_types }}]"
+  changed_when: false
+  when: tenant_network_types.find('flat') == -1
+  run_once: true
diff --git a/ansible/roles/neutron/tasks/precheck.yml b/ansible/roles/neutron/tasks/precheck.yml
index e14cf9ba59..f5329462b6 100644
--- a/ansible/roles/neutron/tasks/precheck.yml
+++ b/ansible/roles/neutron/tasks/precheck.yml
@@ -36,3 +36,13 @@
        or inventory_hostname in groups['neutron-l3-agent']
        or inventory_hostname in groups['neutron-metadata-agent'])
     - ansible_os_family == 'RedHat' or ansible_distribution == 'Ubuntu'
+
+- name: Checking tenant network types
+  vars:
+    type_drivers: "{{ neutron_type_drivers.replace(' ', '').split(',') | reject('equalto', '') | list }}"
+    tenant_network_types: "{{ neutron_tenant_network_types.replace(' ', '').split(',') | reject('equalto', '') | list }}"
+  local_action: fail msg="Tenant network type '{{ item }}' is not in type drivers [{{ neutron_type_drivers }}]"
+  changed_when: false
+  when: item not in type_drivers
+  run_once: true
+  with_items: "{{ tenant_network_types }}"
diff --git a/ansible/roles/neutron/templates/ml2_conf.ini.j2 b/ansible/roles/neutron/templates/ml2_conf.ini.j2
index ea6862cdbe..b03f9fa20a 100644
--- a/ansible/roles/neutron/templates/ml2_conf.ini.j2
+++ b/ansible/roles/neutron/templates/ml2_conf.ini.j2
@@ -1,16 +1,8 @@
 # ml2_conf.ini
 [ml2]
-{% if enable_ironic | bool %}
-tenant_network_types = vxlan, flat
-mechanism_drivers = openvswitch
-{% elif enable_hyperv | bool %}
-type_drivers = flat,vlan,vxlan
-tenant_network_types = flat,vlan
-{% else %}
 # Changing type_drivers after bootstrap can lead to database inconsistencies
-type_drivers = flat,vlan,vxlan
-tenant_network_types = vxlan
-{% endif %}
+type_drivers = {{ neutron_type_drivers }}
+tenant_network_types = {{ neutron_tenant_network_types }}
 
 {% if neutron_plugin_agent == "openvswitch" %}
 {% if enable_hyperv | bool %}
diff --git a/doc/hyperv-guide.rst b/doc/hyperv-guide.rst
index 8ff966c54c..42fc0898c6 100644
--- a/doc/hyperv-guide.rst
+++ b/doc/hyperv-guide.rst
@@ -94,6 +94,12 @@ Hyper-V options are also required in ``/etc/kolla/globals.yml``:
     vswitch_name: <HyperV virtual switch name>
     nova_msi_url: "https://www.cloudbase.it/downloads/HyperVNovaCompute_Beta.msi"
 
+If tenant networks are to be built using VLAN add corresponding type in ``/etc/kolla/globals.yml``:
+
+.. code-block:: console
+
+    neutron_tenant_network_types: 'flat,vlan'
+
 The virtual switch is the same one created on the HyperV setup part.
 For nova_msi_url, different Nova MSI (Mitaka/Newton/Ocata) versions can be found on
 `Cloudbase website
diff --git a/doc/ironic-guide.rst b/doc/ironic-guide.rst
index 13dff7d965..08ffcd824e 100644
--- a/doc/ironic-guide.rst
+++ b/doc/ironic-guide.rst
@@ -20,6 +20,21 @@ The Ironic implementation is "tech preview", so currently instances can only be
 deployed on baremetal. Further work will be done to allow scheduling for both
 virtualized and baremetal deployments.
 
+Pre-deployment Configuration
+============================
+
+Enable Ironic role in ``/etc/kolla/globals.yml``:
+
+.. code-block:: console
+
+    enable_ironic: "yes"
+
+Beside that an additional network type 'flat' has to be added to a list of tenant network types:
+
+.. code-block:: console
+
+    neutron_tenant_network_types: "vxlan,flat"
+
 Configuring Web Console
 =======================
 Configuration based off upstream web_console_documentation_.
diff --git a/releasenotes/notes/configurable-tenant-network-types-4dd6ad35df8e8c6c.yaml b/releasenotes/notes/configurable-tenant-network-types-4dd6ad35df8e8c6c.yaml
new file mode 100644
index 0000000000..48ad48d7c5
--- /dev/null
+++ b/releasenotes/notes/configurable-tenant-network-types-4dd6ad35df8e8c6c.yaml
@@ -0,0 +1,13 @@
+---
+features:
+  - |
+    Allow users to set neutron type drivers and tenant network types.
+    These are configurable via 'neutron_type_drivers' and
+    'neutron_tenant_network_types' variables correspondingly.
+    Tenant network types are checked against a list of type drivers.
+    Also 'flat' network type is checked in the lists for Ironic.
+upgrade:
+  - |
+    Default neutron_tenant_network_types list consist of 'vxlan'.
+    Ironic users should add 'flat' to the list. Also for Hyper-V
+    the list should contain 'vlan'.