diff --git a/ansible/group_vars/all/kolla b/ansible/group_vars/all/kolla
index 7df5f0426a0626531d84d792518426b6c2c0dfca..bd2652c2cd9b444f67addd27beb362653c2db2a1 100644
--- a/ansible/group_vars/all/kolla
+++ b/ansible/group_vars/all/kolla
@@ -550,6 +550,27 @@ kolla_ansible_default_custom_passwords:
 # passwords file.
 kolla_ansible_custom_passwords: "{{ kolla_ansible_default_custom_passwords }}"
 
+###############################################################################
+# OpenStack API addresses.
+
+# Virtual IP address of OpenStack internal API. Default is the vip_address
+# attribute of the internal network.
+kolla_internal_vip_address: "{{ internal_net_name | net_vip_address }}"
+
+# Fully Qualified Domain Name (FQDN) of OpenStack internal API. Default is the
+# fqdn attribute of the internal network if set, otherwise
+# kolla_internal_vip_address.
+kolla_internal_fqdn: "{{ internal_net_name | net_fqdn or kolla_internal_vip_address }}"
+
+# Virtual IP address of OpenStack external API. Default is the vip_address
+# attribute of the external network.
+kolla_external_vip_address: "{{ public_net_name | net_vip_address }}"
+
+# Fully Qualified Domain Name (FQDN) of OpenStack external API. Default is the
+# fqdn attribute of the external network if set, otherwise
+# kolla_external_vip_address.
+kolla_external_fqdn: "{{ public_net_name | net_fqdn or kolla_external_vip_address }}"
+
 ###############################################################################
 # TLS certificate bundle management
 
diff --git a/ansible/kolla-ansible.yml b/ansible/kolla-ansible.yml
index ae04fcf8c7c2f2819b8ea5ad2049219f5fd88f20..fa182b5aebbb9632b681800b8806326ff11ca6f5 100644
--- a/ansible/kolla-ansible.yml
+++ b/ansible/kolla-ansible.yml
@@ -27,12 +27,6 @@
   tags:
     - kolla-ansible
   gather_facts: false
-  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
-    # this point these groups have no hosts in, and we should handle that case
-    # gracefully.
-    network_host: "{{ groups['network'][0] }}"
   pre_tasks:
     # Configuration of extra user-provided Kolla globals.
     - block:
@@ -52,46 +46,29 @@
         - config
 
     # Configuration and validation of network host networking.
-    - block:
-        - name: Set facts containing the VIP addresses and FQDNs
-          set_fact:
-            kolla_internal_vip_address: "{{ internal_net_name | net_vip_address }}"
-            kolla_internal_fqdn: "{{ internal_net_name | net_fqdn or internal_net_name | net_vip_address }}"
-            kolla_external_vip_address: "{{ public_net_name | net_vip_address }}"
-            kolla_external_fqdn: "{{ public_net_name | net_fqdn or public_net_name | net_vip_address }}"
-          when: kolla_enable_haproxy | bool
-
-        - name: Set facts containing the VIP addresses and FQDNs
-          set_fact:
-            kolla_internal_vip_address: "{{ internal_net_name | net_ip(network_host) }}"
-            kolla_internal_fqdn: "{{ internal_net_name | net_ip(network_host) }}"
-            kolla_external_vip_address: "{{ public_net_name | net_ip(network_host) }}"
-            kolla_external_fqdn: "{{ public_net_name | net_ip(network_host) }}"
-          when: not kolla_enable_haproxy | bool
-
-        - name: Validate Kolla Ansible API address configuration
-          fail:
-            msg: >
-              The Kolla Ansible variable {{ item.var_name }}
-              ({{ item.description }}) is invalid. Value:
-              "{{ hostvars[inventory_hostname][item.var_name] | default('<undefined>') }}".
-          when:
-            - item.required | bool
-            - hostvars[inventory_hostname][item.var_name] is not defined or not hostvars[inventory_hostname][item.var_name]
-          with_items:
-            - var_name: "kolla_internal_vip_address"
-              description: "Internal API VIP address"
-              required: True
-            - var_name: "kolla_internal_fqdn"
-              description: "Internal API Fully Qualified Domain Name (FQDN)"
-              required: True
-            - var_name: "kolla_external_vip_address"
-              description: "external API VIP address"
-              required: True
-            - var_name: "kolla_external_fqdn"
-              description: "External API Fully Qualified Domain Name (FQDN)"
-              required: True
-      when: groups['network'] | length > 0
+    - name: Validate Kolla Ansible API address configuration
+      fail:
+        msg: >
+          The Kolla Ansible variable {{ item.var_name }}
+          ({{ item.description }}) is invalid. Value:
+          "{{ hostvars[inventory_hostname][item.var_name] | default('<undefined>') }}".
+      when:
+        - groups['network'] | length > 0
+        - item.required | bool
+        - hostvars[inventory_hostname][item.var_name] is not defined or not hostvars[inventory_hostname][item.var_name]
+      with_items:
+        - var_name: "kolla_internal_vip_address"
+          description: "Internal API VIP address"
+          required: True
+        - var_name: "kolla_internal_fqdn"
+          description: "Internal API Fully Qualified Domain Name (FQDN)"
+          required: True
+        - var_name: "kolla_external_vip_address"
+          description: "external API VIP address"
+          required: True
+        - var_name: "kolla_external_fqdn"
+          description: "External API Fully Qualified Domain Name (FQDN)"
+          required: True
       tags:
         - config
         - config-validation
