diff --git a/ansible/group_vars/all/kolla b/ansible/group_vars/all/kolla
index 48c044e12..ac2703114 100644
--- a/ansible/group_vars/all/kolla
+++ b/ansible/group_vars/all/kolla
@@ -250,6 +250,10 @@ kolla_overcloud_inventory_kolla_top_level_groups:
 ###############################################################################
 # Kolla-ansible configuration.
 
+# Virtualenv directory where Kolla-ansible's ansible modules will execute
+# remotely on the target nodes. If None, no virtualenv will be used.
+kolla_ansible_target_venv: "{{ virtualenv_path ~ '/kolla-ansible' }}"
+
 # Password to use to encrypt the kolla-ansible passwords.yml file.
 kolla_ansible_vault_password: "{{ lookup('env', 'KAYOBE_VAULT_PASSWORD') | default }}"
 
diff --git a/ansible/roles/kolla-ansible/defaults/main.yml b/ansible/roles/kolla-ansible/defaults/main.yml
index 6d40e4f4a..8aa472f0d 100644
--- a/ansible/roles/kolla-ansible/defaults/main.yml
+++ b/ansible/roles/kolla-ansible/defaults/main.yml
@@ -15,6 +15,10 @@ kolla_ansible_source_version:
 # Virtualenv directory where Kolla-ansible will be installed.
 kolla_ansible_venv: "{{ ansible_env['PWD'] }}/kolla-venv"
 
+# Virtualenv directory where Kolla-ansible's ansible modules will execute
+# remotely on the target nodes. If None, no virtualenv will be used.
+kolla_ansible_target_venv:
+
 # Password to use to encrypt the passwords.yml file.
 kolla_ansible_vault_password:
 
diff --git a/ansible/roles/kolla-ansible/templates/overcloud-top-level.j2 b/ansible/roles/kolla-ansible/templates/overcloud-top-level.j2
index d540371c5..8458f2a3a 100644
--- a/ansible/roles/kolla-ansible/templates/overcloud-top-level.j2
+++ b/ansible/roles/kolla-ansible/templates/overcloud-top-level.j2
@@ -30,6 +30,11 @@
 [overcloud:vars]
 ansible_user=kolla
 ansible_become=true
+{% if kolla_ansible_target_venv is not none %}
+# Execute ansible modules on the remote target hosts using a virtualenv.
+ansible_python_interpreter={{ kolla_ansible_target_venv }}/bin/python
+{% endif %}
+
 
 {% for kolla_group, kolla_group_config in kolla_overcloud_inventory_top_level_group_map.items() %}
 {% if 'groups' in kolla_group_config %}
diff --git a/ansible/roles/kolla-ansible/templates/seed.j2 b/ansible/roles/kolla-ansible/templates/seed.j2
index 2d0e80ab6..20f826694 100644
--- a/ansible/roles/kolla-ansible/templates/seed.j2
+++ b/ansible/roles/kolla-ansible/templates/seed.j2
@@ -7,6 +7,10 @@
 
 [seed:vars]
 ansible_user=kolla
+{% if kolla_ansible_target_venv is not none %}
+# Execute ansible modules on the remote target hosts using a virtualenv.
+ansible_python_interpreter={{ kolla_ansible_target_venv }}/bin/python
+{% endif %}
 
 [baremetal:children]
 seed
diff --git a/etc/kayobe/kolla.yml b/etc/kayobe/kolla.yml
index c27a199d4..ed3baeb09 100644
--- a/etc/kayobe/kolla.yml
+++ b/etc/kayobe/kolla.yml
@@ -131,6 +131,10 @@
 ###############################################################################
 # Kolla-ansible configuration.
 
+# Virtualenv directory where Kolla-ansible's ansible modules will execute
+# remotely on the target nodes. If None, no virtualenv will be used.
+#kolla_ansible_target_venv:
+
 # Whether TLS is enabled for the external API endpoints.
 #kolla_enable_tls_external: