diff --git a/ansible/inventory/group_vars/all/pip b/ansible/inventory/group_vars/all/pip
index 42444c091caaf5e0f170f97a229a249f41f32d16..db26659872939a8b332b3a6d88d7201b96af681c 100644
--- a/ansible/inventory/group_vars/all/pip
+++ b/ansible/inventory/group_vars/all/pip
@@ -3,4 +3,4 @@
 pip_upper_constraints_file: "https://releases.openstack.org/constraints/upper/{{ openstack_release }}"
 
 # Upper constraints file for installation of openstacksdk.
-openstacksdk_upper_constraints_file: "https://releases.openstack.org/constraints/upper/yoga"
\ No newline at end of file
+openstacksdk_upper_constraints_file: "https://releases.openstack.org/constraints/upper/{{ openstack_release }}"
diff --git a/ansible/provision-net.yml b/ansible/provision-net.yml
index e5045f7e84af1c3bb31747baa1a8d10eadfadaeb..823c09c10f4813b5838f436c74fc816d49f4642a 100644
--- a/ansible/provision-net.yml
+++ b/ansible/provision-net.yml
@@ -27,7 +27,7 @@
       subnets:
         - name: "{{ kolla_ironic_provisioning_network }}"
           cidr: "{{ provision_wl_net_name | net_cidr }}"
-          gateway_ip: "{{ provision_wl_net_name | net_neutron_gateway or provision_wl_net_name | net_gateway }}"
+          gateway_ip: "{{ provision_wl_net_name | net_neutron_gateway or provision_wl_net_name | net_gateway | default(omit, True) }}"
           allocation_pool_start: "{{ provision_wl_net_name | net_neutron_allocation_pool_start }}"
           allocation_pool_end: "{{ provision_wl_net_name | net_neutron_allocation_pool_end }}"
     cleaning_net:
@@ -41,7 +41,7 @@
       subnets:
         - name: "{{ kolla_ironic_cleaning_network }}"
           cidr: "{{ cleaning_net_name | net_cidr }}"
-          gateway_ip: "{{ cleaning_net_name | net_neutron_gateway or cleaning_net_name | net_gateway }}"
+          gateway_ip: "{{ cleaning_net_name | net_neutron_gateway or cleaning_net_name | net_gateway | default(omit, True) }}"
           allocation_pool_start: "{{ cleaning_net_name | net_neutron_allocation_pool_start }}"
           allocation_pool_end: "{{ cleaning_net_name | net_neutron_allocation_pool_end }}"
     network_registrations: "{{ [provision_net] + ([] if cleaning_net_name == provision_wl_net_name else [cleaning_net]) }}"
diff --git a/ansible/roles/ipa-images/tasks/main.yml b/ansible/roles/ipa-images/tasks/main.yml
index d47ac7156e0b18c920aa09110347128755074050..0efaa14c0472fd549e361865815a4e92faf02faa 100644
--- a/ansible/roles/ipa-images/tasks/main.yml
+++ b/ansible/roles/ipa-images/tasks/main.yml
@@ -62,7 +62,7 @@
 
 - block:
     - name: Gather facts about Ironic Python Agent (IPA) kernel image
-      os_image_info:
+      openstack.cloud.image_info:
         auth_type: "{{ ipa_images_openstack_auth_type }}"
         auth: "{{ ipa_images_openstack_auth }}"
         cacert: "{{ ipa_images_openstack_cacert | default(omit, true) }}"
@@ -71,7 +71,7 @@
       register: ipa_images_kernel
 
     - name: Gather facts about Ironic Python Agent (IPA) ramdisk image
-      os_image_info:
+      openstack.cloud.image_info:
         auth_type: "{{ ipa_images_openstack_auth_type }}"
         auth: "{{ ipa_images_openstack_auth }}"
         cacert: "{{ ipa_images_openstack_cacert | default(omit, true) }}"
@@ -101,7 +101,7 @@
       environment: "{{ ipa_images_openstack_auth_env }}"
 
     - name: Ensure Ironic Python Agent (IPA) images are registered with Glance
-      os_image:
+      openstack.cloud.image:
         auth_type: "{{ ipa_images_openstack_auth_type }}"
         auth: "{{ ipa_images_openstack_auth }}"
         cacert: "{{ ipa_images_openstack_cacert | default(omit, true) }}"
diff --git a/ansible/roles/ipa-images/tasks/set-driver-info.yml b/ansible/roles/ipa-images/tasks/set-driver-info.yml
index c35fd4ff4d97bb5d2542a65b97813ce9d74e020b..f6d9378323d3e8bed991eb87ac9eb86176ea29ef 100644
--- a/ansible/roles/ipa-images/tasks/set-driver-info.yml
+++ b/ansible/roles/ipa-images/tasks/set-driver-info.yml
@@ -1,7 +1,7 @@
 ---
 
 - name: Retrieve deployment image uuids
-  os_image_info:
+  openstack.cloud.image_info:
     auth_type: "{{ ipa_images_openstack_auth_type }}"
     auth: "{{ ipa_images_openstack_auth }}"
     cacert: "{{ ipa_images_openstack_cacert | default(omit, true) }}"
@@ -14,11 +14,11 @@
 
 - name: Set fact containing kernel uuid
   set_fact:
-    ipa_images_kernel_uuid: "{{ ipa_images_glance.results[0].openstack_images[0].id }}"
+    ipa_images_kernel_uuid: "{{ ipa_images_glance.results[0].images[0].id }}"
 
 - name: Set fact containing ramdisk uuid
   set_fact:
-    ipa_images_ramdisk_uuid: "{{ ipa_images_glance.results[1].openstack_images[0].id }}"
+    ipa_images_ramdisk_uuid: "{{ ipa_images_glance.results[1].images[0].id }}"
 
 - name: Get a list of ironic nodes
   command: |
diff --git a/ansible/roles/ironic-inspector-rules/library/os_ironic_inspector_rule.py b/ansible/roles/ironic-inspector-rules/library/os_ironic_inspector_rule.py
index a8a95efd1a6ee976c175735b851ef0b9d18c5598..5db8f8088b7478ac96b9be601c03bf53d8d755d1 100644
--- a/ansible/roles/ironic-inspector-rules/library/os_ironic_inspector_rule.py
+++ b/ansible/roles/ironic-inspector-rules/library/os_ironic_inspector_rule.py
@@ -15,7 +15,7 @@
 import copy
 
 from ansible.module_utils.basic import *
-from ansible.module_utils.openstack import *
+from ansible_collections.openstack.cloud.plugins.module_utils.openstack import *
 
 # Store a list of import errors to report to the user.
 IMPORT_ERRORS = []
diff --git a/ansible/roles/kolla-ansible/defaults/main.yml b/ansible/roles/kolla-ansible/defaults/main.yml
index 3d26fa0d30de69edac5b6df0ce181bcdc32ce2e2..d83d98aa8122c0c33400d3464a08cd29aa3f7f0e 100644
--- a/ansible/roles/kolla-ansible/defaults/main.yml
+++ b/ansible/roles/kolla-ansible/defaults/main.yml
@@ -24,8 +24,8 @@ kolla_ansible_venv_extra_requirements: []
 # Pip requirement specifier for the ansible package. NOTE: This limits the
 # version of ansible used by kolla-ansible to avoid new releases from breaking
 # tested code. Changes to this limit should be tested.
-kolla_ansible_venv_ansible: 'ansible>=6,<8.0'
-kolla_ansible_venv_ansible_core: 'ansible-core>=2.13,<=2.14.2'
+kolla_ansible_venv_ansible: 'ansible>=7,<9.0'
+kolla_ansible_venv_ansible_core: 'ansible-core>=2.14,<2.16'
 
 # Path to a requirements.yml file for Ansible collections.
 kolla_ansible_requirements_yml: "{{ kolla_ansible_venv }}/share/kolla-ansible/requirements.yml"
diff --git a/molecule-requirements.txt b/molecule-requirements.txt
index 01a4b0df9ee18fce453d6efdc933d3b8f817278a..794a7bf575bbb21911edcd1cfc80e39d19945304 100644
--- a/molecule-requirements.txt
+++ b/molecule-requirements.txt
@@ -3,10 +3,10 @@
 # process, which may cause wedges in the gate later.
 
 ansible-lint>=3.0.0,<6.0.0,!=4.3.0 # MIT
-ansible-compat<4 # MIT
+ansible-compat # MIT
 docker # Apache-2.0
-molecule<4.1.0 # MIT
-molecule-docker # MIT
+molecule # MIT
+molecule-plugins[docker] # MIT
 pytest-metadata # MPL
 pytest-molecule # MIT
 pytest-testinfra
diff --git a/releasenotes/notes/ansible-bump-7-8-b8245f34bf436736.yaml b/releasenotes/notes/ansible-bump-7-8-b8245f34bf436736.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..233e6213d4a2f655f464a23e49826b50fe2a60e8
--- /dev/null
+++ b/releasenotes/notes/ansible-bump-7-8-b8245f34bf436736.yaml
@@ -0,0 +1,6 @@
+---
+upgrade:
+  - |
+    Updates the maximum supported version of Ansible from 7.x (ansible-core
+    2.14) to 8.x (ansible-core 2.15). The minimum supported version is updated
+    from 6.x to 7.x. This is true for both Kayobe and Kolla Ansible.
diff --git a/requirements.txt b/requirements.txt
index 8f453aa4d21d6704474a78970930f534f65e4191..dcf8a668ab7fb70e52d04598ce8fd79456519c81 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,6 +1,6 @@
 pbr>=2.0 # Apache-2.0
 Jinja2>3 # BSD
-ansible>=6,<8.0 # GPLv3
+ansible>=7,<9.0 # GPLv3
 cliff>=3.1.0 # Apache
 netaddr!=0.7.16,>=0.7.13 # BSD
 PyYAML>=3.10.0 # MIT
diff --git a/requirements.yml b/requirements.yml
index a16cd50fbe31b7656da7fa9ef19e569c195ad74e..cb022249fe077075f48ba22be0ebdc95abe53b83 100644
--- a/requirements.yml
+++ b/requirements.yml
@@ -5,12 +5,14 @@ collections:
     version: master
   - name: dellemc.os10
     version: 1.1.1
+  - name: openstack.cloud
+    version: '<3'
 
 roles:
   - src: ahuffman.resolv
     version: 1.3.1
   - src: stackhpc.systemd_networkd
-    version: v1.0.1
+    version: v1.0.5
   - src: giovtorres.tuned
     version: 1.1.0
   - src: jriguera.configdrive
@@ -27,7 +29,7 @@ roles:
   - src: singleplatform-eng.users
     version: v1.2.5
   - src: stackhpc.dell-powerconnect-switch
-    version: v1.1.0
+    version: v1.2.1
   - src: stackhpc.drac
     version: 1.1.6
   - src: stackhpc.drac-facts
@@ -41,7 +43,7 @@ roles:
   - src: stackhpc.luks
     version: 0.4.2
   - src: stackhpc.mellanox-switch
-    version: v1.0.0
+    version: v1.0.1
   - src: stackhpc.os-images
     version: v1.16.0
   - src: stackhpc.os-ironic-state