diff --git a/ansible/overcloud-grafana-configure.yml b/ansible/overcloud-grafana-configure.yml
index 7fd18a16dbade69f71084feae00406152e291779..7ae5c902612c719170dab3be7146ef432035da6f 100644
--- a/ansible/overcloud-grafana-configure.yml
+++ b/ansible/overcloud-grafana-configure.yml
@@ -59,16 +59,6 @@
   tags:
     - grafana
   pre_tasks:
-    - name: Set fact for the VIP address
-      set_fact:
-        kolla_internal_vip_address: "{{ internal_net_name | net_vip_address }}"
-      when: kolla_enable_haproxy | bool
-
-    - name: Set fact for the VIP address
-      set_fact:
-        kolla_internal_vip_address: "{{ internal_net_name | net_ip }}"
-      when: not kolla_enable_haproxy | bool
-
     - name: Include Kolla passwords for Grafana local admin account credentials
       include_vars: "{{ kayobe_config_path }}/kolla/passwords.yml"
   roles:
diff --git a/ansible/public-openrc.yml b/ansible/public-openrc.yml
index 4367773a0458197221df86fd9fd04ead4e5bd795..d81d1300bb713c93ce5e9394a554ed74ab9232bc 100644
--- a/ansible/public-openrc.yml
+++ b/ansible/public-openrc.yml
@@ -8,7 +8,7 @@
     - public-openrc
   vars:
     public_api_proto: "{% if kolla_enable_tls_external | bool %}https{% else %}http{% endif %}"
-    public_api_host: "{{ public_net_name | net_fqdn or public_net_name | net_vip_address }}"
+    public_api_host: "{{ kolla_external_fqdn }}"
     public_api_keystone_port: 5000
   roles:
     - role: public-openrc
diff --git a/doc/source/configuration/reference/kolla-ansible.rst b/doc/source/configuration/reference/kolla-ansible.rst
index a5d11a9338b009caa2c531f06845913e20d771ef..17251ada69e4b4e6db6974cb38963978255541bf 100644
--- a/doc/source/configuration/reference/kolla-ansible.rst
+++ b/doc/source/configuration/reference/kolla-ansible.rst
@@ -225,6 +225,32 @@ OpenStack services. This is not usually advisable in production.
    ---
    kolla_openstack_logging_debug: true
 
+API Addresses
+-------------
+
+.. note::
+
+   These variables should be used over the deprecated ``vip_address`` and
+   ``fqdn`` `network attributes <configuration-network-global>`
+
+The following variables affect the addresses used for the external and internal
+API.
+
+``kolla_internal_vip_address``
+    Virtual IP address of OpenStack internal API. Default is the
+    ``vip_address`` attribute of the internal network.
+``kolla_internal_fqdn``
+    Fully Qualified Domain Name (FQDN) of OpenStack internal API. Default is
+    the ``fqdn`` attribute of the internal network if set, otherwise
+    ``kolla_internal_vip_address``.
+``kolla_external_vip_address``
+    Virtual IP address of OpenStack external API. Default is the
+    ``vip_address`` attribute of the external network.
+``kolla_external_fqdn``
+    Fully Qualified Domain Name (FQDN) of OpenStack external API. Default is
+    the ``fqdn`` attribute of the external network if set, otherwise
+    ``kolla_external_vip_address``.
+
 TLS Encryption of APIs
 ----------------------
 
