diff --git a/tests/scripts/testcases_run.sh b/tests/scripts/testcases_run.sh
index 7cd4671a76db9a6a21909c32582cdaaaff3b73a4..ec22a4dcb044904e9d229097a66865ff434a059c 100755
--- a/tests/scripts/testcases_run.sh
+++ b/tests/scripts/testcases_run.sh
@@ -47,21 +47,6 @@ if [[ "$CI_JOB_NAME" =~ "ubuntu" ]]; then
   CI_TEST_ADDITIONAL_VARS="-e ansible_python_interpreter=/usr/bin/python3"
 fi
 
-ENABLE_020_TEST="true"
-ENABLE_030_TEST="true"
-ENABLE_040_TEST="true"
-if [[ "$CI_JOB_NAME" =~ "macvlan" ]]; then
-  ENABLE_020_TEST="false"
-  ENABLE_030_TEST="false"
-  ENABLE_040_TEST="false"
-fi
-
-if [[ "$CI_JOB_NAME" =~ "hardening" ]]; then
-  # TODO: We need to remove this condition by finding alternative container
-  # image instead of netchecker which doesn't work at hardening environments.
-  ENABLE_040_TEST="false"
-fi
-
 # Check out latest tag if testing upgrade
 test "${UPGRADE_TEST}" != "false" && git fetch --all && git checkout "$KUBESPRAY_VERSION"
 # Checkout the CI vars file so it is available
@@ -69,21 +54,41 @@ test "${UPGRADE_TEST}" != "false" && git checkout "${CI_COMMIT_SHA}" tests/files
 test "${UPGRADE_TEST}" != "false" && git checkout "${CI_COMMIT_SHA}" ${CI_TEST_REGISTRY_MIRROR}
 test "${UPGRADE_TEST}" != "false" && git checkout "${CI_COMMIT_SHA}" ${CI_TEST_SETTING}
 
+
+run_playbook () {
+playbook=$1
+shift
+# We can set --limit here and still pass it as supplemental args because `--limit`  is a 'last one wins' option
+ansible-playbook --limit "all:!fake_hosts" \
+     $ANSIBLE_LOG_LEVEL \
+    -e @${CI_TEST_SETTING} \
+    -e @${CI_TEST_REGISTRY_MIRROR} \
+    -e @${CI_TEST_VARS} ${CI_TEST_ADDITIONAL_VARS} \
+    -e local_release_dir=${PWD}/downloads \
+    "$@" \
+    ${playbook}
+}
+
 # Create cluster
-ansible-playbook ${ANSIBLE_LOG_LEVEL} -e @${CI_TEST_SETTING} -e @${CI_TEST_REGISTRY_MIRROR} -e @${CI_TEST_VARS} -e local_release_dir=${PWD}/downloads --limit "all:!fake_hosts" cluster.yml
+run_playbook cluster.yml
 
 # Repeat deployment if testing upgrade
-if [ "${UPGRADE_TEST}" != "false" ]; then
-  test "${UPGRADE_TEST}" == "basic" && PLAYBOOK="cluster.yml"
-  test "${UPGRADE_TEST}" == "graceful" && PLAYBOOK="upgrade-cluster.yml"
-  git checkout "${CI_COMMIT_SHA}"
-  ansible-playbook ${ANSIBLE_LOG_LEVEL} -e @${CI_TEST_SETTING} -e @${CI_TEST_REGISTRY_MIRROR} -e @${CI_TEST_VARS} -e local_release_dir=${PWD}/downloads --limit "all:!fake_hosts" $PLAYBOOK
-fi
+case "${UPGRADE_TEST}" in
+
+    "basic")
+        run_playbook cluster.yml
+        ;;
+    "graceful")
+        run_playbook upgrade-cluster.yml
+        ;;
+    *)
+        ;;
+esac
 
 # Test control plane recovery
 if [ "${RECOVER_CONTROL_PLANE_TEST}" != "false" ]; then
