diff --git a/infra/azure/azure-pipelines.yml b/infra/azure/azure-pipelines.yml
index 7456b62eb4b8eb79da26553d08b6989cafdb9354..8b915b4cef6f6eddeba0b97f3264b41509ee81d5 100644
--- a/infra/azure/azure-pipelines.yml
+++ b/infra/azure/azure-pipelines.yml
@@ -5,72 +5,64 @@ trigger:
 pool:
   vmImage: 'ubuntu-20.04'
 
-stages:
+variables:
+  ansible_version: "-core >=2.16,<2.17"
+  ansible_latest: "-core"
+  ansible_minimum: "-core <2.16"
+  distros: "fedora-latest,c9s,fedora-rawhide"
 
-# Fedora
+stages:
 
-- stage: Fedora_Ansible_Latest
+- stage: fedora_latest_ansible_latest
   dependsOn: []
   jobs:
   - template: templates/group_tests.yml
     parameters:
       build_number: $(Build.BuildNumber)
       distro: fedora-latest
-      ansible_version: "-core"
+      ansible_version: ${{ variables.ansible_latest }}
       skip_git_test: true
 
-# Fedora
-
-- stage: Fedora_Ansible_min_supported
+- stage: fedora_latest_ansible_2_15
   dependsOn: []
   jobs:
   - template: templates/group_tests.yml
     parameters:
       build_number: $(Build.BuildNumber)
       distro: fedora-latest
-      ansible_version: "-core <2.16"
+      ansible_version: ${{ variables.ansbile_minimum }}
       skip_git_test: true
 
-# Fedora
+# Supported distros
 
-- stage: Fedora_Latest
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      distro: fedora-latest
-      skip_git_test: true
-      ansible_version: "-core >=2.16,<2.17"
+- ${{ each distro in split(variables.distros, ',') }}:
+  - stage: ${{ replace(distro, '-', '_') }}_ansible_2_16
+    dependsOn: []
+    jobs:
+    - template: templates/group_tests.yml
+      parameters:
+        build_number: $(Build.BuildNumber)
+        distro: ${{ distro }}
+        ansible_version: ${{ variables.ansible_version }}
+        skip_git_test: true
+        test_galaxy: false
 
 # Galaxy on Fedora
 
-- stage: Galaxy_Fedora_Latest
+- stage: galaxy_fedora_latest_ansible_2_16
   dependsOn: []
   jobs:
   - template: templates/group_tests.yml
     parameters:
       build_number: $(Build.BuildNumber)
       distro: fedora-latest
-      ansible_version: "-core >=2.16,<2.17"
+      ansible_version: ${{ variables.ansible_version }}
       skip_git_test: true
       test_galaxy: true
 
-# CentOS 9 Stream
-
-- stage: CentOS_9_Stream
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      distro: c9s
-      ansible_version: "-core >=2.16,<2.17"
-      skip_git_test: true
-
-# CentOS 8 Stream
+# CentOS 8 Stream, latest supported Ansible version.
 
-- stage: CentOS_8_Stream
+- stage: c8s_ansible_2_16
   dependsOn: []
   jobs:
   - template: templates/group_tests.yml
diff --git a/infra/azure/build-containers.yml b/infra/azure/build-containers.yml
index a98b2e1100580848f9172c211dd320df86f473ea..8f6b57d8ef561ce0b4192db16919588a6a92e984 100644
--- a/infra/azure/build-containers.yml
+++ b/infra/azure/build-containers.yml
@@ -1,5 +1,4 @@
 ---
-
 schedules:
 - cron: "0 0 * * 0"
   displayName: Weekly Sunday midnight build
@@ -13,46 +12,24 @@ trigger: none
 pool:
   vmImage: 'ubuntu-24.04'
 
+variables: { distros: "fedora-latest,fedora-rawhide,c9s" }
+
 stages:
 
+- ${{ each distro in split(variables.distros, ',') }}:
+  - stage: build_${{ join('_', split(distro, '-')) }}
+    dependsOn: []
+    jobs:
+    - template: templates/build_container.yml
+      parameters:
+        distro: ${{ distro }}
+
+# Special case for CentOS 8 Stream
 - stage: CentOS_8_Stream
   dependsOn: []
   jobs:
   - template: templates/build_container.yml
     parameters:
-      job_name_suffix: C8S
       distro: c8s
       # ansible-core 2.17+ cannot be used to deploy on CentOS 8 Stream.
       ansible_core_version: "<2.17"