diff --git a/doc/source/configuration/reference/network.rst b/doc/source/configuration/reference/network.rst
index 426690d1b18d3e4598326619815d344ef1834cde..34532570ba11beea383cde22b8d83cb0318661db 100644
--- a/doc/source/configuration/reference/network.rst
+++ b/doc/source/configuration/reference/network.rst
@@ -10,6 +10,8 @@ that define the network's attributes.  For example, to configure the ``cidr``
 attribute of a network named ``arpanet``, we would use a variable named
 ``arpanet_cidr``.
 
+.. _configuration-network-global:
+
 Global Network Configuration
 ============================
 
@@ -42,8 +44,18 @@ supported:
 ``mtu``
     Maximum Transmission Unit (MTU).
 ``vip_address``
+    .. note::
+
+       Use of the ``vip_address`` attribute is deprecated. Instead use
+       ``kolla_internal_vip_address`` and ``kolla_external_vip_address``.
+
     Virtual IP address (VIP) used by API services on this network.
 ``fqdn``
+    .. note::
+
+       Use of the ``fqdn`` attribute is deprecated. Instead use
+       ``kolla_internal_fqdn`` and ``kolla_external_fqdn``.
+
     Fully Qualified Domain Name (FQDN) used by API services on this network.
 ``routes``
     List of static IP routes. Each item should be a dict containing the
diff --git a/etc/kayobe/kolla.yml b/etc/kayobe/kolla.yml
index f8f0a482cc946cc0f638c3b62dce7e757d815337..7e6da27def74760e181171a24b41f8bffd9a921a 100644
--- a/etc/kayobe/kolla.yml
+++ b/etc/kayobe/kolla.yml
@@ -345,6 +345,27 @@
 # passwords file.
 #kolla_ansible_custom_passwords:
 
+###############################################################################
+# OpenStack API addresses.
+
+# Virtual IP address of OpenStack internal API. Default is the vip_address
+# attribute of the internal network.
+#kolla_internal_vip_address:
+
+# Fully Qualified Domain Name (FQDN) of OpenStack internal API. Default is the
+# fqdn attribute of the internal network if set, otherwise
+# kolla_internal_vip_address.
+#kolla_internal_fqdn:
+
+# Virtual IP address of OpenStack external API. Default is the vip_address
+# attribute of the external network.
+#kolla_external_vip_address:
+
+# Fully Qualified Domain Name (FQDN) of OpenStack external API. Default is the
+# fqdn attribute of the external network if set, otherwise
+# kolla_external_vip_address.
+#kolla_external_fqdn:
+
 ###############################################################################
 # TLS certificate bundle management
 
diff --git a/releasenotes/notes/add-vip-fqdn-variables-a6202664c2b6eb01.yaml b/releasenotes/notes/add-vip-fqdn-variables-a6202664c2b6eb01.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..a172f8ab0686def703e0a4d2689d11e31ec7d81f
--- /dev/null
+++ b/releasenotes/notes/add-vip-fqdn-variables-a6202664c2b6eb01.yaml
@@ -0,0 +1,22 @@
+---
+features:
+  - |
+    Adds the following new variables for the Kolla Ansible API VIP address and
+    FQDNs:
+
+    * ``kolla_internal_vip_address``
+    * ``kolla_internal_fqdn``
+    * ``kolla_external_vip_address``
+    * ``kolla_external_fqdn``
+
+    These variables should be used in preference to the ``vip_address`` and
+    ``fqdn`` network attributes which are deprecated.
+deprecations:
+  - |
+    The ``vip_address`` and ``fqdn`` network attributes are deprecated in
+    favour of the following variables:
+
+    * ``kolla_internal_vip_address``
+    * ``kolla_internal_fqdn``
+    * ``kolla_external_vip_address``
+    * ``kolla_external_fqdn``