-  ansible-playbook ${ANSIBLE_LOG_LEVEL} -e @${CI_TEST_SETTING} -e @${CI_TEST_REGISTRY_MIRROR} -e @${CI_TEST_VARS} -e local_release_dir=${PWD}/downloads --limit "${RECOVER_CONTROL_PLANE_TEST_GROUPS}:!fake_hosts" -e reset_confirmation=yes reset.yml
-  ansible-playbook ${ANSIBLE_LOG_LEVEL} -e @${CI_TEST_SETTING} -e @${CI_TEST_REGISTRY_MIRROR} -e @${CI_TEST_VARS} -e local_release_dir=${PWD}/downloads -e etcd_retries=10 --limit "etcd:kube_control_plane:!fake_hosts" recover-control-plane.yml
+    run_playbook reset.yml --limit "${RECOVER_CONTROL_PLANE_TEST_GROUPS}:!fake_hosts" -e reset_confirmation=yes
+    run_playbook recover-control-plane.yml -e etcd_retries=10 --limit "etcd:kube_control_plane:!fake_hosts"
 fi
 
 # Test collection build and install by installing our collection, emptying our repository, adding
@@ -114,61 +119,59 @@ EOF
   # Write remove-node.yml
 cat > remove-node.yml <<EOF
 - name: Remove node from Kubernetes
-  ansible.builtin.import_playbook: kubernetes_sigs.kubespray.remote-node
+  ansible.builtin.import_playbook: kubernetes_sigs.kubespray.remove_node
 EOF
 
 fi
-
 # Tests Cases
 ## Test Master API
-ansible-playbook --limit "all:!fake_hosts" -e @${CI_TEST_VARS} ${CI_TEST_ADDITIONAL_VARS} tests/testcases/010_check-apiserver.yml $ANSIBLE_LOG_LEVEL
+run_playbook tests/testcases/010_check-apiserver.yml
+run_playbook tests/testcases/015_check-nodes-ready.yml
 
 ## Test that all nodes are Ready
-ansible-playbook --limit "all:!fake_hosts" -e @${CI_TEST_VARS} ${CI_TEST_ADDITIONAL_VARS} tests/testcases/015_check-nodes-ready.yml $ANSIBLE_LOG_LEVEL
-
-## Test that all pods are Running
-if [ "${ENABLE_020_TEST}" = "true" ]; then
-ansible-playbook --limit "all:!fake_hosts" -e @${CI_TEST_VARS} ${CI_TEST_ADDITIONAL_VARS} tests/testcases/020_check-pods-running.yml $ANSIBLE_LOG_LEVEL
-fi
 
-## Test pod creation and ping between them
-if [ "${ENABLE_030_TEST}" = "true" ]; then
-ansible-playbook --limit "all:!fake_hosts" -e @${CI_TEST_VARS} ${CI_TEST_ADDITIONAL_VARS} tests/testcases/030_check-network.yml $ANSIBLE_LOG_LEVEL
-fi
-
-## Advanced DNS checks
-if [ "${ENABLE_040_TEST}" = "true" ]; then
-  ansible-playbook --limit "all:!fake_hosts" -e @${CI_TEST_VARS} ${CI_TEST_ADDITIONAL_VARS} tests/testcases/040_check-network-adv.yml $ANSIBLE_LOG_LEVEL
+if [[ ! ( "$CI_JOB_NAME" =~ "macvlan" ) ]]; then
+    run_playbook tests/testcases/020_check-pods-running.yml
+    run_playbook tests/testcases/030_check-network.yml
+    if [[ ! ( "$CI_JOB_NAME" =~ "hardening" ) ]]; then
+      # TODO: We need to remove this condition by finding alternative container
+      # image instead of netchecker which doesn't work at hardening environments.
+      run_playbook tests/testcases/040_check-network-adv.yml
+    fi
 fi
 
 ## Kubernetes conformance tests
-ansible-playbook -i ${ANSIBLE_INVENTORY} -e @${CI_TEST_VARS} ${CI_TEST_ADDITIONAL_VARS} --limit "all:!fake_hosts" tests/testcases/100_check-k8s-conformance.yml $ANSIBLE_LOG_LEVEL
+run_playbook tests/testcases/100_check-k8s-conformance.yml
 
 if [ "${IDEMPOT_CHECK}" = "true" ]; then
   ## Idempotency checks 1/5 (repeat deployment)
-  ansible-playbook ${ANSIBLE_LOG_LEVEL} -e @${CI_TEST_SETTING} -e @${CI_TEST_REGISTRY_MIRROR} ${CI_TEST_ADDITIONAL_VARS} -e @${CI_TEST_VARS} -e local_release_dir=${PWD}/downloads --limit "all:!fake_hosts" cluster.yml
+  run_playbook cluster.yml
 
   ## Idempotency checks 2/5 (Advanced DNS checks)
-  ansible-playbook ${ANSIBLE_LOG_LEVEL} -e @${CI_TEST_VARS} ${CI_TEST_ADDITIONAL_VARS} --limit "all:!fake_hosts" tests/testcases/040_check-network-adv.yml
+  if [[ ! ( "$CI_JOB_NAME" =~ "hardening" ) ]]; then
+      run_playbook tests/testcases/040_check-network-adv.yml
+  fi
 
   if [ "${RESET_CHECK}" = "true" ]; then
     ## Idempotency checks 3/5 (reset deployment)
-    ansible-playbook ${ANSIBLE_LOG_LEVEL} -e @${CI_TEST_SETTING} -e @${CI_TEST_REGISTRY_MIRROR}  -e @${CI_TEST_VARS} ${CI_TEST_ADDITIONAL_VARS} -e reset_confirmation=yes --limit "all:!fake_hosts" reset.yml
+    run_playbook reset.yml -e reset_confirmation=yes
 
     ## Idempotency checks 4/5 (redeploy after reset)
-    ansible-playbook ${ANSIBLE_LOG_LEVEL} -e @${CI_TEST_SETTING} -e @${CI_TEST_REGISTRY_MIRROR} -e @${CI_TEST_VARS} ${CI_TEST_ADDITIONAL_VARS} -e local_release_dir=${PWD}/downloads --limit "all:!fake_hosts" cluster.yml
+    run_playbook cluster.yml
 
     ## Idempotency checks 5/5 (Advanced DNS checks)
-    ansible-playbook ${ANSIBLE_LOG_LEVEL} -e @${CI_TEST_SETTING} -e @${CI_TEST_REGISTRY_MIRROR} -e @${CI_TEST_VARS} ${CI_TEST_ADDITIONAL_VARS} --limit "all:!fake_hosts" tests/testcases/040_check-network-adv.yml
+    if [[ ! ( "$CI_JOB_NAME" =~ "hardening" ) ]]; then
+        run_playbook tests/testcases/040_check-network-adv.yml
+    fi
   fi
 fi
 
 # Test node removal procedure
 if [ "${REMOVE_NODE_CHECK}" = "true" ]; then
-  ansible-playbook ${ANSIBLE_LOG_LEVEL} -e @${CI_TEST_SETTING} -e @${CI_TEST_REGISTRY_MIRROR}  -e @${CI_TEST_VARS} ${CI_TEST_ADDITIONAL_VARS} -e skip_confirmation=yes -e node=${REMOVE_NODE_NAME} --limit "all:!fake_hosts" remove-node.yml
+  run_playbook remove-node.yml -e skip_confirmation=yes -e node=${REMOVE_NODE_NAME}
 fi
 
 # Clean up at the end, this is to allow stage1 tests to include cleanup test
 if [ "${RESET_CHECK}" = "true" ]; then
-  ansible-playbook ${ANSIBLE_LOG_LEVEL} -e @${CI_TEST_SETTING} -e @${CI_TEST_REGISTRY_MIRROR}  -e @${CI_TEST_VARS} ${CI_TEST_ADDITIONAL_VARS} -e reset_confirmation=yes --limit "all:!fake_hosts" reset.yml
+  run_playbook reset.yml -e reset_confirmation=yes
 fi