diff --git a/ansible/group_vars/all/compute b/ansible/group_vars/all/compute
index 1204341548da1dbe004e3f662894d44b8940c49c..bd771c31cf4db9fe10109ec01f0dfdec2bf3ef66 100644
--- a/ansible/group_vars/all/compute
+++ b/ansible/group_vars/all/compute
@@ -12,7 +12,7 @@ compute_bootstrap_user: "{{ lookup('env', 'USER') }}"
 # List of networks to which compute nodes are attached.
 compute_network_interfaces: >
   {{ (compute_default_network_interfaces +
-      compute_extra_network_interfaces) | unique | list }}
+      compute_extra_network_interfaces) | reject('none') | unique | list }}
 
 # List of default networks to which compute nodes are attached.
 compute_default_network_interfaces: >
diff --git a/ansible/group_vars/all/controllers b/ansible/group_vars/all/controllers
index b8ef9f05f1d18bead5a67c6a61cf3aa8e23bf9e1..4d278a9117f05a1fa94a1ad4b8aa74bb43021aae 100644
--- a/ansible/group_vars/all/controllers
+++ b/ansible/group_vars/all/controllers
@@ -14,7 +14,7 @@ controller_network_interfaces: >
   {{ (controller_default_network_interfaces +
       controller_extra_network_interfaces +
       (controller_network_host_network_interfaces
-       if inventory_hostname in groups['network'] else [])) | unique | list }}
+       if inventory_hostname in groups['network'] else [])) | reject('none') | unique | list }}
 
 # List of default networks to which controller nodes are attached.
 controller_default_network_interfaces: >
@@ -36,7 +36,7 @@ controller_extra_network_interfaces: []
 controller_network_host_network_interfaces: >
   {{ ([public_net_name,
        tunnel_net_name] +
-      external_net_names) | unique | list }}
+      external_net_names) | reject('none') | unique | list }}
 
 ###############################################################################
 # Controller node BIOS configuration.
diff --git a/ansible/group_vars/all/monitoring b/ansible/group_vars/all/monitoring
index b89bd340cf025eaefa384c9c8de7f9a66ec848be..d03e4f2ae5e7d9f4c5d0c6a7e1ddc8d8809fdbe0 100644
--- a/ansible/group_vars/all/monitoring
+++ b/ansible/group_vars/all/monitoring
@@ -14,13 +14,13 @@ monitoring_network_interfaces: >
   {{ controller_network_interfaces | unique | list
      if inventory_hostname in groups['controllers'] else
      (monitoring_default_network_interfaces +
-      monitoring_extra_network_interfaces) | unique | list }}
+      monitoring_extra_network_interfaces) | reject('none') | unique | list }}
 
 # List of default networks to which monitoring nodes are attached.
 monitoring_default_network_interfaces: >
   {{ [admin_oc_net_name,
       internal_net_name,
-      public_net_name] | unique | list }}
+      public_net_name] | reject('none') | unique | list }}
 
 # List of extra networks to which monitoring nodes are attached.
 monitoring_extra_network_interfaces: []
diff --git a/ansible/group_vars/all/seed b/ansible/group_vars/all/seed
index 12620ae7958c1d5b95ed3c457947f5f4c139078b..b53b1dbaf3936e519592afe6c6dd1fb883cdbd71 100644
--- a/ansible/group_vars/all/seed
+++ b/ansible/group_vars/all/seed
@@ -12,13 +12,13 @@ seed_bootstrap_user: "{{ lookup('env', 'USER') }}"
 # List of networks to which seed nodes are attached.
 seed_network_interfaces: >
   {{ (seed_default_network_interfaces +
-      seed_extra_network_interfaces) | unique | list }}
+      seed_extra_network_interfaces) | reject('none') | unique | list }}
 
 # List of default networks to which seed nodes are attached.
 seed_default_network_interfaces: >
   {{ [admin_oc_net_name,
       oob_oc_net_name,
-      provision_oc_net_name] | unique | list }}
+      provision_oc_net_name] | reject('none') | unique | list }}
 
 # List of extra networks to which seed nodes are attached.
 seed_extra_network_interfaces: []
diff --git a/ansible/group_vars/all/seed-hypervisor b/ansible/group_vars/all/seed-hypervisor
index 506b4dbfec760c0e490dc76a088de5539a8b9a8f..0cacd43750af8bead221064be9cbb764826aef13 100644
--- a/ansible/group_vars/all/seed-hypervisor
+++ b/ansible/group_vars/all/seed-hypervisor
@@ -12,7 +12,7 @@ seed_hypervisor_bootstrap_user: "{{ lookup('env', 'USER') }}"
 # List of networks to which seed hypervisor nodes are attached.
 seed_hypervisor_network_interfaces: >
   {{ (seed_hypervisor_default_network_interfaces +
-      seed_hypervisor_extra_network_interfaces) | unique | list }}
+      seed_hypervisor_extra_network_interfaces) | reject('none') | unique | list }}
 
 # List of default networks to which seed hypervisor nodes are attached.
 seed_hypervisor_default_network_interfaces: "{{ seed_default_network_interfaces }}"
diff --git a/ansible/group_vars/all/storage b/ansible/group_vars/all/storage
index d80572e0eebf7bac6b302f6a9f639b5bb63053cc..3deb1f3b395f47a86819790922fbbdd9a9392d8a 100644
--- a/ansible/group_vars/all/storage
+++ b/ansible/group_vars/all/storage
@@ -27,7 +27,7 @@ storage_default_network_interfaces: >
   {{ [admin_oc_net_name,
       internal_net_name,
       storage_mgmt_net_name,
-      storage_net_name] | unique | list }}
+      storage_net_name] | reject('none') | unique | list }}
 
 # List of extra networks to which storage nodes are attached.
 storage_extra_network_interfaces: []
diff --git a/ansible/kolla-ansible.yml b/ansible/kolla-ansible.yml
index 580c823cddd5c29b73fc1899cdaf77ec59f4ce38..ca9b85d71a8fc63b622d4c3dc983ac2c5376e068 100644
--- a/ansible/kolla-ansible.yml
+++ b/ansible/kolla-ansible.yml
@@ -213,6 +213,7 @@
   hosts: localhost
   tags:
     - kolla-ansible
+  gather_facts: true
   vars:
     # We need to reference configuration for the network node.
     # We pick the first host from the group for this. It is possible that at
diff --git a/ansible/kolla-openstack.yml b/ansible/kolla-openstack.yml
index dfeabbabf25568786c6859e5479da29fb4dabfc4..e093406f591ad6a96b18d39a234e27de7088c8d6 100644
--- a/ansible/kolla-openstack.yml
+++ b/ansible/kolla-openstack.yml
@@ -109,6 +109,7 @@
             - { name: inspector, file: ironic-inspector.conf }
             - { name: ironic, file: ironic.conf }
             - { name: kafka, file: kafka.server.properties }
+            - { name: keystone, file: keystone.conf }
             - { name: magnum, file: magnum.conf }
             - { name: manila, file: manila.conf }
             - { name: mariadb, file: galera.cnf }
@@ -212,6 +213,7 @@
       kolla_extra_inspector: "{{ kolla_extra_config.inspector | default }}"
       kolla_extra_ironic: "{{ kolla_extra_config.ironic | default }}"
       kolla_extra_kafka: "{{ kolla_extra_config.kafka | default }}"
+      kolla_extra_keystone: "{{ kolla_extra_config.keystone | default }}"
       kolla_extra_magnum: "{{ kolla_extra_config.magnum | default }}"
       kolla_extra_manila: "{{ kolla_extra_config.manila | default }}"
       kolla_extra_mariadb: "{{ kolla_extra_config.mariadb | default }}"
diff --git a/ansible/roles/kolla-openstack/defaults/main.yml b/ansible/roles/kolla-openstack/defaults/main.yml
index dc5e3ebe97133dd2b079213efb1c89b17e0aec5d..368be606504fc3d30c4b929a95fc71d47cc3e218 100644
--- a/ansible/roles/kolla-openstack/defaults/main.yml
+++ b/ansible/roles/kolla-openstack/defaults/main.yml
@@ -67,6 +67,15 @@ kolla_extra_grafana:
 kolla_enable_haproxy:
 
 ###############################################################################
+# Keystone configuration.
+
+# Whether to enable Keystone.
+kolla_enable_keystone:
+
+# Free form extra configuration to append to Keystone.conf
+kolla_extra_keystone:
+
+##############################################################################
 # Heat configuration.
 
 # Whether to enable Heat.
diff --git a/ansible/roles/kolla-openstack/molecule/enable-everything/molecule.yml b/ansible/roles/kolla-openstack/molecule/enable-everything/molecule.yml
index e36cb7b33b186910fc46fd60d0f0e4ebbb755e61..547745b98085e8da585799fa2d0846b69cff6aa7 100644
--- a/ansible/roles/kolla-openstack/molecule/enable-everything/molecule.yml
+++ b/ansible/roles/kolla-openstack/molecule/enable-everything/molecule.yml
@@ -54,6 +54,10 @@ provisioner:
         kolla_extra_kafka: |
           [extra-kafka.server.properties]
           foo=bar
