diff --git a/templates/gitlab-ci-python.yml b/templates/gitlab-ci-python.yml
index 04914720e087538cf42069bd296c732b63bed339..8acc4873d436c283bc1c3553eb199cfbcca14e47 100644
--- a/templates/gitlab-ci-python.yml
+++ b/templates/gitlab-ci-python.yml
@@ -175,6 +175,23 @@ spec:
     mypy-files:
       description: Files or directories to analyse
       default: ''
+    py-package-job-tags:
+      description: tags to filter applicable runners for py-package job
+      type: array
+      default: []
+    py-pytest-job-tags:
+      description: tags to filter applicable runners for py-pytest job
+      type: array
+      default: []
+    py-ruff-job-tags:
+      description: tags to filter applicable runners for py-ruff job
+      type: array
+      default: []
+    py-release-job-tags:
+      description: tags to filter applicable runners for py-release job
+      type: array
+      default: []
+
 ---
 # default workflow rules: Merge Request pipelines
 workflow:
@@ -860,6 +877,7 @@ py-package:
     expire_in: 1 day
   rules:
     - if: '$PYTHON_PACKAGE_ENABLED == "true"'
+  tags: $[[ inputs.py-package-job-tags ]]
 
 py-lint:
   extends: .python-base
@@ -954,6 +972,7 @@ py-ruff:
     - if: '$RUFF_ENABLED != "true"'
       when: never
     - !reference [.test-policy, rules]
+  tags: $[[ inputs.py-ruff-job-tags ]]
 
 py-mypy:
   extends: .python-base
@@ -1044,6 +1063,7 @@ py-pytest:
     - if: '$PYTEST_ENABLED != "true"'
       when: never
     - !reference [.test-policy, rules]
+  tags: $[[ inputs.py-pytest-job-tags ]]
 
 py-nosetests:
   extends: .python-base
@@ -1231,6 +1251,7 @@ py-release:
     - if: '$CI_COMMIT_REF_NAME =~ $PROD_REF || $CI_COMMIT_REF_NAME =~ $INTEG_REF'
       when: manual
       allow_failure: true
+  tags: $[[ inputs.py-release-job-tags ]]
 
 # (auto from release tag): publishes the Python package(s) to a PyPi registry
 py-publish: