diff --git a/ci/common/net-config-multinode-os-net-config.yaml b/ci/common/net-config-multinode-os-net-config.yaml
index 6c5cfbeb2a..09cee756f3 100644
--- a/ci/common/net-config-multinode-os-net-config.yaml
+++ b/ci/common/net-config-multinode-os-net-config.yaml
@@ -52,6 +52,11 @@ parameters:
     default: 1300
     description: The mtu of the OvS bridge
     type: number
+  EC2MetadataIp:
+    default: ''
+    description: The IP address of the EC2 metadata server. (The parameter
+      is automatically resolved from the ctlplane subnet's host_routes attribute.)
+    type: string
 
 resources:
 
diff --git a/ci/common/net-config-multinode.yaml b/ci/common/net-config-multinode.yaml
index 3cf40e1236..226ea43062 100644
--- a/ci/common/net-config-multinode.yaml
+++ b/ci/common/net-config-multinode.yaml
@@ -48,6 +48,11 @@ parameters:
     description: The default route of the control plane network. (The parameter
       is automatically resolved from the ctlplane subnet's gateway_ip attribute.)
     type: string
+  EC2MetadataIp:
+    default: ''
+    description: The IP address of the EC2 metadata server. (The parameter
+      is automatically resolved from the ctlplane subnet's host_routes attribute.)
+    type: string
 
 resources:
   OsNetConfigImpl:
diff --git a/ci/common/net-config-simple-bridge.yaml b/ci/common/net-config-simple-bridge.yaml
index 575984c392..0d6617eb26 100644
--- a/ci/common/net-config-simple-bridge.yaml
+++ b/ci/common/net-config-simple-bridge.yaml
@@ -41,6 +41,12 @@ parameters:
     default: ''
     description: IP address/subnet on the management network
     type: string
+  EC2MetadataIp:
+    default: ''
+    description: The IP address of the EC2 metadata server. (The parameter
+      is automatically resolved from the ctlplane subnet's host_routes attribute.)
+    type: string
+
 resources:
   OsNetConfigImpl:
     type: OS::Heat::SoftwareConfig
diff --git a/ci/environments/network/multiple-nics-ipv6/network-environment.yaml b/ci/environments/network/multiple-nics-ipv6/network-environment.yaml
index 860aa32e96..bfc2ab0579 100644
--- a/ci/environments/network/multiple-nics-ipv6/network-environment.yaml
+++ b/ci/environments/network/multiple-nics-ipv6/network-environment.yaml
@@ -7,7 +7,6 @@ resource_registry:
   OS::TripleO::CephStorage::Net::SoftwareConfig: nic-configs/ceph-storage.yaml
 
 parameter_defaults:
-  EC2MetadataIp: 192.168.24.1
   ExternalNetCidr: 2001:db8:fd00:1000::/64
   ExternalAllocationPools: [{"start": "2001:db8:fd00:1000::10", "end": "2001:db8:fd00:1000:ffff:ffff:ffff:fffe"}]
   ExternalInterfaceDefaultRoute: 2001:db8:fd00:1000::1
diff --git a/ci/environments/network/multiple-nics-ipv6/nic-configs/ceph-storage.yaml b/ci/environments/network/multiple-nics-ipv6/nic-configs/ceph-storage.yaml
index e55c7f2e4a..3c72fef5ae 100644
--- a/ci/environments/network/multiple-nics-ipv6/nic-configs/ceph-storage.yaml
+++ b/ci/environments/network/multiple-nics-ipv6/nic-configs/ceph-storage.yaml
@@ -77,8 +77,10 @@ parameters:
     default: []
     description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
     type: comma_delimited_list
-  EC2MetadataIp: # Override this via parameter_defaults
-    description: The IP address of the EC2 metadata server.
+  EC2MetadataIp:
+    default: ''
+    description: The IP address of the EC2 metadata server. (The parameter
+      is automatically resolved from the ctlplane subnet's host_routes attribute.)
     type: string
 
 resources:
diff --git a/ci/environments/network/multiple-nics-ipv6/nic-configs/cinder-storage.yaml b/ci/environments/network/multiple-nics-ipv6/nic-configs/cinder-storage.yaml
index de5d919635..853ab6fc96 100644
--- a/ci/environments/network/multiple-nics-ipv6/nic-configs/cinder-storage.yaml
+++ b/ci/environments/network/multiple-nics-ipv6/nic-configs/cinder-storage.yaml
@@ -77,8 +77,10 @@ parameters:
     default: []
     description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
     type: comma_delimited_list
-  EC2MetadataIp: # Override this via parameter_defaults
-    description: The IP address of the EC2 metadata server.
+  EC2MetadataIp:
+    default: ''
+    description: The IP address of the EC2 metadata server. (The parameter
+      is automatically resolved from the ctlplane subnet's host_routes attribute.)
     type: string
 
 resources:
diff --git a/ci/environments/network/multiple-nics-ipv6/nic-configs/compute.yaml b/ci/environments/network/multiple-nics-ipv6/nic-configs/compute.yaml
index b2fe4f72a6..2aceec6bdc 100644
--- a/ci/environments/network/multiple-nics-ipv6/nic-configs/compute.yaml
+++ b/ci/environments/network/multiple-nics-ipv6/nic-configs/compute.yaml
@@ -77,8 +77,10 @@ parameters:
     default: []
     description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
     type: comma_delimited_list
-  EC2MetadataIp: # Override this via parameter_defaults
-    description: The IP address of the EC2 metadata server.
+  EC2MetadataIp:
+    default: ''
+    description: The IP address of the EC2 metadata server. (The parameter
+      is automatically resolved from the ctlplane subnet's host_routes attribute.)
     type: string
 
 resources:
diff --git a/ci/environments/network/multiple-nics-ipv6/nic-configs/controller.yaml b/ci/environments/network/multiple-nics-ipv6/nic-configs/controller.yaml
index a119e720ad..700f24a36a 100644
--- a/ci/environments/network/multiple-nics-ipv6/nic-configs/controller.yaml
+++ b/ci/environments/network/multiple-nics-ipv6/nic-configs/controller.yaml
@@ -77,8 +77,10 @@ parameters:
     default: []
     description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
     type: comma_delimited_list
-  EC2MetadataIp: # Override this via parameter_defaults
-    description: The IP address of the EC2 metadata server.
+  EC2MetadataIp:
+    default: ''
+    description: The IP address of the EC2 metadata server. (The parameter
+      is automatically resolved from the ctlplane subnet's host_routes attribute.)
     type: string
 
 resources:
diff --git a/ci/environments/network/multiple-nics-ipv6/nic-configs/swift-storage.yaml b/ci/environments/network/multiple-nics-ipv6/nic-configs/swift-storage.yaml
index de5d919635..853ab6fc96 100644
--- a/ci/environments/network/multiple-nics-ipv6/nic-configs/swift-storage.yaml
+++ b/ci/environments/network/multiple-nics-ipv6/nic-configs/swift-storage.yaml
@@ -77,8 +77,10 @@ parameters:
     default: []
     description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
     type: comma_delimited_list
-  EC2MetadataIp: # Override this via parameter_defaults
-    description: The IP address of the EC2 metadata server.
+  EC2MetadataIp:
+    default: ''
+    description: The IP address of the EC2 metadata server. (The parameter
+      is automatically resolved from the ctlplane subnet's host_routes attribute.)
     type: string
 
 resources:
diff --git a/ci/environments/network/multiple-nics/network-environment.yaml b/ci/environments/network/multiple-nics/network-environment.yaml
index 4f5e0b5274..1d544d1b27 100644
--- a/ci/environments/network/multiple-nics/network-environment.yaml
+++ b/ci/environments/network/multiple-nics/network-environment.yaml
@@ -7,7 +7,6 @@ resource_registry:
   OS::TripleO::CephStorage::Net::SoftwareConfig: nic-configs/ceph-storage.yaml
 
 parameter_defaults:
-  EC2MetadataIp: 192.168.24.1
   ExternalNetCidr: 10.0.0.0/24
   ExternalAllocationPools: [{"start": "10.0.0.10", "end": "10.0.0.50"}]
   ExternalInterfaceDefaultRoute: 10.0.0.1
diff --git a/ci/environments/network/multiple-nics/nic-configs/ceph-storage.yaml b/ci/environments/network/multiple-nics/nic-configs/ceph-storage.yaml
index 6e3ac01a03..47c18a109a 100644
--- a/ci/environments/network/multiple-nics/nic-configs/ceph-storage.yaml
+++ b/ci/environments/network/multiple-nics/nic-configs/ceph-storage.yaml
@@ -77,8 +77,10 @@ parameters:
     default: []
     description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
     type: comma_delimited_list
-  EC2MetadataIp: # Override this via parameter_defaults
-    description: The IP address of the EC2 metadata server.
+  EC2MetadataIp:
+    default: ''
+    description: The IP address of the EC2 metadata server. (The parameter
+      is automatically resolved from the ctlplane subnet's host_routes attribute.)
     type: string
 
 resources:
diff --git a/ci/environments/network/multiple-nics/nic-configs/cinder-storage.yaml b/ci/environments/network/multiple-nics/nic-configs/cinder-storage.yaml
index 4ca0188b09..9ed88118a9 100644
--- a/ci/environments/network/multiple-nics/nic-configs/cinder-storage.yaml
+++ b/ci/environments/network/multiple-nics/nic-configs/cinder-storage.yaml
@@ -77,8 +77,10 @@ parameters:
     default: []
     description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
     type: comma_delimited_list
-  EC2MetadataIp: # Override this via parameter_defaults
-    description: The IP address of the EC2 metadata server.
+  EC2MetadataIp:
+    default: ''
+    description: The IP address of the EC2 metadata server. (The parameter
+      is automatically resolved from the ctlplane subnet's host_routes attribute.)
     type: string
 
 resources:
diff --git a/ci/environments/network/multiple-nics/nic-configs/compute.yaml b/ci/environments/network/multiple-nics/nic-configs/compute.yaml
index 444726d581..7c00aeab3a 100644
--- a/ci/environments/network/multiple-nics/nic-configs/compute.yaml
+++ b/ci/environments/network/multiple-nics/nic-configs/compute.yaml
@@ -77,8 +77,10 @@ parameters:
     default: []
     description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
     type: comma_delimited_list
-  EC2MetadataIp: # Override this via parameter_defaults
-    description: The IP address of the EC2 metadata server.
+  EC2MetadataIp:
+    default: ''
+    description: The IP address of the EC2 metadata server. (The parameter
+      is automatically resolved from the ctlplane subnet's host_routes attribute.)
     type: string
 
 resources:
diff --git a/ci/environments/network/multiple-nics/nic-configs/controller.yaml b/ci/environments/network/multiple-nics/nic-configs/controller.yaml
index f58604af83..9294fa6220 100644
--- a/ci/environments/network/multiple-nics/nic-configs/controller.yaml
+++ b/ci/environments/network/multiple-nics/nic-configs/controller.yaml
@@ -77,8 +77,10 @@ parameters:
     default: []
     description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
     type: comma_delimited_list
-  EC2MetadataIp: # Override this via parameter_defaults
-    description: The IP address of the EC2 metadata server.
+  EC2MetadataIp:
+    default: ''
+    description: The IP address of the EC2 metadata server. (The parameter
+      is automatically resolved from the ctlplane subnet's host_routes attribute.)
     type: string
 
 resources:
diff --git a/ci/environments/network/multiple-nics/nic-configs/swift-storage.yaml b/ci/environments/network/multiple-nics/nic-configs/swift-storage.yaml
index 4ca0188b09..9ed88118a9 100644
--- a/ci/environments/network/multiple-nics/nic-configs/swift-storage.yaml
+++ b/ci/environments/network/multiple-nics/nic-configs/swift-storage.yaml
@@ -77,8 +77,10 @@ parameters:
     default: []
     description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
     type: comma_delimited_list
-  EC2MetadataIp: # Override this via parameter_defaults
-    description: The IP address of the EC2 metadata server.
+  EC2MetadataIp:
+    default: ''
+    description: The IP address of the EC2 metadata server. (The parameter
+      is automatically resolved from the ctlplane subnet's host_routes attribute.)
     type: string
 
 resources:
diff --git a/ci/environments/network/public-bond/network-environment.yaml b/ci/environments/network/public-bond/network-environment.yaml
index 6ff32a7049..4924b5b9a0 100644
--- a/ci/environments/network/public-bond/network-environment.yaml
+++ b/ci/environments/network/public-bond/network-environment.yaml
@@ -7,7 +7,6 @@ resource_registry:
   OS::TripleO::CephStorage::Net::SoftwareConfig: nic-configs/ceph-storage.yaml
 
 parameter_defaults:
-  EC2MetadataIp: 192.168.24.1
   ExternalNetCidr: 10.0.0.0/24
   ExternalAllocationPools: [{"start": "10.0.0.10", "end": "10.0.0.50"}]
   ExternalInterfaceDefaultRoute: 10.0.0.1
diff --git a/ci/environments/network/public-bond/nic-configs/ceph-storage.yaml b/ci/environments/network/public-bond/nic-configs/ceph-storage.yaml
index 7b8091f499..bf6eb79ef4 100644
--- a/ci/environments/network/public-bond/nic-configs/ceph-storage.yaml
+++ b/ci/environments/network/public-bond/nic-configs/ceph-storage.yaml
@@ -77,8 +77,10 @@ parameters:
     default: []
     description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
     type: comma_delimited_list
-  EC2MetadataIp: # Override this via parameter_defaults
-    description: The IP address of the EC2 metadata server.
+  EC2MetadataIp:
+    default: ''
+    description: The IP address of the EC2 metadata server. (The parameter
+      is automatically resolved from the ctlplane subnet's host_routes attribute.)
     type: string
 
 resources:
diff --git a/ci/environments/network/public-bond/nic-configs/cinder-storage.yaml b/ci/environments/network/public-bond/nic-configs/cinder-storage.yaml
index 94f23c9d7e..e7326565c4 100644
--- a/ci/environments/network/public-bond/nic-configs/cinder-storage.yaml
+++ b/ci/environments/network/public-bond/nic-configs/cinder-storage.yaml
@@ -77,8 +77,10 @@ parameters:
     default: []
     description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
     type: comma_delimited_list
-  EC2MetadataIp: # Override this via parameter_defaults
-    description: The IP address of the EC2 metadata server.
+  EC2MetadataIp:
+    default: ''
+    description: The IP address of the EC2 metadata server. (The parameter
+      is automatically resolved from the ctlplane subnet's host_routes attribute.)
     type: string
 
 resources:
diff --git a/ci/environments/network/public-bond/nic-configs/compute.yaml b/ci/environments/network/public-bond/nic-configs/compute.yaml
index 66622a149e..61b1ded96a 100644
--- a/ci/environments/network/public-bond/nic-configs/compute.yaml
+++ b/ci/environments/network/public-bond/nic-configs/compute.yaml
@@ -77,8 +77,10 @@ parameters:
     default: []
     description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
     type: comma_delimited_list
-  EC2MetadataIp: # Override this via parameter_defaults
-    description: The IP address of the EC2 metadata server.
+  EC2MetadataIp:
+    default: ''
+    description: The IP address of the EC2 metadata server. (The parameter
+      is automatically resolved from the ctlplane subnet's host_routes attribute.)
     type: string
 
 resources:
diff --git a/ci/environments/network/public-bond/nic-configs/controller.yaml b/ci/environments/network/public-bond/nic-configs/controller.yaml
index 896995ee11..79dbc4e2a8 100644
--- a/ci/environments/network/public-bond/nic-configs/controller.yaml
+++ b/ci/environments/network/public-bond/nic-configs/controller.yaml
@@ -77,8 +77,10 @@ parameters:
     default: []
     description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
     type: comma_delimited_list
-  EC2MetadataIp: # Override this via parameter_defaults
-    description: The IP address of the EC2 metadata server.
+  EC2MetadataIp:
+    default: ''
+    description: The IP address of the EC2 metadata server. (The parameter
+      is automatically resolved from the ctlplane subnet's host_routes attribute.)
     type: string
 
 resources:
diff --git a/ci/environments/network/public-bond/nic-configs/swift-storage.yaml b/ci/environments/network/public-bond/nic-configs/swift-storage.yaml
index 94f23c9d7e..e7326565c4 100644
--- a/ci/environments/network/public-bond/nic-configs/swift-storage.yaml
+++ b/ci/environments/network/public-bond/nic-configs/swift-storage.yaml
@@ -77,8 +77,10 @@ parameters:
     default: []
     description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
     type: comma_delimited_list
-  EC2MetadataIp: # Override this via parameter_defaults
-    description: The IP address of the EC2 metadata server.
+  EC2MetadataIp:
+    default: ''
+    description: The IP address of the EC2 metadata server. (The parameter
+      is automatically resolved from the ctlplane subnet's host_routes attribute.)
     type: string
 
 resources:
diff --git a/environments/network-environment-v6.j2.yaml b/environments/network-environment-v6.j2.yaml
index 5242fea944..a2f38518c8 100644
--- a/environments/network-environment-v6.j2.yaml
+++ b/environments/network-environment-v6.j2.yaml
@@ -24,8 +24,10 @@ parameter_defaults:
   # ControlPlaneDefaultRoute: It is no longer a requirement to provide this
   #                           parameter. The attribute is resolved from the
   #                           ctlplane subnet(s).
+  # EC2MetadataIp: It is no longer a requirement to provide this parameter. The
+  #                attribute is resolved from the ctlplane subnet(s).
+  #
   #
-  EC2MetadataIp: 192.168.24.1  # Generally the IP of the Undercloud
 {% for network in networks if network.enabled|default(true) %}
 {%-     if network.name != 'Tenant' %}
   # Customize the IP subnets to match the local environment
diff --git a/environments/network-environment.j2.yaml b/environments/network-environment.j2.yaml
index a44a3dd8d1..25b64745e2 100644
--- a/environments/network-environment.j2.yaml
+++ b/environments/network-environment.j2.yaml
@@ -20,8 +20,9 @@ parameter_defaults:
   # ControlPlaneDefaultRoute: It is no longer a requirement to provide this
   #                           parameter. The attribute is resolved from the
   #                           ctlplane subnet(s).
+  # EC2MetadataIp: It is no longer a requirement to provide this parameter. The
+  #                attribute is resolved from the ctlplane subnet(s).
   #
-  EC2MetadataIp: 192.168.24.1  # Generally the IP of the Undercloud
 {% for network in networks if network.enabled|default(true) %}
   # Customize the IP subnet to match the local environment
 {%-     if network.ipv6|default(false) %}
diff --git a/net-config-bond.j2.yaml b/net-config-bond.j2.yaml
index 537efac323..4e67c8095e 100644
--- a/net-config-bond.j2.yaml
+++ b/net-config-bond.j2.yaml
@@ -27,6 +27,11 @@ parameters:
     description: The default route of the control plane network. (The parameter
       is automatically resolved from the ctlplane subnet's gateway_ip attribute.)
     type: string
+  EC2MetadataIp: # Here for compatability, not used.
+    default: ''
+    description: The IP address of the EC2 metadata server. (The parameter
+      is automatically resolved from the ctlplane subnet's host_routes attribute.)
+    type: string
   {%- for network in networks %}
   {{network.name}}IpSubnet:
     default: ''
diff --git a/net-config-bridge.j2.yaml b/net-config-bridge.j2.yaml
index c1b922122b..0f9b83cbfd 100644
--- a/net-config-bridge.j2.yaml
+++ b/net-config-bridge.j2.yaml
@@ -17,6 +17,11 @@ parameters:
     description: The default route of the control plane network. (The parameter
       is automatically resolved from the ctlplane subnet's gateway_ip attribute.)
     type: string
+  EC2MetadataIp: # Here for compatability, not used.
+    default: ''
+    description: The IP address of the EC2 metadata server. (The parameter
+      is automatically resolved from the ctlplane subnet's host_routes attribute.)
+    type: string
   {%- for network in networks %}
   {{network.name}}IpSubnet:
     default: ''
diff --git a/net-config-linux-bridge.j2.yaml b/net-config-linux-bridge.j2.yaml
index 6a838e63f8..5c5c5491fd 100644
--- a/net-config-linux-bridge.j2.yaml
+++ b/net-config-linux-bridge.j2.yaml
@@ -23,10 +23,11 @@ parameters:
       The subnet CIDR of the control plane network. (The parameter is
       automatically resolved from the ctlplane subnet's cidr attribute.)
     type: string
-  EC2MetadataIp: # Override this via parameter_defaults
-    description: The IP address of the EC2 metadata server.
+  EC2MetadataIp:
+    default: ''
+    description: The IP address of the EC2 metadata server. (The parameter
+      is automatically resolved from the ctlplane subnet's host_routes attribute.)
     type: string
-    default: 169.254.169.254/32
 resources:
   OsNetConfigImpl:
     type: OS::Heat::SoftwareConfig
diff --git a/net-config-noop.j2.yaml b/net-config-noop.j2.yaml
index 8be8f7baf8..14cd711607 100644
--- a/net-config-noop.j2.yaml
+++ b/net-config-noop.j2.yaml
@@ -20,6 +20,11 @@ parameters:
     description: The default route of the control plane network. (The parameter
       is automatically resolved from the ctlplane subnet's gateway_ip attribute.)
     type: string
+  EC2MetadataIp: # Here for compatability, not used.
+    default: ''
+    description: The IP address of the EC2 metadata server. (The parameter
+      is automatically resolved from the ctlplane subnet's host_routes attribute.)
+    type: string
   {%- for network in networks %}
   {{network.name}}IpSubnet:
     default: ''
diff --git a/net-config-standalone.j2.yaml b/net-config-standalone.j2.yaml
index 7480ca38a9..8ae2bb8dc8 100644
--- a/net-config-standalone.j2.yaml
+++ b/net-config-standalone.j2.yaml
@@ -46,6 +46,11 @@ parameters:
         tripleoclient to provide an easy means to pass in custom net configs
         for a standalone node.
     type: json
+  EC2MetadataIp: # Here for compatability, not used.
+    default: ''
+    description: The IP address of the EC2 metadata server. (The parameter
+      is automatically resolved from the ctlplane subnet's host_routes attribute.)
+    type: string
 
 conditions:
   standalone_net_config_override:
diff --git a/net-config-static-bridge-with-external-dhcp.j2.yaml b/net-config-static-bridge-with-external-dhcp.j2.yaml
index 0beff02aa2..4a2c08ddcd 100644
--- a/net-config-static-bridge-with-external-dhcp.j2.yaml
+++ b/net-config-static-bridge-with-external-dhcp.j2.yaml
@@ -28,8 +28,10 @@ parameters:
     default: []
     description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
     type: comma_delimited_list
-  EC2MetadataIp: # Override this via parameter_defaults
-    description: The IP address of the EC2 metadata server.
+  EC2MetadataIp:
+    default: ''
+    description: The IP address of the EC2 metadata server. (The parameter
+      is automatically resolved from the ctlplane subnet's host_routes attribute.)
     type: string
 resources:
   OsNetConfigImpl:
diff --git a/net-config-static-bridge.j2.yaml b/net-config-static-bridge.j2.yaml
index f1a6bd363b..ab32b55f8c 100644
--- a/net-config-static-bridge.j2.yaml
+++ b/net-config-static-bridge.j2.yaml
@@ -28,8 +28,10 @@ parameters:
     default: []
     description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
     type: comma_delimited_list
-  EC2MetadataIp: # Override this via parameter_defaults
-    description: The IP address of the EC2 metadata server.
+  EC2MetadataIp:
+    default: ''
+    description: The IP address of the EC2 metadata server. (The parameter
+      is automatically resolved from the ctlplane subnet's host_routes attribute.)
     type: string
 resources:
   OsNetConfigImpl:
diff --git a/net-config-static.j2.yaml b/net-config-static.j2.yaml
index 75aa65636c..34509d1325 100644
--- a/net-config-static.j2.yaml
+++ b/net-config-static.j2.yaml
@@ -27,8 +27,10 @@ parameters:
     default: []
     description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
     type: comma_delimited_list
-  EC2MetadataIp: # Override this via parameter_defaults
-    description: The IP address of the EC2 metadata server.
+  EC2MetadataIp:
+    default: ''
+    description: The IP address of the EC2 metadata server. (The parameter
+      is automatically resolved from the ctlplane subnet's host_routes attribute.)
     type: string
 resources:
   OsNetConfigImpl:
diff --git a/net-config-undercloud.j2.yaml b/net-config-undercloud.j2.yaml
index 7720d71f1b..1dfc2e884c 100644
--- a/net-config-undercloud.j2.yaml
+++ b/net-config-undercloud.j2.yaml
@@ -42,6 +42,11 @@ parameters:
     default: {}
     description: Custom JSON data to be used to override the os-net-config data in this template. This is meant to be used by net_config_override parameter in tripleoclient to provide an easy means to pass in custom net configs for the Undercloud.
     type: json
+  EC2MetadataIp: # Here for compatability, not used.
+    default: ''
+    description: The IP address of the EC2 metadata server. (The parameter
+      is automatically resolved from the ctlplane subnet's host_routes attribute.)
+    type: string
 
 conditions:
   undercloud_net_config_override:
diff --git a/network/config/bond-with-vlans/controller-no-external.j2.yaml b/network/config/bond-with-vlans/controller-no-external.j2.yaml
index 62e922a5d5..e6efbfbd07 100644
--- a/network/config/bond-with-vlans/controller-no-external.j2.yaml
+++ b/network/config/bond-with-vlans/controller-no-external.j2.yaml
@@ -46,8 +46,10 @@ parameters:
     default: []
     description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
     type: comma_delimited_list
-  EC2MetadataIp: # Override this via parameter_defaults
-    description: The IP address of the EC2 metadata server.
+  EC2MetadataIp:
+    default: ''
+    description: The IP address of the EC2 metadata server. (The parameter
+      is automatically resolved from the ctlplane subnet's host_routes attribute.)
     type: string
   BondInterfaceOvsOptions:
     default: ''
diff --git a/network/config/bond-with-vlans/controller-v6.j2.yaml b/network/config/bond-with-vlans/controller-v6.j2.yaml
index a676459188..73b1c6d050 100644
--- a/network/config/bond-with-vlans/controller-v6.j2.yaml
+++ b/network/config/bond-with-vlans/controller-v6.j2.yaml
@@ -44,8 +44,10 @@ parameters:
     default: []
     description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
     type: comma_delimited_list
-  EC2MetadataIp: # Override this via parameter_defaults
-    description: The IP address of the EC2 metadata server.
+  EC2MetadataIp:
+    default: ''
+    description: The IP address of the EC2 metadata server. (The parameter
+      is automatically resolved from the ctlplane subnet's host_routes attribute.)
     type: string
   BondInterfaceOvsOptions:
     default: bond_mode=active-backup
diff --git a/network/config/bond-with-vlans/role.role.j2.yaml b/network/config/bond-with-vlans/role.role.j2.yaml
index b6a8c9e3d0..d9d4a5f8d0 100644
--- a/network/config/bond-with-vlans/role.role.j2.yaml
+++ b/network/config/bond-with-vlans/role.role.j2.yaml
@@ -42,8 +42,10 @@ parameters:
     default: []
     description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
     type: comma_delimited_list
-  EC2MetadataIp: # Override this via parameter_defaults
-    description: The IP address of the EC2 metadata server.
+  EC2MetadataIp:
+    default: ''
+    description: The IP address of the EC2 metadata server. (The parameter
+      is automatically resolved from the ctlplane subnet's host_routes attribute.)
     type: string
   BondInterfaceOvsOptions:
     default: bond_mode=active-backup
diff --git a/network/config/multiple-nics/compute-dvr.j2.yaml b/network/config/multiple-nics/compute-dvr.j2.yaml
index e631862454..68d403b5eb 100644
--- a/network/config/multiple-nics/compute-dvr.j2.yaml
+++ b/network/config/multiple-nics/compute-dvr.j2.yaml
@@ -44,8 +44,10 @@ parameters:
     default: []
     description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
     type: comma_delimited_list
-  EC2MetadataIp: # Override this via parameter_defaults
-    description: The IP address of the EC2 metadata server.
+  EC2MetadataIp:
+    default: ''
+    description: The IP address of the EC2 metadata server. (The parameter
+      is automatically resolved from the ctlplane subnet's host_routes attribute.)
     type: string
 resources:
   OsNetConfigImpl:
diff --git a/network/config/multiple-nics/controller-v6.j2.yaml b/network/config/multiple-nics/controller-v6.j2.yaml
index fde66f50c0..9622be7107 100644
--- a/network/config/multiple-nics/controller-v6.j2.yaml
+++ b/network/config/multiple-nics/controller-v6.j2.yaml
@@ -43,8 +43,10 @@ parameters:
     default: []
     description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
     type: comma_delimited_list
-  EC2MetadataIp: # Override this via parameter_defaults
-    description: The IP address of the EC2 metadata server.
+  EC2MetadataIp:
+    default: ''
+    description: The IP address of the EC2 metadata server. (The parameter
+      is automatically resolved from the ctlplane subnet's host_routes attribute.)
     type: string
 resources:
   OsNetConfigImpl:
diff --git a/network/config/multiple-nics/role.role.j2.yaml b/network/config/multiple-nics/role.role.j2.yaml
index e9686564b0..5e1bab8947 100644
--- a/network/config/multiple-nics/role.role.j2.yaml
+++ b/network/config/multiple-nics/role.role.j2.yaml
@@ -42,8 +42,10 @@ parameters:
     default: []
     description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
     type: comma_delimited_list
-  EC2MetadataIp: # Override this via parameter_defaults
-    description: The IP address of the EC2 metadata server.
+  EC2MetadataIp:
+    default: ''
+    description: The IP address of the EC2 metadata server. (The parameter
+      is automatically resolved from the ctlplane subnet's host_routes attribute.)
     type: string
 {%- if role.name == 'ComputeOvsDpdk' %}
   NumDpdkInterfaceRxQueues:
diff --git a/network/config/single-nic-linux-bridge-vlans/controller-v6.j2.yaml b/network/config/single-nic-linux-bridge-vlans/controller-v6.j2.yaml
index d5a398f42f..f8dae080dc 100644
--- a/network/config/single-nic-linux-bridge-vlans/controller-v6.j2.yaml
+++ b/network/config/single-nic-linux-bridge-vlans/controller-v6.j2.yaml
@@ -43,8 +43,10 @@ parameters:
     default: []
     description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
     type: comma_delimited_list
-  EC2MetadataIp: # Override this via parameter_defaults
-    description: The IP address of the EC2 metadata server.
+  EC2MetadataIp:
+    default: ''
+    description: The IP address of the EC2 metadata server. (The parameter
+      is automatically resolved from the ctlplane subnet's host_routes attribute.)
     type: string
 resources:
   OsNetConfigImpl:
diff --git a/network/config/single-nic-linux-bridge-vlans/role.role.j2.yaml b/network/config/single-nic-linux-bridge-vlans/role.role.j2.yaml
index e2a1b02fc4..326ce5ba21 100644
--- a/network/config/single-nic-linux-bridge-vlans/role.role.j2.yaml
+++ b/network/config/single-nic-linux-bridge-vlans/role.role.j2.yaml
@@ -42,8 +42,10 @@ parameters:
     default: []
     description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
     type: comma_delimited_list
-  EC2MetadataIp: # Override this via parameter_defaults
-    description: The IP address of the EC2 metadata server.
+  EC2MetadataIp:
+    default: ''
+    description: The IP address of the EC2 metadata server. (The parameter
+      is automatically resolved from the ctlplane subnet's host_routes attribute.)
     type: string
 resources:
   OsNetConfigImpl:
diff --git a/network/config/single-nic-vlans/controller-no-external.j2.yaml b/network/config/single-nic-vlans/controller-no-external.j2.yaml
index e6ab1efb55..ade5e01073 100644
--- a/network/config/single-nic-vlans/controller-no-external.j2.yaml
+++ b/network/config/single-nic-vlans/controller-no-external.j2.yaml
@@ -46,8 +46,10 @@ parameters:
     default: []
     description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
     type: comma_delimited_list
-  EC2MetadataIp: # Override this via parameter_defaults
-    description: The IP address of the EC2 metadata server.
+  EC2MetadataIp:
+    default: ''
+    description: The IP address of the EC2 metadata server. (The parameter
+      is automatically resolved from the ctlplane subnet's host_routes attribute.)
     type: string
 resources:
   OsNetConfigImpl:
diff --git a/network/config/single-nic-vlans/controller-v6.j2.yaml b/network/config/single-nic-vlans/controller-v6.j2.yaml
index 4fc3c2fc1d..c7eee6f73d 100644
--- a/network/config/single-nic-vlans/controller-v6.j2.yaml
+++ b/network/config/single-nic-vlans/controller-v6.j2.yaml
@@ -43,8 +43,10 @@ parameters:
     default: []
     description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
     type: comma_delimited_list
-  EC2MetadataIp: # Override this via parameter_defaults
-    description: The IP address of the EC2 metadata server.
+  EC2MetadataIp:
+    default: ''
+    description: The IP address of the EC2 metadata server. (The parameter
+      is automatically resolved from the ctlplane subnet's host_routes attribute.)
     type: string
 resources:
   OsNetConfigImpl:
diff --git a/network/config/single-nic-vlans/role.role.j2.yaml b/network/config/single-nic-vlans/role.role.j2.yaml
index fd2ea24176..d5b30794b2 100644
--- a/network/config/single-nic-vlans/role.role.j2.yaml
+++ b/network/config/single-nic-vlans/role.role.j2.yaml
@@ -42,8 +42,10 @@ parameters:
     default: []
     description: A list of DNS servers (2 max for some implementations) that will be added to resolv.conf.
     type: comma_delimited_list
-  EC2MetadataIp: # Override this via parameter_defaults
-    description: The IP address of the EC2 metadata server.
+  EC2MetadataIp:
+    default: ''
+    description: The IP address of the EC2 metadata server. (The parameter
+      is automatically resolved from the ctlplane subnet's host_routes attribute.)
     type: string
 resources:
   OsNetConfigImpl:
diff --git a/puppet/role.role.j2.yaml b/puppet/role.role.j2.yaml
index 661bbbe6b8..6f770ba8be 100644
--- a/puppet/role.role.j2.yaml
+++ b/puppet/role.role.j2.yaml
@@ -255,6 +255,11 @@ parameters:
     description: The default route of the control plane network. (The parameter
       is automatically resolved from the ctlplane subnet's gateway_ip attribute.)
     type: string
+  EC2MetadataIp:
+    default: ''
+    description: The IP address of the EC2 metadata server. (The parameter
+      is automatically resolved from the ctlplane subnet's host_routes attribute.)
+    type: string
 
   ServerDeletionPolicy:
     description: Whether to retain or delete servers on deletion of the stack
@@ -332,6 +337,9 @@ conditions:
   ctlplane_default_route_set:
     not:
       equals: [{get_param: ControlPlaneDefaultRoute}, '']
+  ec2metadaip_set:
+    not:
+      equals: [{get_param: EC2MetadataIp}, '']
 
 resources:
   {{server_resource_name}}:
@@ -462,6 +470,16 @@ resources:
           - ctlplane_default_route_set
           - {get_param: ControlPlaneDefaultRoute}
           - {get_attr: [{{server_resource_name}}, addresses, ctlplane, 0, subnets, 0, gateway_ip]}
+      EC2MetadataIp:
+        if:
+          - ec2metadaip_set
+          - {get_param: EC2MetadataIp}
+          - yaql:
+              # NOTE(hjensas): DeployedServer sets the EC2MetadataIp in DeployedServerEnvironment.
+              # Return an empty string if there are no host_routes in the subnet. (Standalone and Container Undercloud)
+              expression: switch($.data = null => '', $.data != null => $.data.where($.destination = "169.254.169.254/32").nexthop.first())
+              data: {get_attr: [{{server_resource_name}}, addresses, ctlplane, 0, subnets, 0, host_routes]}
+
   {%- for network in networks %}
       {{network.name}}IpSubnet: {get_attr: [{{network.name}}Port, ip_subnet]}
   {%- endfor %}
diff --git a/releasenotes/notes/use-subnet-attrs-ec2metadataip-aa28f3c030f13c9c.yaml b/releasenotes/notes/use-subnet-attrs-ec2metadataip-aa28f3c030f13c9c.yaml
new file mode 100644
index 0000000000..0abe2b8324
--- /dev/null
+++ b/releasenotes/notes/use-subnet-attrs-ec2metadataip-aa28f3c030f13c9c.yaml
@@ -0,0 +1,25 @@
+---
+features:
+  - |
+    It is no longer a requirement to provide the parameter: ``EC2MetadataIp``
+    in the environment when deploying. Now ``get_attr`` on the server resource
+    is used to resolve the value from the ``ctlplane`` subnet's ``host_routes``
+    attribute.. A conditional is used to determine if the user provided the
+    parameter in the environment. If the user provided the parameter, the user
+    provided value is used.
+upgrade:
+  - |
+    Since the the ``EC2MetadataIp`` can now be resolved from the ``ctlplane``
+    subnet(s) this parameter can be removed from the environment
+    (``network-environment.yaml``).
+
+    .. Note:: Prior to removing the parameter ensure that the property of
+              the ``ctlplane`` subnet(s) is correct. In case it is not, update
+              ``undercloud.conf`` with the correct configuration and re-run the
+              ``openstack undercloud install`` command to ensure the property
+              is set correctly.
+
+    .. Note:: ``EC2MetadataIp`` is now passed to the network config template
+              when the resource is created. Because of this the parameter must
+              be defined in the network config template, even if it is not
+              used.