diff --git a/ansible/group_vars/all.yml b/ansible/group_vars/all.yml
index d6e25ad773..d925d98760 100644
--- a/ansible/group_vars/all.yml
+++ b/ansible/group_vars/all.yml
@@ -231,6 +231,7 @@ enable_multipathd: "no"
 enable_murano: "no"
 enable_neutron_lbaas: "no"
 enable_neutron_qos: "no"
+enable_neutron_agent_ha: "no"
 enable_swift: "no"
 enable_tempest: "no"
 enable_watcher: "no"
diff --git a/ansible/roles/neutron/defaults/main.yml b/ansible/roles/neutron/defaults/main.yml
index 80c6ed43ea..21ef9a49f9 100644
--- a/ansible/roles/neutron/defaults/main.yml
+++ b/ansible/roles/neutron/defaults/main.yml
@@ -52,6 +52,10 @@ openvswitch_vswitchd_image_full: "{{ openvswitch_vswitchd_image }}:{{ openvswitc
 ####################
 # OpenStack
 ####################
+dhcp_agents_per_network: 2
+min_l3_agents_per_router: 2
+max_l3_agents_per_router: 3
+
 neutron_admin_endpoint: "{{ admin_protocol }}://{{ kolla_internal_fqdn }}:{{ neutron_server_port }}"
 neutron_internal_endpoint: "{{ internal_protocol }}://{{ kolla_internal_fqdn }}:{{ neutron_server_port }}"
 neutron_public_endpoint: "{{ public_protocol }}://{{ kolla_external_fqdn }}:{{ neutron_server_port }}"
diff --git a/ansible/roles/neutron/templates/neutron.conf.j2 b/ansible/roles/neutron/templates/neutron.conf.j2
index 16f0b8b315..fe8ed1029b 100644
--- a/ansible/roles/neutron/templates/neutron.conf.j2
+++ b/ansible/roles/neutron/templates/neutron.conf.j2
@@ -37,6 +37,13 @@ allow_overlapping_ips = true
 core_plugin = ml2
 service_plugins = router{% if enable_neutron_lbaas | bool %},neutron_lbaas.services.loadbalancer.plugin.LoadBalancerPluginv2{% endif %}{% if enable_neutron_qos | bool %},qos{% endif %}
 
+{% if enable_neutron_agent_ha | bool %}
+dhcp_agents_per_network = {{ dhcp_agents_per_network }}
+l3_ha = true
+max_l3_agents_per_router = {{ max_l3_agents_per_router }}
+min_l3_agents_per_router = {{ min_l3_agents_per_router }}
+{% endif %}
+
 {% if enable_neutron_lbaas | bool %}
 [service_providers]
 service_provider = LOADBALANCERV2:Haproxy:neutron_lbaas.drivers.haproxy.plugin_driver.HaproxyOnHostPluginDriver:default
diff --git a/ansible/roles/prechecks/tasks/service_checks.yml b/ansible/roles/prechecks/tasks/service_checks.yml
index b275fd4c2d..1faa83185f 100644
--- a/ansible/roles/prechecks/tasks/service_checks.yml
+++ b/ansible/roles/prechecks/tasks/service_checks.yml
@@ -48,3 +48,11 @@
   register: result
   changed_when: false
   failed_when: result.stdout | regex_replace('(60|120|180|240|300|360|600|720|900|1200|1800|3600|7200|10800|14400|21600|28800|43200|86400|604800)', '') | search(".+")
+
+- name: Checking number of network agents
+  local_action: fail msg="Number of network agents are less than two when enabling agent ha"
+  changed_when: false
+  when:
+    - enable_neutron_agent_ha | bool
+    - groups['neutron-dhcp-agent'] | length < 2
+      or groups['neutron-l3-agent'] | length < 2
diff --git a/etc/kolla/globals.yml b/etc/kolla/globals.yml
index e6d37bd0e2..abd3f5e5d0 100644
--- a/etc/kolla/globals.yml
+++ b/etc/kolla/globals.yml
@@ -132,6 +132,7 @@ neutron_external_interface: "eth1"
 #enable_multipathd: "no"
 #enable_neutron_lbaas: "no"
 #enable_neutron_qos: "no"
+#enable_neutron_agent_ha: "no"
 #enable_swift: "no"
 #enable_tempest: "no"
 #enable_watcher: "no"
diff --git a/releasenotes/notes/bp-support-network-ha-1a771d735a268219.yaml b/releasenotes/notes/bp-support-network-ha-1a771d735a268219.yaml
new file mode 100644
index 0000000000..0e73f5d303
--- /dev/null
+++ b/releasenotes/notes/bp-support-network-ha-1a771d735a268219.yaml
@@ -0,0 +1,5 @@
+---
+features:
+  - New option enable_neutron_agent_ha added to enable/disable dhcp/l3 agent
+    high availability, dhcp_agents_per_network is default to 2 and it's
+    configurable for user.