diff --git a/dev/tenks-deploy-config-compute.yml b/dev/tenks-deploy-config-compute.yml
index c4008377b454c3468d7c216e2a2edad7e6982f32..0f859ccd9aa074d9caefc16c62fda7c7ee84e972 100644
--- a/dev/tenks-deploy-config-compute.yml
+++ b/dev/tenks-deploy-config-compute.yml
@@ -34,6 +34,8 @@ physnet_mappings:
 deploy_kernel: ipa.kernel
 deploy_ramdisk: ipa.initramfs
 
+default_boot_mode: "bios"
+
 # Use the libvirt daemon deployed by Kolla Ansible in the nova_libvirt
 # container. Tenks will install libvirt client packages.
 libvirt_host_install_daemon: false
diff --git a/dev/tenks-deploy-config-overcloud.yml b/dev/tenks-deploy-config-overcloud.yml
index 7d54961db3b129122583b83a4e7d359aa78dc000..521f7d03a29a13f9a9bc5ffd0cf8f8c5e0ea837e 100644
--- a/dev/tenks-deploy-config-overcloud.yml
+++ b/dev/tenks-deploy-config-overcloud.yml
@@ -34,6 +34,8 @@ physnet_mappings:
 
 bridge_type: linuxbridge
 
+default_boot_mode: "bios"
+
 # No placement service.
 wait_for_placement: false
 
diff --git a/playbooks/kayobe-overcloud-base/overrides.yml.j2 b/playbooks/kayobe-overcloud-base/overrides.yml.j2
index 1980c2bdbfd255a918cea01c0897527a1d21ab57..ba970bc50da457963369e563e512afe826cf46df 100644
--- a/playbooks/kayobe-overcloud-base/overrides.yml.j2
+++ b/playbooks/kayobe-overcloud-base/overrides.yml.j2
@@ -33,6 +33,13 @@ aio_bridge_ports:
 # Enable ironic for testing baremetal compute.
 kolla_enable_ironic: true
 
+{% if ironic_boot_mode == 'uefi' %}
+# iPXE is currently required for UEFI boot mode in Kolla Ansible.
+kolla_enable_ironic_ipxe: true
+kolla_ironic_enabled_boot_interfaces: [ipxe]
+kolla_ironic_default_boot_interface: ipxe
+{% endif %}
+
 {% if tls_enabled %}
 kolla_enable_tls_external: "yes"
 kolla_enable_tls_internal: "yes"
diff --git a/playbooks/kayobe-overcloud-base/pre.yml b/playbooks/kayobe-overcloud-base/pre.yml
index 2694c7583a2ec81ccaaab0df8d85d757ec5bdc41..f696974bafc3b69c1de15b38fea80ce0dc6fab47 100644
--- a/playbooks/kayobe-overcloud-base/pre.yml
+++ b/playbooks/kayobe-overcloud-base/pre.yml
@@ -25,6 +25,13 @@
         src: globals.yml.j2
         dest: "{{ kayobe_config_src_dir }}/etc/kayobe/kolla/globals.yml"
 
+    - name: Configure Tenks to use UEFI boot mode
+      replace:
+        path: "{{ kayobe_src_dir }}/dev/tenks-deploy-config-compute.yml"
+        regexp: '^default_boot_mode: .*$'
+        replace: 'default_boot_mode: "uefi"'
+      when: ironic_boot_mode == 'uefi'
+
     - name: Ensure kayobe is installed
       shell:
         cmd: dev/install.sh &> {{ logs_dir }}/ansible/install
diff --git a/zuul.d/jobs.yaml b/zuul.d/jobs.yaml
index 426a763f63ee5f13e12f688a49d6d92e84ceb489..61905ed5ab470cef1e49c1f623f00c8a81342609 100644
--- a/zuul.d/jobs.yaml
+++ b/zuul.d/jobs.yaml
@@ -83,6 +83,7 @@
       tenks_src_dir: "{{ ansible_env.PWD ~ '/' ~ zuul.projects['opendev.org/openstack/tenks'].src_dir }}"
       is_upgrade: "{{ 'upgrade' in zuul.job }}"
       tls_enabled: false
+      ironic_boot_mode: "bios"
 
 - job:
     name: kayobe-overcloud-base
@@ -110,6 +111,7 @@
     parent: kayobe-overcloud-base
     vars:
       tls_enabled: true
+      ironic_boot_mode: "uefi"
 
 - job:
     name: kayobe-overcloud-tls-centos8s