+        kolla_enable_keystone: true
+        kolla_extra_keystone: |
+          [extra-keystone.conf]
+          foo=bar
         kolla_enable_magnum: true
         kolla_extra_magnum: |
           [extra-magnum.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 a8d224ef7c3828146ad1ab3a7736a2ea7f45c0a4..2766f25259d490e892478a3cca3db2aec0858235 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
@@ -69,6 +69,7 @@ def test_service_config_directory(host, path):
      'ironic.conf',
      'ironic-inspector.conf',
      'kafka.server.properties',
+     'keystone.conf',
      'magnum.conf',
      'manila.conf',
      'neutron/ml2_conf.ini',
diff --git a/ansible/roles/kolla-openstack/tasks/config.yml b/ansible/roles/kolla-openstack/tasks/config.yml
index 374b0660b55358a083c51caa3e8a87d50b2c7e95..324543d4a32c920990bbef5730bb79bdffdd4620 100644
--- a/ansible/roles/kolla-openstack/tasks/config.yml
+++ b/ansible/roles/kolla-openstack/tasks/config.yml
@@ -23,6 +23,7 @@
     - { src: ironic.conf.j2, dest: ironic.conf, enabled: "{{ kolla_enable_ironic }}" }
     - { src: ironic-inspector.conf.j2, dest: ironic-inspector.conf, enabled: "{{ kolla_enable_ironic }}" }
     - { src: kafka.server.properties.j2, dest: kafka.server.properties, enabled: "{{ kolla_enable_kafka }}" }
+    - { src: keystone.conf.j2, dest: keystone.conf, enabled: "{{ kolla_enable_keystone }}" }
     - { src: magnum.conf.j2, dest: magnum.conf, enabled: "{{ kolla_enable_magnum }}" }
     - { src: manila.conf.j2, dest: manila.conf, enabled: "{{ kolla_enable_manila }}" }
     - { src: ml2_conf.ini.j2, dest: neutron/ml2_conf.ini, enabled: "{{ kolla_enable_neutron }}" }
diff --git a/ansible/roles/kolla-openstack/templates/keystone.conf.j2 b/ansible/roles/kolla-openstack/templates/keystone.conf.j2
new file mode 100644
index 0000000000000000000000000000000000000000..753e98bb86e9467d9245d2ab9e39643dca776113
--- /dev/null
+++ b/ansible/roles/kolla-openstack/templates/keystone.conf.j2
@@ -0,0 +1,8 @@
+# {{ ansible_managed }}
+{% if kolla_extra_keystone %}
+#######################
+# Extra configuration
+#######################
+{{ kolla_extra_keystone }}
+{% endif %}
+
diff --git a/doc/source/configuration/kolla-ansible.rst b/doc/source/configuration/kolla-ansible.rst
index d32a8964d3dc93745c82c0b11d73b9ec4afff267..650d39230285fab88aa029a0a72815f396a6eaa5 100644
--- a/doc/source/configuration/kolla-ansible.rst
+++ b/doc/source/configuration/kolla-ansible.rst
@@ -173,6 +173,7 @@ which files are supported.
    ``kafka.server.properties``     Kafka configuration.
    ``kafka/*``                     Extended Kafka configuration.
    ``keepalived/*``                Extended keepalived configuration.
+   ``keystone.conf``               Keystone configuration.
    ``keystone/*``                  Extended keystone configuration.
    ``magnum.conf``                 Magnum configuration.
    ``magnum/*``                    Extended magnum configuration.
diff --git a/etc/kayobe/kolla.yml b/etc/kayobe/kolla.yml
index aa3f4ffe291bc287c2f318449ab05d1520572a3f..9669f0d22a361970e47febf15f32f5ca8a345e09 100644
--- a/etc/kayobe/kolla.yml
+++ b/etc/kayobe/kolla.yml
@@ -195,6 +195,7 @@
 #kolla_enable_ironic_pxe_uefi:
 #kolla_enable_iscsid:
 #kolla_enable_karbor:
+#kolla_enable_keystone:
 #kolla_enable_kuryr:
 #kolla_enable_magnum:
 #kolla_enable_manila:
diff --git a/releasenotes/notes/ignore-unconfigured-nets-93beaf96f43af1ed.yaml b/releasenotes/notes/ignore-unconfigured-nets-93beaf96f43af1ed.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..cfb046da82a96d74e371f89fc2d2a65f700003cf
--- /dev/null
+++ b/releasenotes/notes/ignore-unconfigured-nets-93beaf96f43af1ed.yaml
@@ -0,0 +1,9 @@
+---
+features:
+  - |
+    Adds support for skipping configuration of a network, by setting its name
+    to ``None``.  This is done in ``networks.yml`` as follows::
+
+        admin_oc_net_name:
+  - |
+    Adds support for custom configuration of ``keystone.conf``.