-
-- stage: CentOS_9_Stream
-  dependsOn: []
-  jobs:
-  - template: templates/build_container.yml
-    parameters:
-      job_name_suffix: C9S
-      distro: c9s
-
-- stage: CentOS_10_Stream
-  dependsOn: []
-  jobs:
-  - template: templates/build_container.yml
-    parameters:
-      job_name_suffix: C10S
-      distro: c10s
-
-- stage: Fedora_Latest
-  dependsOn: []
-  jobs:
-  - template: templates/build_container.yml
-    parameters:
-      job_name_suffix: FedoraLatest
-      distro: fedora-latest
-
-- stage: Fedora_Rawhide
-  dependsOn: []
-  jobs:
-  - template: templates/build_container.yml
-    parameters:
-      job_name_suffix: FedoraRawhide
-      distro: fedora-rawhide
diff --git a/infra/azure/nightly.yml b/infra/azure/nightly.yml
index 671571a04a14d41428cbe21d41047ae9568201f3..ded58778516e7b397ae984b06a2352db4609499c 100644
--- a/infra/azure/nightly.yml
+++ b/infra/azure/nightly.yml
@@ -12,115 +12,68 @@ trigger: none
 pool:
   vmImage: 'ubuntu-20.04'
 
-stages:
-
-# Fedora
-
-- stage: fedora_latest_Ansible_Core_2_15
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      distro: fedora-latest
-      ansible_version: "-core >=2.15,<2.16"
-      skip_git_test: true
-
-- stage: fedora_latest_Ansible_Core_2_16
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      distro: fedora-latest
-      ansible_version: ""
-      skip_git_test: true
-
-- stage: fedora_latest_Ansible_Core_2_17
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      distro: fedora-latest
-      ansible_version: "-core >=2.17"
-      skip_git_test: true
-
-# Galaxy on Fedora
-
-- stage: Galaxy_fedora_latest_Ansible_Core_2_17
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      distro: fedora-latest
-      ansible_version: "-core >=2.17,<2.18"
-      skip_git_test: true
-      test_galaxy: true
-
-# Fedora Rawhide
+variables:
+  # We need to have two sets, as c8s is not supported by all ansible versions
+  recent_distros: "fedora-latest,fedora-rawhide,c9s"
+  distros: "fedora-latest,fedora-rawhide,c9s,c8s"
+  ansible_latest: "-core"
+  ansible_minimum: "-core <2.16"
+  ansible_version: "-core >=2.16,<2.17"
 
-- stage: fedora_rawhide_Ansible_Core_2_17
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      distro: fedora-rawhide
-      ansible_version: "-core >=2.17,<2.18"
-      skip_git_test: true
-
-# CentoOS 9 Stream
-
-- stage: c9s_Ansible_Core_2_15
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      distro: c9s
-      ansible_version: "-core >=2.15,<2.16"
-      skip_git_test: true
-
-- stage: c9s_Ansible_Core_2_16
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      distro: c9s
-      ansible_version: "-core >=2.16,<2.17"
-      skip_git_test: true
-
-- stage: c9s_Ansible_Core_2_17
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      distro: c9s
-      ansible_version: "-core >=2.17,<2.18"
-      skip_git_test: true
-
-# CentOS 8 Stream only works up to ansible-core 2.16.z
-
-- stage: c8s_Ansible_Core_2_15
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      distro: c8s
-      ansible_version: "-core >=2.15,<2.16"
-      skip_git_test: true
+stages:
 
