diff --git a/ansible/roles/kolla-openstack/defaults/main.yml b/ansible/roles/kolla-openstack/defaults/main.yml
index 677d3ed96..284b189b2 100644
--- a/ansible/roles/kolla-openstack/defaults/main.yml
+++ b/ansible/roles/kolla-openstack/defaults/main.yml
@@ -189,6 +189,9 @@ kolla_ironic_pxe_append_params: []
 # Free form extra configuration to append to ironic.conf.
 kolla_extra_ironic:
 
+# Enable iPXE support in Ironic
+kolla_enable_ironic_ipxe:
+
 ###############################################################################
 # Ironic inspector configuration.
 
diff --git a/ansible/roles/kolla-openstack/tasks/config.yml b/ansible/roles/kolla-openstack/tasks/config.yml
index f53c02498..ec47ecc56 100644
--- a/ansible/roles/kolla-openstack/tasks/config.yml
+++ b/ansible/roles/kolla-openstack/tasks/config.yml
@@ -31,6 +31,7 @@
     - { src: neutron.conf.j2, dest: neutron.conf, enabled: "{{ kolla_enable_neutron }}" }
     - { src: nova.conf.j2, dest: nova.conf, enabled: "{{ kolla_enable_nova }}" }
     - { src: pxelinux.default.j2, dest: ironic/pxelinux.default, enabled: "{{ kolla_enable_ironic }}" }
+    - { src: inspector.ipxe.j2, dest: ironic/inspector.ipxe, enabled: "{{ kolla_enable_ironic_ipxe }}" }
     - { src: sahara.conf.j2, dest: sahara.conf, enabled: "{{ kolla_enable_sahara }}" }
     - { src: zookeeper.cfg.j2, dest: zookeeper.cfg, enabled: "{{ kolla_enable_zookeeper }}" }
   when: item.enabled | bool
diff --git a/ansible/roles/kolla-openstack/templates/inspector.ipxe.j2 b/ansible/roles/kolla-openstack/templates/inspector.ipxe.j2
new file mode 100644
index 000000000..adfb21064
--- /dev/null
+++ b/ansible/roles/kolla-openstack/templates/inspector.ipxe.j2
@@ -0,0 +1,10 @@
+#!ipxe
+
+:retry_dhcp
+dhcp || goto retry_dhcp
+
+:retry_boot
+imgfree
+kernel --timeout 30000 {% raw %}{{ ironic_ipxe_url }}/ironic-agent.kernel{% endraw %} ipa-inspection-callback-url={% raw %}http://{{ kolla_internal_vip_address }}:{{ ironic_inspector_port }}/v1/continue{% endraw %} systemd.journald.forward_to_console=yes {{ kolla_inspector_extra_kernel_options | join(' ') }} {% raw %}BOOTIF=${mac}{% endraw %} || goto retry_boot
+initrd --timeout 30000 {% raw %}{{ ironic_ipxe_url }}/ironic-agent.initramfs{% endraw %} || goto retry_boot
+boot
diff --git a/ansible/roles/kolla-openstack/vars/main.yml b/ansible/roles/kolla-openstack/vars/main.yml
index c9bc44795..b9e1861b2 100644
--- a/ansible/roles/kolla-openstack/vars/main.yml
+++ b/ansible/roles/kolla-openstack/vars/main.yml
@@ -70,6 +70,7 @@ kolla_openstack_custom_config:
       - ironic-agent.kernel
       - ironic-dnsmasq.conf
       - pxelinux.default
+      - inspector.ipxe
   # Kafka.
   - src: "{{ kolla_extra_config_path }}/kafka"
     dest: "{{ kolla_node_custom_config_path }}/kafka"
diff --git a/releasenotes/notes/fix-inspection-when-using-ipxe-9bf6ed9e6456840b.yaml b/releasenotes/notes/fix-inspection-when-using-ipxe-9bf6ed9e6456840b.yaml
new file mode 100644
index 000000000..d27634fd3
--- /dev/null
+++ b/releasenotes/notes/fix-inspection-when-using-ipxe-9bf6ed9e6456840b.yaml
@@ -0,0 +1,9 @@
+---
+fixes:
+  - |
+    Fixes an issue with introspection data not being collected
+    when iPXE was enabled. This meant that certain
+    introspection rules were not being applied. Notably, the
+    local_link_connection field would not be updated on the
+    ironic ports.
+