diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index e8deda5a64274ee2908b0aea3e3992107a5f3747..015eec681dc66a394ba2e07ae6c7ed2676e1e090 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -35,14 +35,13 @@ variables:
   RECOVER_CONTROL_PLANE_TEST: "false"
   RECOVER_CONTROL_PLANE_TEST_GROUPS: "etcd[2:],kube_control_plane[1:]"
   TERRAFORM_VERSION: 1.3.7
-  ANSIBLE_MAJOR_VERSION: "2.11"
   PIPELINE_IMAGE: "$CI_REGISTRY_IMAGE/pipeline:${CI_PIPELINE_ID}-${CI_COMMIT_SHORT_SHA}"
 
 before_script:
   - ./tests/scripts/rebase.sh
   - update-alternatives --install /usr/bin/python python /usr/bin/python3 1
   - python -m pip uninstall -y ansible ansible-base ansible-core
-  - python -m pip install -r tests/requirements-${ANSIBLE_MAJOR_VERSION}.txt
+  - python -m pip install -r tests/requirements.txt
   - mkdir -p /.ssh
 
 .job: &job
diff --git a/.gitlab-ci/packet.yml b/.gitlab-ci/packet.yml
index a25fbd2e87698991b74fc20d4dcd5099f89ffc9e..02bf4f1b79bd48cdd01fe0e1416dfbf92438eb29 100644
--- a/.gitlab-ci/packet.yml
+++ b/.gitlab-ci/packet.yml
@@ -31,14 +31,6 @@ packet_ubuntu20-calico-aio:
   variables:
     RESET_CHECK: "true"
 
-packet_ubuntu20-calico-aio-ansible-2_11:
-  stage: deploy-part1
-  extends: .packet_periodic
-  when: on_success
-  variables:
-    ANSIBLE_MAJOR_VERSION: "2.11"
-    RESET_CHECK: "true"
-
 # ### PR JOBS PART2
 
 packet_ubuntu20-aio-docker:
diff --git a/Dockerfile b/Dockerfile
index 6d3b0af85279bb92d2a031418ac030b9a74b272f..840d473d058ec3c58ddd1ab53d8cfc7f3a915abf 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -2,7 +2,7 @@
 FROM ubuntu:jammy-20230308
 # Some tools like yamllint need this
 # Pip needs this as well at the moment to install ansible
-# (and potentially other packages) 
+# (and potentially other packages)
 # See: https://github.com/pypa/pip/issues/10219
 ENV LANG=C.UTF-8 \
     DEBIAN_FRONTEND=noninteractive \
@@ -29,7 +29,7 @@ RUN apt update -q \
        openssh-client \
     && pip install --no-compile --no-cache-dir \
        ansible==5.7.1 \
-       ansible-core==2.12.5 \
+       ansible-core==2.12.10 \
        cryptography==3.4.8 \
        jinja2==3.1.2 \
        netaddr==0.8.0 \
diff --git a/contrib/inventory_builder/tox.ini b/contrib/inventory_builder/tox.ini
index 889fe78537f9a3864d67eff3a2a0f3a6792669fd..c9c70428cc41cd87a7ecb5848592097b3e5182cd 100644
--- a/contrib/inventory_builder/tox.ini
+++ b/contrib/inventory_builder/tox.ini
@@ -1,21 +1,27 @@
 [tox]
 minversion = 1.6
 skipsdist = True
-envlist = pep8, py33
+envlist = pep8
 
 [testenv]
-whitelist_externals = py.test
+allowlist_externals = py.test
 usedevelop = True
 deps =
     -r{toxinidir}/requirements.txt
     -r{toxinidir}/test-requirements.txt
 setenv = VIRTUAL_ENV={envdir}
-passenv = http_proxy HTTP_PROXY https_proxy HTTPS_PROXY no_proxy NO_PROXY
+passenv =
+    http_proxy
+    HTTP_PROXY
+    https_proxy
+    HTTPS_PROXY
+    no_proxy
+    NO_PROXY
 commands = pytest -vv #{posargs:./tests}
 
 [testenv:pep8]
 usedevelop = False
-whitelist_externals = bash
+allowlist_externals = bash
 commands =
     bash -c "find {toxinidir}/* -type f -name '*.py' -print0 | xargs -0 flake8"
 
diff --git a/pipeline.Dockerfile b/pipeline.Dockerfile
index 91bda14de154efc8c6d50ad654762ae8c995c542..8351cd8753144f9e2d8b72782004ab71f2907f9a 100644
--- a/pipeline.Dockerfile
+++ b/pipeline.Dockerfile
@@ -37,12 +37,12 @@ RUN apt update -q \
 
 WORKDIR /kubespray
 
-RUN --mount=type=bind,target=./requirements-2.12.txt,src=./requirements-2.12.txt \
-    --mount=type=bind,target=./tests/requirements-2.12.txt,src=./tests/requirements-2.12.txt \
+RUN --mount=type=bind,target=./requirements.txt,src=./requirements.txt \
+    --mount=type=bind,target=./tests/requirements.txt,src=./tests/requirements.txt \
     --mount=type=bind,target=./roles/kubespray-defaults/defaults/main.yaml,src=./roles/kubespray-defaults/defaults/main.yaml \
     update-alternatives --install /usr/bin/python python /usr/bin/python3 1 \
     && pip install --no-compile --no-cache-dir pip -U \
-    && pip install --no-compile --no-cache-dir -r tests/requirements-2.12.txt \
+    && pip install --no-compile --no-cache-dir -r tests/requirements.txt \
     && KUBE_VERSION=$(sed -n 's/^kube_version: //p' roles/kubespray-defaults/defaults/main.yaml) \
     && curl -L https://dl.k8s.io/release/$KUBE_VERSION/bin/linux/$(dpkg --print-architecture)/kubectl -o /usr/local/bin/kubectl \
     && echo $(curl -L https://dl.k8s.io/release/$KUBE_VERSION/bin/linux/$(dpkg --print-architecture)/kubectl.sha256) /usr/local/bin/kubectl | sha256sum --check \
diff --git a/playbooks/ansible_version.yml b/playbooks/ansible_version.yml
index 321ce228d1055c92d67d14a763a529f5737c15c8..84aad69c8809be6fc24ef280bf265e5b2b5a9984 100644
--- a/playbooks/ansible_version.yml
+++ b/playbooks/ansible_version.yml
@@ -3,7 +3,7 @@
   gather_facts: false
   become: no
   vars:
-    minimal_ansible_version: 2.11.0
+    minimal_ansible_version: 2.12.0
     maximal_ansible_version: 2.13.0
     ansible_connection: local
   tags: always
diff --git a/requirements-2.11.txt b/requirements-2.11.txt
deleted file mode 100644
index 56518e3275df103daa12be40233c7f4a8c9942f2..0000000000000000000000000000000000000000
--- a/requirements-2.11.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-ansible==4.10.0
-ansible-core==2.11.11
-cryptography==3.4.8
-jinja2==3.1.2
-jmespath==1.0.1
-MarkupSafe==2.1.2
-netaddr==0.8.0
-pbr==5.11.1
-ruamel.yaml==0.17.21
-ruamel.yaml.clib==0.2.7
diff --git a/requirements-2.12.txt b/requirements-2.12.txt
deleted file mode 100644
index ab90e9480830b958b542142a1e4c2a61570e453c..0000000000000000000000000000000000000000
--- a/requirements-2.12.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-ansible==5.7.1
-ansible-core==2.12.5
-cryptography==3.4.8
-jinja2==3.1.2
-jmespath==1.0.1
-MarkupSafe==2.1.2
-netaddr==0.8.0
-pbr==5.11.1
-ruamel.yaml==0.17.21
-ruamel.yaml.clib==0.2.7
diff --git a/requirements.txt b/requirements.txt
deleted file mode 120000
index ac782c9e7cb173e3c3f63b92a98b3c9c02f096e0..0000000000000000000000000000000000000000
--- a/requirements.txt
+++ /dev/null
@@ -1 +0,0 @@
-requirements-2.12.txt
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000000000000000000000000000000000000..3b97a13a5736e7b57e58de270dbbd2f8fa5d1adc
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,10 @@
+ansible==5.7.1
+ansible-core==2.12.10
+cryptography==3.4.8
+jinja2==3.1.2
+jmespath==1.0.1
+MarkupSafe==2.1.2
+netaddr==0.8.0
+pbr==5.11.1
+ruamel.yaml==0.17.21
+ruamel.yaml.clib==0.2.7
diff --git a/roles/adduser/molecule/default/molecule.yml b/roles/adduser/molecule/default/molecule.yml
index 617677eec6d1f8c9c47c1755fe5ed543f79aa8ec..0fb4997df92cb84da2087d63179ad030df49c2ab 100644
--- a/roles/adduser/molecule/default/molecule.yml
+++ b/roles/adduser/molecule/default/molecule.yml
@@ -1,9 +1,7 @@
 ---
+role_name_check: 1
 dependency:
   name: galaxy
-lint: |
-  set -e
-  yamllint -c ../../.yamllint .
 driver:
   name: vagrant
   provider:
@@ -13,15 +11,13 @@ platforms:
     box: generic/ubuntu2004
     cpus: 1
     memory: 512
+    provider_options:
+      driver: kvm
 provisioner:
   name: ansible
   config_options:
     defaults:
       callbacks_enabled: profile_tasks
       timeout: 120
-  lint:
-    name: ansible-lint
 verifier:
   name: testinfra
-  lint:
-    name: flake8
diff --git a/roles/adduser/molecule/default/tests/test_default.py b/roles/adduser/molecule/default/tests/test_default.py
index 4c81047e2acd8a38f6ddc5e17ecd6bf2c67a97a7..7e8649d141d554ec51d4882b0c6138e3993005d8 100644
--- a/roles/adduser/molecule/default/tests/test_default.py
+++ b/roles/adduser/molecule/default/tests/test_default.py
@@ -1,12 +1,15 @@
 import os
-import yaml
-import glob
+from pathlib import Path
+
 import testinfra.utils.ansible_runner
-from ansible.playbook import Playbook
+import yaml
 from ansible.cli.playbook import PlaybookCLI
+from ansible.playbook import Playbook
 
 testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner(
-    os.environ['MOLECULE_INVENTORY_FILE']).get_hosts('all')
+    os.environ["MOLECULE_INVENTORY_FILE"]
+).get_hosts("all")
+
 
 def read_playbook(playbook):
     cli_args = [os.path.realpath(playbook), testinfra_hosts]
@@ -19,19 +22,22 @@ def read_playbook(playbook):
     for play in pb.get_plays():
         yield variable_manager.get_vars(play)
 
+
 def get_playbook():
-    with open(os.path.realpath(' '.join(map(str,glob.glob('molecule.*')))), 'r') as yamlfile:
+    playbooks_path = Path(__file__).parent.parent
+    with open(os.path.join(playbooks_path, "molecule.yml"), "r") as yamlfile:
         data = yaml.load(yamlfile, Loader=yaml.FullLoader)
-        if 'playbooks' in data['provisioner'].keys():
-            if 'converge' in data['provisioner']['playbooks'].keys():
-                return data['provisioner']['playbooks']['converge']
+        if "playbooks" in data["provisioner"].keys():
+            if "converge" in data["provisioner"]["playbooks"].keys():
+                return data["provisioner"]["playbooks"]["converge"]
         else:
-            return ' '.join(map(str,glob.glob('converge.*')))
+            return os.path.join(playbooks_path, "converge.yml")
+
 
 def test_user(host):
     for vars in read_playbook(get_playbook()):
-        assert host.user(vars['user']['name']).exists
-        if 'group' in vars['user'].keys():
-            assert host.group(vars['user']['group']).exists
+        assert host.user(vars["user"]["name"]).exists
+        if "group" in vars["user"].keys():
+            assert host.group(vars["user"]["group"]).exists
         else:
-            assert host.group(vars['user']['name']).exists
+            assert host.group(vars["user"]["name"]).exists
diff --git a/roles/bastion-ssh-config/molecule/default/molecule.yml b/roles/bastion-ssh-config/molecule/default/molecule.yml
index 5cadd6e644dc81852962bb02a3e464d28efdf1fb..11cf91ce5f93e8185283400beb0bc53e905ca4b8 100644
--- a/roles/bastion-ssh-config/molecule/default/molecule.yml
+++ b/roles/bastion-ssh-config/molecule/default/molecule.yml
@@ -1,9 +1,7 @@
 ---
+role_name_check: 1
 dependency:
   name: galaxy
-lint: |
-  set -e
-  yamllint -c ../../.yamllint .
 driver:
   name: vagrant
   provider:
@@ -13,14 +11,14 @@ platforms:
     box: generic/ubuntu2004
     cpus: 1
     memory: 512
+    provider_options:
+      driver: kvm
 provisioner:
   name: ansible
   config_options:
     defaults:
       callbacks_enabled: profile_tasks
       timeout: 120
-  lint:
-    name: ansible-lint
   inventory:
     hosts:
       all:
@@ -31,5 +29,3 @@ provisioner:
               bastion-01:
 verifier:
   name: testinfra
-  lint:
-    name: flake8
diff --git a/roles/bastion-ssh-config/molecule/default/tests/test_default.py b/roles/bastion-ssh-config/molecule/default/tests/test_default.py
index f98faa4092566765c42014e5fcfe2eb82822c3d2..cce719de192b757c9727fc3865858de3fb711113 100644
--- a/roles/bastion-ssh-config/molecule/default/tests/test_default.py
+++ b/roles/bastion-ssh-config/molecule/default/tests/test_default.py
@@ -1,12 +1,15 @@
 import os
-import yaml
-import glob
+from pathlib import Path
+
 import testinfra.utils.ansible_runner
-from ansible.playbook import Playbook
+import yaml
 from ansible.cli.playbook import PlaybookCLI
+from ansible.playbook import Playbook
 
 testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner(
-    os.environ['MOLECULE_INVENTORY_FILE']).get_hosts('all')
+    os.environ["MOLECULE_INVENTORY_FILE"]
+).get_hosts("all")
+
 
 def read_playbook(playbook):
     cli_args = [os.path.realpath(playbook), testinfra_hosts]
@@ -19,16 +22,19 @@ def read_playbook(playbook):
     for play in pb.get_plays():
         yield variable_manager.get_vars(play)
 
+
 def get_playbook():
-    with open(os.path.realpath(' '.join(map(str,glob.glob('molecule.*')))), 'r') as yamlfile:
+    playbooks_path = Path(__file__).parent.parent
+    with open(os.path.join(playbooks_path, "molecule.yml"), "r") as yamlfile:
         data = yaml.load(yamlfile, Loader=yaml.FullLoader)
-        if 'playbooks' in data['provisioner'].keys():
-            if 'converge' in data['provisioner']['playbooks'].keys():
-                return data['provisioner']['playbooks']['converge']
+        if "playbooks" in data["provisioner"].keys():
+            if "converge" in data["provisioner"]["playbooks"].keys():
+                return data["provisioner"]["playbooks"]["converge"]
         else:
-            return ' '.join(map(str,glob.glob('converge.*')))
+            return os.path.join(playbooks_path, "converge.yml")
+
 
 def test_ssh_config(host):
     for vars in read_playbook(get_playbook()):
-        assert host.file(vars['ssh_bastion_confing__name']).exists
-        assert host.file(vars['ssh_bastion_confing__name']).is_file
+        assert host.file(vars["ssh_bastion_confing__name"]).exists
+        assert host.file(vars["ssh_bastion_confing__name"]).is_file
diff --git a/roles/bootstrap-os/molecule/default/molecule.yml b/roles/bootstrap-os/molecule/default/molecule.yml
index 3e89ec26d08fb6ee2a9eb9aff4c937259053d9b6..76e5b7a94ba4b8172f235a83065eeaab7df404c8 100644
--- a/roles/bootstrap-os/molecule/default/molecule.yml
+++ b/roles/bootstrap-os/molecule/default/molecule.yml
@@ -1,9 +1,7 @@
 ---
+role_name_check: 1
 dependency:
   name: galaxy
-lint: |
-  set -e
-  yamllint -c ../../.yamllint .
 driver:
   name: vagrant
   provider:
@@ -13,30 +11,38 @@ platforms:
     box: generic/ubuntu2004
     cpus: 1
     memory: 512
+    provider_options:
+      driver: kvm
   - name: ubuntu22
     box: generic/ubuntu2204
     cpus: 1
     memory: 1024
+    provider_options:
+      driver: kvm
   - name: centos7
     box: centos/7
     cpus: 1
     memory: 512
+    provider_options:
+      driver: kvm
   - name: almalinux8
     box: almalinux/8
     cpus: 1
     memory: 512
+    provider_options:
+      driver: kvm
   - name: debian10
     box: generic/debian10
     cpus: 1
     memory: 512
+    provider_options:
+      driver: kvm
 provisioner:
   name: ansible
   config_options:
     defaults:
       callbacks_enabled: profile_tasks
       timeout: 120
-  lint:
-    name: ansible-lint
   inventory:
     group_vars:
       all:
@@ -45,5 +51,3 @@ provisioner:
           comment: My test comment
 verifier:
   name: testinfra
-  lint:
-    name: flake8
diff --git a/roles/container-engine/containerd/molecule/default/molecule.yml b/roles/container-engine/containerd/molecule/default/molecule.yml
index 009b5aabbf1a218769af77ad9d25a00483b2e357..4c5c48f0f3ba296dbc9ba09ccbfa9df88a5c08d2 100644
--- a/roles/container-engine/containerd/molecule/default/molecule.yml
+++ b/roles/container-engine/containerd/molecule/default/molecule.yml
@@ -1,11 +1,9 @@
 ---
+role_name_check: 1
 driver:
   name: vagrant
   provider:
     name: libvirt
-lint: |
-  set -e
-  yamllint -c ../../../.yamllint .
 platforms:
   - name: ubuntu20
     box: generic/ubuntu2004
@@ -15,6 +13,8 @@ platforms:
       - kube_control_plane
       - kube_node
       - k8s_cluster
+    provider_options:
+      driver: kvm
   - name: debian11
     box: generic/debian11
     cpus: 1
@@ -23,6 +23,8 @@ platforms:
       - kube_control_plane
       - kube_node
       - k8s_cluster
+    provider_options:
+      driver: kvm
   - name: almalinux8
     box: almalinux/8
     cpus: 1
@@ -31,6 +33,8 @@ platforms:
       - kube_control_plane
       - kube_node
       - k8s_cluster
+    provider_options:
+      driver: kvm
 provisioner:
   name: ansible
   env:
@@ -39,11 +43,5 @@ provisioner:
     defaults:
       callbacks_enabled: profile_tasks
       timeout: 120
-  lint:
-    name: ansible-lint
-    options:
-      c: ../../../.ansible-lint
 verifier:
   name: testinfra
-  lint:
-    name: flake8
diff --git a/roles/container-engine/cri-dockerd/molecule/default/molecule.yml b/roles/container-engine/cri-dockerd/molecule/default/molecule.yml
index c82ddba9dbabc8f1bb03054cc49589e035bb6c1d..82cb778ecb486dd04aaf47a5265d6067702e0a9f 100644
--- a/roles/container-engine/cri-dockerd/molecule/default/molecule.yml
+++ b/roles/container-engine/cri-dockerd/molecule/default/molecule.yml
@@ -1,13 +1,9 @@
 ---
+role_name_check: 1
 driver:
   name: vagrant
   provider:
     name: libvirt
-    options:
-      driver: kvm
-lint: |
-  set -e
-  yamllint -c ../../../.yamllint .
 platforms:
   - name: almalinux8
     box: almalinux/8
@@ -16,6 +12,8 @@ platforms:
     nested: true
     groups:
       - kube_control_plane
+    provider_options:
+      driver: kvm
   - name: ubuntu20
     box: generic/ubuntu2004
     cpus: 1
@@ -23,6 +21,8 @@ platforms:
     nested: true
     groups:
       - kube_control_plane
+    provider_options:
+      driver: kvm
 provisioner:
   name: ansible
   env:
@@ -31,15 +31,9 @@ provisioner:
     defaults:
       callbacks_enabled: profile_tasks
       timeout: 120
-  lint:
-    name: ansible-lint
-    options:
-      c: ../../../.ansible-lint
   inventory:
     group_vars:
       all:
         become: true
 verifier:
   name: testinfra
-  lint:
-    name: flake8
diff --git a/roles/container-engine/cri-o/molecule/default/molecule.yml b/roles/container-engine/cri-o/molecule/default/molecule.yml
index e35014954ea1c7e564cdcfde3910b336002a4ca5..d8742e17fb759970ae8c0dd9c64239997a70bd43 100644
--- a/roles/container-engine/cri-o/molecule/default/molecule.yml
+++ b/roles/container-engine/cri-o/molecule/default/molecule.yml
@@ -1,11 +1,9 @@
 ---
+role_name_check: 1
 driver:
   name: vagrant
   provider:
     name: libvirt
-lint: |
-  set -e
-  yamllint -c ../../../.yamllint .
 platforms:
   - name: ubuntu20
     box: generic/ubuntu2004
@@ -15,6 +13,8 @@ platforms:
       - kube_control_plane
       - kube_node
       - k8s_cluster
+    provider_options:
+      driver: kvm
   - name: almalinux8
     box: almalinux/8
     cpus: 2
@@ -23,6 +23,8 @@ platforms:
       - kube_control_plane
       - kube_node
       - k8s_cluster
+    provider_options:
+      driver: kvm
   - name: fedora
     box: fedora/36-cloud-base
     cpus: 2
@@ -31,6 +33,8 @@ platforms:
       - kube_control_plane
       - kube_node
       - k8s_cluster
+    provider_options:
+      driver: kvm
   - name: debian10
     box: generic/debian10
     cpus: 2
@@ -39,6 +43,8 @@ platforms:
       - kube_control_plane
       - kube_node
       - k8s_cluster
+    provider_options:
+      driver: kvm
 provisioner:
   name: ansible
   env:
@@ -47,11 +53,5 @@ provisioner:
     defaults:
       callbacks_enabled: profile_tasks
       timeout: 120
-  lint:
-    name: ansible-lint
-    options:
-      c: ../../../.ansible-lint
 verifier:
   name: testinfra
-  lint:
-    name: flake8
diff --git a/roles/container-engine/gvisor/molecule/default/molecule.yml b/roles/container-engine/gvisor/molecule/default/molecule.yml
index 5c3a7e175d2c9ddb0bcf473458649dcdfb8881c5..9ba192719891f8216ae9f4d3603a7c8e7513ab6d 100644
--- a/roles/container-engine/gvisor/molecule/default/molecule.yml
+++ b/roles/container-engine/gvisor/molecule/default/molecule.yml
@@ -1,13 +1,9 @@
 ---
+role_name_check: 1
 driver:
   name: vagrant
   provider:
     name: libvirt
-    options:
-      driver: kvm
-lint: |
-  set -e
-  yamllint -c ../../../.yamllint .
 platforms:
   - name: ubuntu20
     box: generic/ubuntu2004
@@ -16,6 +12,8 @@ platforms:
     nested: true
     groups:
       - kube_control_plane
+    provider_options:
+      driver: kvm
   - name: almalinux8
     box: almalinux/8
     cpus: 1
@@ -23,6 +21,8 @@ platforms:
     nested: true
     groups:
       - kube_control_plane
+    provider_options:
+      driver: kvm
 provisioner:
   name: ansible
   env:
@@ -31,15 +31,9 @@ provisioner:
     defaults:
       callbacks_enabled: profile_tasks
       timeout: 120
-  lint:
-    name: ansible-lint
-    options:
-      c: ../../../.ansible-lint
   inventory:
     group_vars:
       all:
         become: true
 verifier:
   name: testinfra
-  lint:
-    name: flake8
diff --git a/roles/container-engine/kata-containers/molecule/default/molecule.yml b/roles/container-engine/kata-containers/molecule/default/molecule.yml
index dd2b24751187ad5f70391ef94436f221e592ef26..8eaa5d7b87b9cb29f55a9def89a89600786ceae1 100644
--- a/roles/container-engine/kata-containers/molecule/default/molecule.yml
+++ b/roles/container-engine/kata-containers/molecule/default/molecule.yml
@@ -1,13 +1,9 @@
 ---
+role_name_check: 1
 driver:
   name: vagrant
   provider:
     name: libvirt
-    options:
-      driver: kvm
-lint: |
-  set -e
-  yamllint -c ../../../.yamllint .
 platforms:
   - name: ubuntu20
     box: generic/ubuntu2004
@@ -16,6 +12,8 @@ platforms:
     nested: true
     groups:
       - kube_control_plane
+    provider_options:
+      driver: kvm
   - name: ubuntu22
     box: generic/ubuntu2204
     cpus: 1
@@ -23,6 +21,8 @@ platforms:
     nested: true
     groups:
       - kube_control_plane
+    provider_options:
+      driver: kvm
 provisioner:
   name: ansible
   env:
@@ -31,15 +31,9 @@ provisioner:
     defaults:
       callbacks_enabled: profile_tasks
       timeout: 120
-  lint:
-    name: ansible-lint
-    options:
-      c: ../../../.ansible-lint
   inventory:
     group_vars:
       all:
         become: true
 verifier:
   name: testinfra
-  lint:
-    name: flake8
diff --git a/roles/container-engine/youki/molecule/default/molecule.yml b/roles/container-engine/youki/molecule/default/molecule.yml
index 5c3a7e175d2c9ddb0bcf473458649dcdfb8881c5..9ba192719891f8216ae9f4d3603a7c8e7513ab6d 100644
--- a/roles/container-engine/youki/molecule/default/molecule.yml
+++ b/roles/container-engine/youki/molecule/default/molecule.yml
@@ -1,13 +1,9 @@
 ---
+role_name_check: 1
 driver:
   name: vagrant
   provider:
     name: libvirt
-    options:
-      driver: kvm
-lint: |
-  set -e
-  yamllint -c ../../../.yamllint .
 platforms:
   - name: ubuntu20
     box: generic/ubuntu2004
@@ -16,6 +12,8 @@ platforms:
     nested: true
     groups:
       - kube_control_plane
+    provider_options:
+      driver: kvm
   - name: almalinux8
     box: almalinux/8
     cpus: 1
@@ -23,6 +21,8 @@ platforms:
     nested: true
     groups:
       - kube_control_plane
+    provider_options:
+      driver: kvm
 provisioner:
   name: ansible
   env:
@@ -31,15 +31,9 @@ provisioner:
     defaults:
       callbacks_enabled: profile_tasks
       timeout: 120
-  lint:
-    name: ansible-lint
-    options:
-      c: ../../../.ansible-lint
   inventory:
     group_vars:
       all:
         become: true
 verifier:
   name: testinfra
-  lint:
-    name: flake8
diff --git a/tests/requirements-2.11.txt b/tests/requirements-2.11.txt
deleted file mode 100644
index 4b2c06004aa887809190a644aa4122c2dbd5558b..0000000000000000000000000000000000000000
--- a/tests/requirements-2.11.txt
+++ /dev/null
@@ -1,11 +0,0 @@
--r ../requirements-2.11.txt
-ansible-lint==5.4.0
-apache-libcloud==2.2.1
-ara[server]==1.6.1
-dopy==0.3.7
-molecule==3.0.6
-molecule-vagrant==0.3
-python-vagrant==0.5.15
-testinfra==5.2.2
-tox==3.11.1
-yamllint==1.19.0
diff --git a/tests/requirements-2.12.txt b/tests/requirements-2.12.txt
deleted file mode 100644
index 6b0d6220bf964aa63b91064d1778293f57e4201c..0000000000000000000000000000000000000000
--- a/tests/requirements-2.12.txt
+++ /dev/null
@@ -1,11 +0,0 @@
--r ../requirements-2.12.txt
-ansible-lint==5.4.0
-apache-libcloud==2.2.1
-ara[server]==1.6.1
-dopy==0.3.7
-molecule==3.0.6
-molecule-vagrant==0.3
-python-vagrant==0.5.15
-testinfra==5.2.2
-tox==3.11.1
-yamllint==1.19.0
diff --git a/tests/requirements.txt b/tests/requirements.txt
deleted file mode 120000
index ac782c9e7cb173e3c3f63b92a98b3c9c02f096e0..0000000000000000000000000000000000000000
--- a/tests/requirements.txt
+++ /dev/null
@@ -1 +0,0 @@
-requirements-2.12.txt
\ No newline at end of file
diff --git a/tests/requirements.txt b/tests/requirements.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e3c4482d7f624acbf2918121365938a5203c71ad
--- /dev/null
+++ b/tests/requirements.txt
@@ -0,0 +1,11 @@
+-r ../requirements.txt
+ansible-lint==5.4.0
+apache-libcloud==3.7.0
+ara[server]==1.6.1
+dopy==0.3.7
+molecule==5.0.1
+molecule-plugins[vagrant]==23.4.1
+python-vagrant==1.0.0
+pytest-testinfra==7.0.0
+tox==4.5.1
+yamllint==1.31.0
diff --git a/tests/scripts/testcases_prepare.sh b/tests/scripts/testcases_prepare.sh
index ff27561a445383a77d5bc8fd6fda6932bb84dba3..38191cebd2a88b8de59f22b5e12ab248b4f1070f 100755
--- a/tests/scripts/testcases_prepare.sh
+++ b/tests/scripts/testcases_prepare.sh
@@ -1,10 +1,8 @@
 #!/bin/bash
 set -euxo pipefail
 
-: ${ANSIBLE_MAJOR_VERSION:=2.12}
-
 /usr/bin/python -m pip uninstall -y ansible ansible-base ansible-core
-/usr/bin/python -m pip install -r tests/requirements-${ANSIBLE_MAJOR_VERSION}.txt
+/usr/bin/python -m pip install -r tests/requirements.txt
 mkdir -p /.ssh
 mkdir -p cluster-dump
 mkdir -p $HOME/.ssh