diff --git a/diskimage_builder/elements/ensure-venv/README.rst b/diskimage_builder/elements/ensure-venv/README.rst
new file mode 100644
index 000000000..d9a521130
--- /dev/null
+++ b/diskimage_builder/elements/ensure-venv/README.rst
@@ -0,0 +1,5 @@
+===========
+ensure-venv
+===========
+
+A simple element to make sure `python3 -m venv` will work.
diff --git a/diskimage_builder/elements/ensure-venv/element-deps b/diskimage_builder/elements/ensure-venv/element-deps
new file mode 100644
index 000000000..7076aba94
--- /dev/null
+++ b/diskimage_builder/elements/ensure-venv/element-deps
@@ -0,0 +1 @@
+package-installs
diff --git a/diskimage_builder/elements/ensure-venv/package-installs.yaml b/diskimage_builder/elements/ensure-venv/package-installs.yaml
new file mode 100644
index 000000000..78b2e8855
--- /dev/null
+++ b/diskimage_builder/elements/ensure-venv/package-installs.yaml
@@ -0,0 +1 @@
+python3-venv:
diff --git a/diskimage_builder/elements/ensure-venv/pkg-map b/diskimage_builder/elements/ensure-venv/pkg-map
new file mode 100644
index 000000000..0056fefac
--- /dev/null
+++ b/diskimage_builder/elements/ensure-venv/pkg-map
@@ -0,0 +1,19 @@
+{
+  "family": {
+    "debian": {
+      "python3-venv": "python3-venv"
+    },
+    "gentoo": {
+      "python3-venv": "dev-lang/python"
+    },
+    "redhat": {
+      "python3-venv": "python3"
+    },
+    "suse": {
+      "python3-venv": "python3"
+    }
+  },
+  "default": {
+    "python3-venv": ""
+  }
+}
diff --git a/diskimage_builder/elements/simple-init/element-deps b/diskimage_builder/elements/simple-init/element-deps
index 9d4a9f73d..014ef9beb 100644
--- a/diskimage_builder/elements/simple-init/element-deps
+++ b/diskimage_builder/elements/simple-init/element-deps
@@ -1,6 +1,6 @@
 cloud-init-datasources
 dib-init-system
+ensure-venv
 install-types
-pip-and-virtualenv
 runtime-ssh-host-keys
 source-repositories
diff --git a/diskimage_builder/elements/simple-init/install.d/simple-init-repo-install/40-glean b/diskimage_builder/elements/simple-init/install.d/simple-init-repo-install/40-glean
index a7491ab9a..5a838de75 100755
--- a/diskimage_builder/elements/simple-init/install.d/simple-init-repo-install/40-glean
+++ b/diskimage_builder/elements/simple-init/install.d/simple-init-repo-install/40-glean
@@ -21,4 +21,10 @@ fi
 set -eu
 set -o pipefail
 
-$DIB_PYTHON_PIP install /tmp/glean.git
+python3 -m venv /usr/glean
+/usr/glean/bin/pip install /tmp/glean.git
+
+mkdir -p /usr/local/bin
+ln -sf /usr/glean/bin/glean /usr/local/bin/glean
+ln -sf /usr/glean/bin/glean.sh /usr/local/bin/glean.sh
+ln -sf /usr/glean/bin/glean-install /usr/local/bin/glean-install
diff --git a/diskimage_builder/elements/simple-init/install.d/simple-init-source-install/40-glean b/diskimage_builder/elements/simple-init/install.d/simple-init-source-install/40-glean
index 4dd685ad7..2107a87de 100755
--- a/diskimage_builder/elements/simple-init/install.d/simple-init-source-install/40-glean
+++ b/diskimage_builder/elements/simple-init/install.d/simple-init-source-install/40-glean
@@ -21,4 +21,10 @@ fi
 set -eu
 set -o pipefail
 
-$DIB_PYTHON_PIP install glean
+python3 -m venv /usr/glean
+/usr/glean/bin/pip install glean
+
+mkdir -p /usr/local/bin
+ln -sf /usr/glean/bin/glean /usr/local/bin/glean
+ln -sf /usr/glean/bin/glean.sh /usr/local/bin/glean.sh
+ln -sf /usr/glean/bin/glean-install /usr/local/bin/glean-install
diff --git a/releasenotes/notes/ensure-venv-d7c16a2a04fd3b8f.yaml b/releasenotes/notes/ensure-venv-d7c16a2a04fd3b8f.yaml
new file mode 100644
index 000000000..0af105ccd
--- /dev/null
+++ b/releasenotes/notes/ensure-venv-d7c16a2a04fd3b8f.yaml
@@ -0,0 +1,13 @@
+---
+features:
+  - |
+    The `ensure-venv` module is added to ensure that `python3 -m venv`
+    is available on the host.  This can be useful if you wish to
+    install non-distribution-packaged Python software on a host during
+    build, but not mix any non-distro installation.  This works on all
+    platforms with Python 3 available.
+depreceations:
+  - |
+    The `simple-init` element now uses `ensure-venv` so is technically
+    Python 3 only.  At this stage, all supported platforms have Python
+    3 available.
\ No newline at end of file