-- stage: c8s_Ansible_Core_2_16
-  dependsOn: []
-  jobs:
-  - template: templates/group_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      distro: c8s
-      ansible_version: "-core >=2.16,<2.17"
-      skip_git_test: true
+# Minimum ansible
+
+- ${{ each distro in split(variables.distros, ',') }}:
+  - stage: ${{ replace(distro, '-', '_') }}_ansible_2_15
+    dependsOn: []
+    jobs:
+    - template: templates/group_tests.yml
+      parameters:
+        build_number: $(Build.BuildNumber)
+        distro: fedora-latest
+        ansible_version: ${{ variables.ansible_minimum }}
+        skip_git_test: true
+        test_galaxy: false
+
+# Latest ansible
+
+- ${{ each distro in split(variables.recent_distros, ',') }}:
+  - stage: ${{ replace(distro, '-', '_') }}_ansible_latest
+    dependsOn: []
+    jobs:
+    - template: templates/group_tests.yml
+      parameters:
+        build_number: $(Build.BuildNumber)
+        distro: ${{ distro }}
+        ansible_version: ${{ variables.ansible_latest }}
+        skip_git_test: true
+        test_galaxy: false
+
+# Selected ansible-core version
+
+- ${{ each distro in split(variables.distros, ',') }}:
+  - stage: ${{ replace(distro, '-', '_') }}_ansible_2_16
+    dependsOn: []
+    jobs:
+    - template: templates/group_tests.yml
+      parameters:
+        build_number: $(Build.BuildNumber)
+        distro: ${{ distro }}
+        ansible_version: ${{ variables.ansible_version }}
+        skip_git_test: true
+        test_galaxy: false
+
+# Galaxy collection with selected ansible-core version
+
+- ${{ each distro in split(variables.distros, ',') }}:
+  - stage: galaxy_${{ replace(distro, '-', '_') }}_asible_2_16
+    dependsOn: []
+    jobs:
+    - template: templates/group_tests.yml
+      parameters:
+        build_number: $(Build.BuildNumber)
+        distro: ${{ distro }}
+        ansible_version: ${{ variables.ansible_version }}
+        skip_git_test: true
+        test_galaxy: true
diff --git a/infra/azure/pr-pipeline.yml b/infra/azure/pr-pipeline.yml
index bc6e0830b8b678a421c9b3380ff073cdbb864580..ea89f321cf20629883a3ba31f020e99585d724c1 100644
--- a/infra/azure/pr-pipeline.yml
+++ b/infra/azure/pr-pipeline.yml
@@ -5,65 +5,35 @@ trigger:
 pool:
   vmImage: 'ubuntu-20.04'
 
+variables:
+  distros: "fedora-latest,c9s,c8s,fedora-rawhide"
+  ansible_version: "-core >=2.15,<2.16"
+
 stages:
 
-# Fedora
+# Test with repository in all distros
 
-- stage: Fedora_Latest
-  dependsOn: []
-  jobs:
-  - template: templates/run_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      distro: fedora-latest
-      ansible_version: "-core >=2.15,<2.16"
-      skip_git_test: false
+- ${{ each distro in split(variables.distros, ',') }}:
+  - stage: ${{ replace(distro, '-', '_') }}_ansible_2_16
+    dependsOn: []
+    jobs:
+    - template: templates/run_tests.yml
+      parameters:
+        build_number: $(Build.BuildNumber)
+        distro: ${{ distro }}
+        ansible_version: ${{ variables.ansible_version }}
+        skip_git_test: false
+        test_galaxy: false
 
 # Galaxy on Fedora
 
-- stage: Galaxy_Fedora_Latest
+- stage: galaxy_fedora_latest_ansible_2_16
   dependsOn: []
   jobs:
   - template: templates/run_tests.yml
     parameters:
       build_number: $(Build.BuildNumber)
       distro: fedora-latest
-      ansible_version: "-core >=2.15,<2.16"
+      ansible_version: ${{ variables.ansible_version }}
       skip_git_test: false
       test_galaxy: true
-
-# CentOS 9 Stream
-
-- stage: CentOS_9_Stream
-  dependsOn: []
-  jobs:
-  - template: templates/run_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      distro: c9s
-      ansible_version: "-core >=2.15,<2.16"
-      skip_git_test: false
-
-# CentOS 8 Stream
-
-- stage: CentOS_8_Stream
-  dependsOn: []
-  jobs:
-  - template: templates/run_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      distro: c8s
-      ansible_version: "-core >=2.15,<2.16"
-      skip_git_test: false
-
-# Rawhide
-
-- stage: Fedora_Rawhide
-  dependsOn: []
-  jobs:
-  - template: templates/run_tests.yml
-    parameters:
-      build_number: $(Build.BuildNumber)
-      distro: fedora-rawhide
-      ansible_version: "-core >=2.15,<2.16"
-      skip_git_test: false
diff --git a/infra/azure/templates/build_container.yml b/infra/azure/templates/build_container.yml
index 4fa0b469fef922ba4522bd50351946bbe40af75a..e3c2bdea575f38cac9bb155d72e41ddf057108fe 100644
--- a/infra/azure/templates/build_container.yml
+++ b/infra/azure/templates/build_container.yml
@@ -1,7 +1,5 @@
 ---
 parameters:
-  - name: job_name_suffix
-    type: string
   - name: distro
     type: string
   - name: python_version
@@ -11,7 +9,7 @@ parameters:
     default: ""
 
 jobs:
-- job: BuildTestImage${{ parameters.job_name_suffix }}
+- job: BuildTestImage_${{ join('_', split(parameters.distro, '-')) }}
   displayName: Build ${{ parameters.distro }} test container
   steps:
   - task: UsePythonVersion@0