diff --git a/ansible/roles/kolla-ansible/defaults/main.yml b/ansible/roles/kolla-ansible/defaults/main.yml
index f50afd5a2f660df277645c9fbc55755a49d54ee2..af5d1d24a2b9859d93376e1374309a33fcf99e2e 100644
--- a/ansible/roles/kolla-ansible/defaults/main.yml
+++ b/ansible/roles/kolla-ansible/defaults/main.yml
@@ -23,6 +23,9 @@ kolla_ansible_venv_python: "python{{ kolla_ansible_venv_python_major_version }}"
 # FIXME(mgoddard): Use ansible_python when Kayobe supports Python 3.
 kolla_ansible_venv_python_major_version: 3
 
+# Extra requirements to install inside the kolla-ansible virtualenv.
+kolla_ansible_venv_extra_requirements: []
+
 # 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:
diff --git a/ansible/roles/kolla-ansible/tasks/install.yml b/ansible/roles/kolla-ansible/tasks/install.yml
index 24def5d0243a4b61598c9d1041cb4f22e9c65ef2..64b225f4ee6fc34d782e61ff3a2124854d6c23a0 100644
--- a/ansible/roles/kolla-ansible/tasks/install.yml
+++ b/ansible/roles/kolla-ansible/tasks/install.yml
@@ -69,14 +69,26 @@
   with_items:
     - { name: pip }
 
-- name: Ensure python requirements file exists
-  template:
-    src: requirements.txt.j2
-    dest: "{{ kolla_ansible_venv }}/requirements.txt"
-
 - name: Ensure required Python packages are installed
+  vars:
+    kolla_ansible_packages:
+      # Install Kolla Ansible from source or PyPI.
+      - >-
+        {% if kolla_ansible_ctl_install_type == 'source' %}
+        {{ kolla_ansible_source_path }}
+        {% else %}
+        kolla-ansible=={{ kolla_openstack_release }}
+        {% endif %}
+      # Limit the version of ansible used by kolla-ansible to avoid new
+      # releases from breaking tested code. Changes to this limit should be
+      # tested.
+      - ansible>=2.8,<2.10,!=2.8.9
+      - >-
+        {%- if ansible_os_family == 'RedHat' and ansible_distribution_major_version | int >= 8 %}
+        selinux
+        {% endif -%}
   pip:
-    requirements: "{{ kolla_ansible_venv }}/requirements.txt"
+    name: "{{ (kolla_ansible_packages + kolla_ansible_venv_extra_requirements) | select | list }}"
     state: latest
     extra_args: "{% if kolla_upper_constraints_file %}-c {{ kolla_upper_constraints_file }}{% endif %}"
     virtualenv: "{{ kolla_ansible_venv }}"
diff --git a/ansible/roles/kolla-ansible/templates/requirements.txt.j2 b/ansible/roles/kolla-ansible/templates/requirements.txt.j2
deleted file mode 100644
index 1917f05560d358bb1cc25fd92ffacd8a492bddd4..0000000000000000000000000000000000000000
--- a/ansible/roles/kolla-ansible/templates/requirements.txt.j2
+++ /dev/null
@@ -1,18 +0,0 @@
-{% if kolla_ansible_ctl_install_type == 'source' %}
-# Install Kolla Ansible from source.
-{{ kolla_ansible_source_path }}
-{% else %}
-# Install Kolla Ansible from PyPI.
-kolla-ansible=={{ kolla_openstack_release }}
-{% endif %}
-# Limit the version of ansible used by kolla-ansible to avoid new releases from
-# breaking tested code. Changes to this limit should be tested.
-ansible>=2.8,<2.10,!=2.8.9
-{% if ansible_os_family == 'RedHat' and ansible_distribution_major_version | int >= 8 %}
-selinux
-{% endif %}
-{% if kolla_ansible_venv_extra_requirements is defined %}
-{% for item in kolla_ansible_venv_extra_requirements %}
-{{ item }}
-{% endfor %}
-{% endif %}