diff --git a/playbooks/prepare-node-common.yaml b/playbooks/prepare-node-common.yaml
index 77ebf2bc9..606190410 100644
--- a/playbooks/prepare-node-common.yaml
+++ b/playbooks/prepare-node-common.yaml
@@ -17,6 +17,20 @@
           - centos-release-openstack-*
           - centos-release-ceph-*
 
+      - name: Reset dnf modules (CentOS/RHEL)
+        shell:
+          cmd: |-
+            dnf module -y reset {{ item.key }}
+        become: true
+        with_items: "{{ dnf_modules | default({}) | dict2items }}"
+
+      - name: Enable dnf modules (CentOS/RHEL)
+        shell:
+          cmd: |-
+            dnf module -y enable {{ item.key }}:{{ item.value }}
+        become: true
+        with_items: "{{ dnf_modules | default({}) | dict2items }}"
+
       - name: Install Ruby dependencies (CentOS/RHEL)
         dnf:
           name: "{{ item }}"
diff --git a/zuul.d/base.yaml b/zuul.d/base.yaml
index 50889bd0e..6e2676679 100644
--- a/zuul.d/base.yaml
+++ b/zuul.d/base.yaml
@@ -137,6 +137,7 @@
       - ^setup.py$
       - ^tox.ini$
     vars:
+      # NOTE(tkajinam): rspec-puppet >= 2.10.0 is required for Ruby 3 support
       rspec_puppet_version: '~> 2.10.0'
 
 - job:
@@ -163,4 +164,5 @@
       - ^setup.py$
       - ^tox.ini$
     vars:
+      # NOTE(tkajinam): rspec-puppet >= 2.10.0 is required for Ruby 3 support
       rspec_puppet_version: '~> 2.10.0'
diff --git a/zuul.d/layout.yaml b/zuul.d/layout.yaml
index dffa74157..130a586e5 100644
--- a/zuul.d/layout.yaml
+++ b/zuul.d/layout.yaml
@@ -9,6 +9,7 @@
       jobs:
         - puppet-openstack-lint-ubuntu-jammy
         - puppet-openstack-syntax-7-ubuntu-jammy
+        - puppet-openstack-syntax-8-centos-9-stream
     gate:
       jobs:
         - puppet-openstack-lint-ubuntu-jammy
@@ -26,8 +27,10 @@
       jobs:
         - puppet-openstack-libraries-puppet-lint-ubuntu-jammy
         - puppet-openstack-libraries-puppet-syntax-7-ubuntu-jammy
+        - puppet-openstack-libraries-puppet-syntax-8-centos-9-stream
         - puppet-openstack-libraries-puppet-unit-7.22-centos-9-stream
         - puppet-openstack-libraries-puppet-unit-7.22-ubuntu-jammy
+        - puppet-openstack-libraries-puppet-unit-8.0-centos-9-stream
         - puppet-openstack-libraries-puppet-unit-latest-ubuntu-jammy
         - puppet-openstack-libraries-litmus-7.22-centos-9-stream
         - puppet-openstack-libraries-litmus-7.22-ubuntu-jammy
diff --git a/zuul.d/libraries.yaml b/zuul.d/libraries.yaml
index a4fe7a0a7..7fe23853d 100644
--- a/zuul.d/libraries.yaml
+++ b/zuul.d/libraries.yaml
@@ -7,8 +7,6 @@
     nodeset: centos-9-stream
     vars:
       puppet_gem_version: 7.22.0
-      # NOTE(tkajinam): rspec-puppet >= 2.10.0 is required for Ruby 3 support
-      rspec_puppet_version: '~> 2.10.0'
 
 - job:
     name: puppet-openstack-libraries-puppet-unit-7.22-ubuntu-jammy
@@ -16,8 +14,16 @@
     nodeset: ubuntu-jammy
     vars:
       puppet_gem_version: 7.22.0
-      # NOTE(tkajinam): rspec-puppet >= 2.10.0 is required for Ruby 3 support
-      rspec_puppet_version: '~> 2.10.0'
+
+- job:
+    name: puppet-openstack-libraries-puppet-unit-8.0-centos-9-stream
+    parent: puppet-openstack-libraries-puppet-unit-base
+    nodeset: centos-9-stream
+    voting: false
+    vars:
+      puppet_gem_version: 8.0.1
+      dnf_modules:
+        ruby: 3.1
 
 - job:
     name: puppet-openstack-libraries-puppet-unit-latest-ubuntu-jammy
@@ -26,5 +32,3 @@
     voting: false
     vars:
       puppet_gem_version: latest
-      # NOTE(tkajinam): rspec-puppet >= 2.10.0 is required for Ruby 3 support
-      rspec_puppet_version: '~> 2.10.0'
diff --git a/zuul.d/linters.yaml b/zuul.d/linters.yaml
index b521625a2..cbe9acc23 100644
--- a/zuul.d/linters.yaml
+++ b/zuul.d/linters.yaml
@@ -16,6 +16,16 @@
     vars:
       puppet: 7
 
+- job:
+    name: puppet-openstack-syntax-8-centos-9-stream
+    parent: puppet-openstack-syntax-base
+    nodeset: centos-9-stream
+    voting: false
+    vars:
+      puppet: 8
+      dnf_modules:
+        ruby: 3.1
+
 - job:
     name: puppet-openstack-libraries-puppet-lint-ubuntu-jammy
     parent: puppet-openstack-integration-base
@@ -49,3 +59,13 @@
     parent: puppet-openstack-libraries-puppet-syntax
     vars:
       puppet: 7
+
+- job:
+    name: puppet-openstack-libraries-puppet-syntax-8-centos-9-stream
+    parent: puppet-openstack-libraries-puppet-syntax
+    nodeset: centos-9-stream
+    voting: false
+    vars:
+      puppet: 8
+      dnf_modules:
+        ruby: 3.1
diff --git a/zuul.d/unit.yaml b/zuul.d/unit.yaml
index 1752ed3f8..6a1d2c6ae 100644
--- a/zuul.d/unit.yaml
+++ b/zuul.d/unit.yaml
@@ -7,8 +7,6 @@
     nodeset: centos-9-stream
     vars:
       puppet_gem_version: 7.22.0
-      # NOTE(tkajinam): rspec-puppet >= 2.10.0 is required for Ruby 3 support
-      rspec_puppet_version: '~> 2.10.0'
 
 - job:
     name: puppet-openstack-unit-7.22-ubuntu-jammy
@@ -16,8 +14,16 @@
     nodeset: ubuntu-jammy
     vars:
       puppet_gem_version: 7.22.0
-      # NOTE(tkajinam): rspec-puppet >= 2.10.0 is required for Ruby 3 support
-      rspec_puppet_version: '~> 2.10.0'
+
+- job:
+    name: puppet-openstack-unit-8.0-centos-9-stream
+    parent: puppet-openstack-unit-base
+    nodeset: centos-9-stream
+    voting: false
+    vars:
+      puppet_gem_version: 8.0.1
+      dnf_modules:
+        ruby: 3.1
 
 - job:
     name: puppet-openstack-unit-latest-ubuntu-jammy
@@ -26,8 +32,6 @@
     voting: false
     vars:
       puppet_gem_version: latest
-      # NOTE(tkajinam): rspec-puppet >= 2.10.0 is required for Ruby 3 support
-      rspec_puppet_version: '~> 2.10.0'
 
 - project-template:
     name: puppet-openstack-module-unit-jobs
@@ -35,8 +39,10 @@
       jobs:
         - puppet-openstack-unit-7.22-centos-9-stream
         - puppet-openstack-unit-7.22-ubuntu-jammy
+        - puppet-openstack-unit-8.0-centos-9-stream
         - puppet-openstack-unit-latest-ubuntu-jammy
     gate:
       jobs:
         - puppet-openstack-unit-7.22-centos-9-stream
         - puppet-openstack-unit-7.22-ubuntu-jammy
+        - puppet-openstack-unit-8.0-centos-9-stream