feat: allow for custom registry

This patch adds a simple CLI which can mirror all the images needed
as well as allow for simple override for `atmosphere_image_repository`
for all images.
diff --git a/roles/atmosphere/defaults/main.yml b/roles/atmosphere/defaults/main.yml
index bb1eb55..2de18fc 100644
--- a/roles/atmosphere/defaults/main.yml
+++ b/roles/atmosphere/defaults/main.yml
@@ -1,6 +1,7 @@
-atmosphere_image: quay.io/vexxhost/atmosphere:0.12.0 # x-release-please-version
+atmosphere_image: "{{ lookup('vexxhost.atmosphere.image_ref', 'atmosphere', output='ref') }}"
 
 atmosphere_config:
+  image_repository: "{{ atmosphere_image_repository | default('') }}"
   kube_prometheus_stack:
     overrides: "{{ kube_prometheus_stack_values | default({}) }}"
   memcached:
diff --git a/roles/ceph_csi_rbd/tasks/main.yml b/roles/ceph_csi_rbd/tasks/main.yml
index 9f42a44..fdb34ae 100644
--- a/roles/ceph_csi_rbd/tasks/main.yml
+++ b/roles/ceph_csi_rbd/tasks/main.yml
@@ -78,9 +78,27 @@
             nodeplugin:
               httpMetrics:
                 containerPort: 8081
+              registrar:
+                image:
+                  repository: "{{ lookup('vexxhost.atmosphere.image_ref', 'csi_node_driver_registrar', output='name') }}"
+              plugin:
+                image:
+                  repository: "{{ lookup('vexxhost.atmosphere.image_ref', 'csi_rbd_plugin', output='name') }}"
             provisioner:
               nodeSelector:
                 openstack-control-plane: enabled
+              provisioner:
+                image:
+                  repository: "{{ lookup('vexxhost.atmosphere.image_ref', 'csi_rbd_provisioner', output='name') }}"
+              attacher:
+                image:
+                  repository: "{{ lookup('vexxhost.atmosphere.image_ref', 'csi_rbd_attacher', output='name') }}"
+              resizer:
+                image:
+                  repository: "{{ lookup('vexxhost.atmosphere.image_ref', 'csi_rbd_resizer', output='name') }}"
+              snapshotter:
+                image:
+                  repository: "{{ lookup('vexxhost.atmosphere.image_ref', 'csi_rbd_snapshotter', output='name') }}"
             storageClass:
               create: true
               name: general
diff --git a/roles/cilium/tasks/main.yml b/roles/cilium/tasks/main.yml
index fbb34b5..def4496 100644
--- a/roles/cilium/tasks/main.yml
+++ b/roles/cilium/tasks/main.yml
@@ -25,8 +25,12 @@
     release_namespace: kube-system
     kubeconfig: /etc/kubernetes/admin.conf
     values:
+      image:
+        repository: "{{ lookup('vexxhost.atmosphere.image_ref', 'cilium_node', output='name') }}"
       tunnel: geneve
       operator:
+        image:
+          repository: "{{ lookup('vexxhost.atmosphere.image_ref', 'cilium_operator', output='name') | replace('-generic', '') }}"
         nodeSelector:
           openstack-control-plane: enabled
       ipam:
diff --git a/roles/containerd/defaults/main.yml b/roles/containerd/defaults/main.yml
index 2b742d1..60d4249 100644
--- a/roles/containerd/defaults/main.yml
+++ b/roles/containerd/defaults/main.yml
@@ -17,3 +17,5 @@
 containerd_pause_image: k8s.gcr.io/pause:3.5
 
                                                                    # ]]]
+
+containerd_insecure_registries: []
diff --git a/roles/containerd/templates/config.toml.j2 b/roles/containerd/templates/config.toml.j2
index 84cad6d..16c0ae1 100644
--- a/roles/containerd/templates/config.toml.j2
+++ b/roles/containerd/templates/config.toml.j2
@@ -3,3 +3,14 @@
 [plugins]
   [plugins."io.containerd.grpc.v1.cri"]
     sandbox_image = "{{ containerd_pause_image }}"
+  [plugins."io.containerd.grpc.v1.cri".registry]
+    [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
+      {% for registry in containerd_insecure_registries %}
+      [plugins."io.containerd.grpc.v1.cri".registry.mirrors."{{ registry }}"]
+        endpoint = ["http://{{ registry }}"]
+      {% endfor %}
+    [plugins."io.containerd.grpc.v1.cri".registry.configs]
+      {% for registry in containerd_insecure_registries %}
+      [plugins."io.containerd.grpc.v1.cri".registry.configs."{{ registry }}".tls]
+        insecure_skip_verify = true
+      {% endfor %}
diff --git a/roles/coredns/tasks/main.yml b/roles/coredns/tasks/main.yml
index cda29f0..dceb12b 100644
--- a/roles/coredns/tasks/main.yml
+++ b/roles/coredns/tasks/main.yml
@@ -31,6 +31,8 @@
                 kind: HelmRepository
                 name: coredns
           values:
+            image:
+              repository: "{{ lookup('vexxhost.atmosphere.image_ref', 'neutron_coredns', output='name') }}"
             replicaCount: 3
             prometheus:
               service:
diff --git a/roles/flux/tasks/main.yml b/roles/flux/tasks/main.yml
index bb89eff..adf55a9 100644
--- a/roles/flux/tasks/main.yml
+++ b/roles/flux/tasks/main.yml
@@ -7,4 +7,4 @@
 - name: Install Flux to cluster
   run_once: true
   changed_when: false
-  ansible.builtin.command: flux install
+  ansible.builtin.command: flux install {% if atmosphere_image_repository %}--registry={{ atmosphere_image_repository }}{% endif %}
diff --git a/roles/ipmi_exporter/defaults/main.yml b/roles/ipmi_exporter/defaults/main.yml
index 7530b07..0e9d2be 100644
--- a/roles/ipmi_exporter/defaults/main.yml
+++ b/roles/ipmi_exporter/defaults/main.yml
@@ -36,15 +36,3 @@
         - 185 # Entity Presence (Dell PowerEdge servers)
 
                                                                    # ]]]
-# .. envvar:: ipmi_exporter_image_repository [[[
-#
-# Keepalived container image repository location
-ipmi_exporter_image_repository: "{{ atmosphere_image_repository | default('us-docker.pkg.dev/vexxhost-infra/openstack') }}"
-
-                                                                   # ]]]
-# .. envvar:: ipmi_exporter_image_tag [[[
-#
-# Keepalived container image tag
-ipmi_exporter_image_tag: 1.4.0
-
-                                                                   # ]]]
diff --git a/roles/ipmi_exporter/tasks/main.yml b/roles/ipmi_exporter/tasks/main.yml
index bcc25d8..31cd4c4 100644
--- a/roles/ipmi_exporter/tasks/main.yml
+++ b/roles/ipmi_exporter/tasks/main.yml
@@ -47,7 +47,7 @@
             spec:
               containers:
                 - name: exporter
-                  image: "{{ ipmi_exporter_image_repository }}/ipmi-exporter:{{ ipmi_exporter_image_tag }}"
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'prometheus_ipmi_exporter', output='ref') }}"
                   ports:
                     - name: metrics
                       containerPort: 9290
diff --git a/roles/keepalived/defaults/main.yml b/roles/keepalived/defaults/main.yml
index 5fddd22..ac9309e 100644
--- a/roles/keepalived/defaults/main.yml
+++ b/roles/keepalived/defaults/main.yml
@@ -36,18 +36,6 @@
 keepalived_interface: "{{ undef(hint='You must specify a Keepalived virtual IP interface') }}"
 
                                                                    # ]]]
-# .. envvar:: keepalived_image_repository [[[
-#
-# Keepalived container image repository location
-keepalived_image_repository: "{{ atmosphere_image_repository | default('us-docker.pkg.dev/vexxhost-infra/openstack') }}"
-
-                                                                   # ]]]
-# .. envvar:: keepalived_image_tag [[[
-#
-# Keepalived container image tag
-keepalived_image_tag: 2.0.19
-
-                                                                   # ]]]
 # .. envvar:: keepalived_vrid [[[
 #
 # Keepalived virtual router id
diff --git a/roles/keepalived/tasks/main.yml b/roles/keepalived/tasks/main.yml
index dedddfc..d401c4b 100644
--- a/roles/keepalived/tasks/main.yml
+++ b/roles/keepalived/tasks/main.yml
@@ -118,7 +118,7 @@
               automountServiceAccountToken: true
               initContainers:
                 - name: init
-                  image: "{{ keepalived_image_repository }}/kubernetes-entrypoint:latest"
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'dep_check', output='ref') }}"
                   env:
                     - name: NAMESPACE
                       valueFrom:
@@ -133,7 +133,7 @@
                     - name: DEPENDENCY_POD_JSON
                       value: '[{"labels":{"application":"neutron","component":"neutron-ovs-agent"},"requireSameNode":true}]'
                 - name: wait-for-ip
-                  image: "{{ keepalived_image_repository }}/keepalived:{{ keepalived_image_tag }}"
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'keepalived', output='ref') }}"
                   command:
                     - /bin/wait-for-ip.sh
                   volumeMounts:
@@ -144,7 +144,7 @@
                       subPath: wait-for-ip.sh
               containers:
                 - name: keepalived
-                  image: "{{ keepalived_image_repository }}/keepalived:{{ keepalived_image_tag }}"
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'keepalived', output='ref') }}"
                   command:
                     - keepalived
                     - -f
diff --git a/roles/kubernetes/defaults/main.yml b/roles/kubernetes/defaults/main.yml
index abc45b9..40c25ff 100644
--- a/roles/kubernetes/defaults/main.yml
+++ b/roles/kubernetes/defaults/main.yml
@@ -20,7 +20,7 @@
 # .. envvar:: kubernetes_version [[[
 #
 # Kubernetes version
-kubernetes_version: 1.22.7
+kubernetes_version: 1.22.17
 
                                                                    # ]]]
 # .. envvar:: kubernetes_kernel_modules [[[
diff --git a/roles/kubernetes/tasks/control-plane.yml b/roles/kubernetes/tasks/control-plane.yml
index 6545c41..9d444d7 100644
--- a/roles/kubernetes/tasks/control-plane.yml
+++ b/roles/kubernetes/tasks/control-plane.yml
@@ -35,8 +35,8 @@
         dest: /etc/keepalived/check_apiserver.sh
         mode: 0755
     - name: Upload Kubernetes manifest
-      ansible.builtin.copy:
-        src: keepalived.yaml
+      ansible.builtin.template:
+        src: keepalived.yaml.j2
         dest: /etc/kubernetes/manifests/keepalived.yaml
         owner: root
         group: root
@@ -60,8 +60,8 @@
         group: root
         mode: 0644
     - name: Upload Kubernetes manifest
-      ansible.builtin.copy:
-        src: haproxy.yaml
+      ansible.builtin.template:
+        src: haproxy.yaml.j2
         dest: /etc/kubernetes/manifests/haproxy.yaml
         owner: root
         group: root
diff --git a/roles/kubernetes/files/haproxy.yaml b/roles/kubernetes/templates/haproxy.yaml.j2
similarity index 82%
rename from roles/kubernetes/files/haproxy.yaml
rename to roles/kubernetes/templates/haproxy.yaml.j2
index 0d6ea23..e780b05 100644
--- a/roles/kubernetes/files/haproxy.yaml
+++ b/roles/kubernetes/templates/haproxy.yaml.j2
@@ -5,8 +5,8 @@
   namespace: kube-system
 spec:
   containers:
-    - image: haproxy:2.5
-      name: haproxy
+    - name: haproxy
+      image: "{{ lookup('vexxhost.atmosphere.image_ref', 'haproxy', output='ref') }}"
       livenessProbe:
         failureThreshold: 8
         httpGet:
diff --git a/roles/kubernetes/files/keepalived.yaml b/roles/kubernetes/templates/keepalived.yaml.j2
similarity index 89%
rename from roles/kubernetes/files/keepalived.yaml
rename to roles/kubernetes/templates/keepalived.yaml.j2
index 5926af8..0312b42 100644
--- a/roles/kubernetes/files/keepalived.yaml
+++ b/roles/kubernetes/templates/keepalived.yaml.j2
@@ -7,7 +7,7 @@
 spec:
   containers:
     - name: keepalived
-      image: us-docker.pkg.dev/vexxhost-infra/openstack/keepalived:2.0.19
+      image: "{{ lookup('vexxhost.atmosphere.image_ref', 'keepalived', output='ref') }}"
       command: ["keepalived", "-f", "/etc/keepalived/keepalived.conf", "--dont-fork", "--log-console", "--log-detail", "--dump-conf"]
       resources: {}
       securityContext:
diff --git a/roles/kubernetes/templates/kubeadm.yaml.j2 b/roles/kubernetes/templates/kubeadm.yaml.j2
index e12280b..f4689a0 100644
--- a/roles/kubernetes/templates/kubeadm.yaml.j2
+++ b/roles/kubernetes/templates/kubeadm.yaml.j2
@@ -37,6 +37,9 @@
 apiVersion: kubeadm.k8s.io/v1beta3
 kind: ClusterConfiguration
 controlPlaneEndpoint: "{{ kubernetes_hostname }}:6443"
+{% if atmosphere_image_repository is defined %}
+imageRepository: "{{ atmosphere_image_repository }}"
+{% endif %}
 apiServer:
   extraArgs:
     oidc-username-claim: email
diff --git a/roles/openstack_exporter/defaults/main.yml b/roles/openstack_exporter/defaults/main.yml
deleted file mode 100644
index 5613cb4..0000000
--- a/roles/openstack_exporter/defaults/main.yml
+++ /dev/null
@@ -1,24 +0,0 @@
----
-# .. vim: foldmarker=[[[,]]]:foldmethod=marker
-
-# .. Copyright (C) 2022 VEXXHOST, Inc.
-# .. SPDX-License-Identifier: Apache-2.0
-
-# Default variables
-# =================
-
-# .. contents:: Sections
-#    :local:
-
-# .. envvar:: openstack_exporter_image_repository [[[
-#
-# OpenStack-exporter container image repository location
-openstack_exporter_image_repository: "ghcr.io/openstack-exporter"
-
-                                                                   # ]]]
-# .. envvar:: openstack_exporter_image_tag [[[
-#
-# openstack-exporter container image tag
-openstack_exporter_image_tag: 1.6.0
-
-                                                                   # ]]]
diff --git a/roles/openstack_exporter/tasks/main.yml b/roles/openstack_exporter/tasks/main.yml
index 902fa2e..83cf8c1 100644
--- a/roles/openstack_exporter/tasks/main.yml
+++ b/roles/openstack_exporter/tasks/main.yml
@@ -65,7 +65,7 @@
                       mountPath: /etc/openstack
               containers:
                 - name: openstack-exporter
-                  image: "{{ openstack_exporter_image_repository }}/openstack-exporter:{{ openstack_exporter_image_tag }}"
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'prometheus_openstack_exporter', output='ref') }}"
                   args:
                     - --endpoint-type
                     - internal
diff --git a/roles/openstack_helm_barbican/defaults/main.yml b/roles/openstack_helm_barbican/defaults/main.yml
index 0afbbbf..b499584 100644
--- a/roles/openstack_helm_barbican/defaults/main.yml
+++ b/roles/openstack_helm_barbican/defaults/main.yml
@@ -11,24 +11,6 @@
 #    :local:
 
 
-# .. envvar:: openstack_helm_barbican_image_repository [[[
-#
-# Image repository location to be prefixed for all images
-openstack_helm_barbican_image_repository: "{{ atmosphere_image_repository | default('quay.io/vexxhost') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_barbican_image_tag [[[
-#
-# Image tag for container
-openstack_helm_barbican_image_tag: "{{ atmosphere_openstack_release | default('wallaby') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_barbican_heat_image_tag [[[
-#
-# Image tag for Heat to be used for jobs running via Helm hooks
-openstack_helm_barbican_heat_image_tag: "{{ atmosphere_openstack_release | default('wallaby') }}"
-
-                                                                   # ]]]
 # .. envvar:: openstack_helm_barbican_values [[[
 #
 # Overrides for Helm chart values
diff --git a/roles/openstack_helm_barbican/vars/main.yml b/roles/openstack_helm_barbican/vars/main.yml
index 4f04ebb..0b3f894 100644
--- a/roles/openstack_helm_barbican/vars/main.yml
+++ b/roles/openstack_helm_barbican/vars/main.yml
@@ -17,16 +17,16 @@
   images:
     pull_policy: Always
     tags:
-      bootstrap: "{{ openstack_helm_barbican_image_repository }}/heat:{{ openstack_helm_barbican_heat_image_tag }}"
-      db_drop: "{{ openstack_helm_barbican_image_repository }}/heat:{{ openstack_helm_barbican_heat_image_tag }}"
-      db_init: "{{ openstack_helm_barbican_image_repository }}/heat:{{ openstack_helm_barbican_heat_image_tag }}"
-      dep_check: "{{ openstack_helm_barbican_image_repository }}/kubernetes-entrypoint:latest"
-      ks_endpoints: "{{ openstack_helm_barbican_image_repository }}/heat:{{ openstack_helm_barbican_heat_image_tag }}"
-      ks_service: "{{ openstack_helm_barbican_image_repository }}/heat:{{ openstack_helm_barbican_heat_image_tag }}"
-      ks_user: "{{ openstack_helm_barbican_image_repository }}/heat:{{ openstack_helm_barbican_heat_image_tag }}"
-      barbican_db_sync: "{{ openstack_helm_barbican_image_repository }}/barbican:{{ openstack_helm_barbican_image_tag }}"
-      barbican_api: "{{ openstack_helm_barbican_image_repository }}/barbican:{{ openstack_helm_barbican_image_tag }}"
-      rabbit_init: "{{ openstack_helm_barbican_image_repository }}/rabbitmq:3.8.23-management"
+      bootstrap: "{{ lookup('vexxhost.atmosphere.image_ref', 'bootstrap', output='ref') }}"
+      db_drop: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_drop', output='ref') }}"
+      db_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_init', output='ref') }}"
+      dep_check: "{{ lookup('vexxhost.atmosphere.image_ref', 'dep_check', output='ref') }}"
+      ks_endpoints: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_endpoints', output='ref') }}"
+      ks_service: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_service', output='ref') }}"
+      ks_user: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_user', output='ref') }}"
+      barbican_db_sync: "{{ lookup('vexxhost.atmosphere.image_ref', 'barbican_db_sync', output='ref') }}"
+      barbican_api: "{{ lookup('vexxhost.atmosphere.image_ref', 'barbican_api', output='ref') }}"
+      rabbit_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'rabbit_init', output='ref') }}"
   pod:
     replicas:
       api: 3
diff --git a/roles/openstack_helm_cinder/defaults/main.yml b/roles/openstack_helm_cinder/defaults/main.yml
index ac13a22..ef5f45c 100644
--- a/roles/openstack_helm_cinder/defaults/main.yml
+++ b/roles/openstack_helm_cinder/defaults/main.yml
@@ -11,24 +11,6 @@
 #    :local:
 
 
-# .. envvar:: openstack_helm_cinder_image_repository [[[
-#
-# Image repository location to be prefixed for all images
-openstack_helm_cinder_image_repository: "{{ atmosphere_image_repository | default('quay.io/vexxhost') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_cinder_image_tag [[[
-#
-# Image tag for container
-openstack_helm_cinder_image_tag: "{{ atmosphere_openstack_release | default('zed') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_cinder_heat_image_tag [[[
-#
-# Image tag for Heat to be used for jobs running via Helm hooks
-openstack_helm_cinder_heat_image_tag: "{{ atmosphere_openstack_release | default('zed') }}"
-
-                                                                   # ]]]
 # .. envvar:: openstack_helm_cinder_values [[[
 #
 # Overrides for Helm chart values
diff --git a/roles/openstack_helm_cinder/vars/main.yml b/roles/openstack_helm_cinder/vars/main.yml
index b0b8ff9..f2c5347 100644
--- a/roles/openstack_helm_cinder/vars/main.yml
+++ b/roles/openstack_helm_cinder/vars/main.yml
@@ -17,22 +17,22 @@
   images:
     pull_policy: Always
     tags:
-      bootstrap: "{{ openstack_helm_cinder_image_repository }}/heat:{{ openstack_helm_cinder_heat_image_tag }}"
-      cinder_api: "{{ openstack_helm_cinder_image_repository }}/cinder:{{ openstack_helm_cinder_image_tag }}"
-      cinder_backup_storage_init: "{{ openstack_helm_cinder_image_repository }}/cinder:{{ openstack_helm_cinder_image_tag }}"
-      cinder_backup: "{{ openstack_helm_cinder_image_repository }}/cinder:{{ openstack_helm_cinder_image_tag }}"
-      cinder_db_sync: "{{ openstack_helm_cinder_image_repository }}/cinder:{{ openstack_helm_cinder_image_tag }}"
-      cinder_scheduler: "{{ openstack_helm_cinder_image_repository }}/cinder:{{ openstack_helm_cinder_image_tag }}"
-      cinder_storage_init: "{{ openstack_helm_cinder_image_repository }}/cinder:{{ openstack_helm_cinder_image_tag }}"
-      cinder_volume_usage_audit: "{{ openstack_helm_cinder_image_repository }}/cinder:{{ openstack_helm_cinder_image_tag }}"
-      cinder_volume: "{{ openstack_helm_cinder_image_repository }}/cinder:{{ openstack_helm_cinder_image_tag }}"
-      db_drop: "{{ openstack_helm_cinder_image_repository }}/heat:{{ openstack_helm_cinder_heat_image_tag }}"
-      db_init: "{{ openstack_helm_cinder_image_repository }}/heat:{{ openstack_helm_cinder_heat_image_tag }}"
-      dep_check: "{{ openstack_helm_cinder_image_repository }}/kubernetes-entrypoint:latest"
-      ks_endpoints: "{{ openstack_helm_cinder_image_repository }}/heat:{{ openstack_helm_cinder_heat_image_tag }}"
-      ks_service: "{{ openstack_helm_cinder_image_repository }}/heat:{{ openstack_helm_cinder_heat_image_tag }}"
-      ks_user: "{{ openstack_helm_cinder_image_repository }}/heat:{{ openstack_helm_cinder_heat_image_tag }}"
-      rabbit_init: "{{ openstack_helm_cinder_image_repository }}/rabbitmq:3.8.23-management"
+      bootstrap: "{{ lookup('vexxhost.atmosphere.image_ref', 'bootstrap', output='ref') }}"
+      cinder_api: "{{ lookup('vexxhost.atmosphere.image_ref', 'cinder_api', output='ref') }}"
+      cinder_backup_storage_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'cinder_backup_storage_init', output='ref') }}"
+      cinder_backup: "{{ lookup('vexxhost.atmosphere.image_ref', 'cinder_backup', output='ref') }}"
+      cinder_db_sync: "{{ lookup('vexxhost.atmosphere.image_ref', 'cinder_db_sync', output='ref') }}"
+      cinder_scheduler: "{{ lookup('vexxhost.atmosphere.image_ref', 'cinder_scheduler', output='ref') }}"
+      cinder_storage_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'cinder_storage_init', output='ref') }}"
+      cinder_volume_usage_audit: "{{ lookup('vexxhost.atmosphere.image_ref', 'cinder_volume_usage_audit', output='ref') }}"
+      cinder_volume: "{{ lookup('vexxhost.atmosphere.image_ref', 'cinder_volume', output='ref') }}"
+      db_drop: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_drop', output='ref') }}"
+      db_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_init', output='ref') }}"
+      dep_check: "{{ lookup('vexxhost.atmosphere.image_ref', 'dep_check', output='ref') }}"
+      ks_endpoints: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_endpoints', output='ref') }}"
+      ks_service: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_service', output='ref') }}"
+      ks_user: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_user', output='ref') }}"
+      rabbit_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'rabbit_init', output='ref') }}"
   pod:
     replicas:
       api: 3
diff --git a/roles/openstack_helm_designate/defaults/main.yml b/roles/openstack_helm_designate/defaults/main.yml
index 0a54f7d..63aafb4 100644
--- a/roles/openstack_helm_designate/defaults/main.yml
+++ b/roles/openstack_helm_designate/defaults/main.yml
@@ -11,42 +11,6 @@
 #    :local:
 
 
-# .. envvar:: openstack_helm_designate_chart_repo_name [[[
-#
-# Helm repository name for the chart.
-openstack_helm_designate_chart_repo_name: openstack-helm
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_designate_chart_repo_url [[[
-#
-# Helm repository URL for the chart.
-openstack_helm_designate_chart_repo_url: https://tarballs.opendev.org/openstack/openstack-helm/
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_designate_chart_name [[[
-#
-# Helm chart name (will also be used for release name)
-openstack_helm_designate_chart_name: designate
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_designate_image_repository [[[
-#
-# Image repository location to be prefixed for all images
-openstack_helm_designate_image_repository: "{{ atmosphere_image_repository | default('quay.io/vexxhost') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_designate_image_tag [[[
-#
-# Image tag for container
-openstack_helm_designate_image_tag: zed
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_designate_heat_image_tag [[[
-#
-# Image tag for Heat to be used for jobs running via Helm hooks
-openstack_helm_designate_heat_image_tag: zed
-
-                                                                   # ]]]
 # .. envvar:: openstack_helm_designate_values [[[
 #
 # Overrides for Helm chart values
diff --git a/roles/openstack_helm_designate/vars/main.yml b/roles/openstack_helm_designate/vars/main.yml
index 54d88d5..a4a209e 100644
--- a/roles/openstack_helm_designate/vars/main.yml
+++ b/roles/openstack_helm_designate/vars/main.yml
@@ -18,21 +18,21 @@
   endpoints: "{{ openstack_helm_endpoints }}"
   images:
     tags:
-      bootstrap: "{{ openstack_helm_designate_image_repository }}/heat:{{ openstack_helm_designate_heat_image_tag }}"
-      db_init: "{{ openstack_helm_designate_image_repository }}/heat:{{ openstack_helm_designate_heat_image_tag }}"
-      db_drop: "{{ openstack_helm_designate_image_repository }}/heat:{{ openstack_helm_designate_heat_image_tag }}"
-      rabbit_init: "{{ openstack_helm_designate_image_repository }}/rabbitmq:3.8.23-management"
-      ks_user: "{{ openstack_helm_designate_image_repository }}/heat:{{ openstack_helm_designate_heat_image_tag }}"
-      ks_service: "{{ openstack_helm_designate_image_repository }}/heat:{{ openstack_helm_designate_heat_image_tag }}"
-      ks_endpoints: "{{ openstack_helm_designate_image_repository }}/heat:{{ openstack_helm_designate_heat_image_tag }}"
-      dep_check: "{{ openstack_helm_designate_image_repository }}/kubernetes-entrypoint:latest"
-      designate_db_sync: "{{ openstack_helm_designate_image_repository }}/designate:{{ openstack_helm_designate_image_tag }}"
-      designate_api: "{{ openstack_helm_designate_image_repository }}/designate:{{ openstack_helm_designate_image_tag }}"
-      designate_central: "{{ openstack_helm_designate_image_repository }}/designate:{{ openstack_helm_designate_image_tag }}"
-      designate_mdns: "{{ openstack_helm_designate_image_repository }}/designate:{{ openstack_helm_designate_image_tag }}"
-      designate_worker: "{{ openstack_helm_designate_image_repository }}/designate:{{ openstack_helm_designate_image_tag }}"
-      designate_producer: "{{ openstack_helm_designate_image_repository }}/designate:{{ openstack_helm_designate_image_tag }}"
-      designate_sink: "{{ openstack_helm_designate_image_repository }}/designate:{{ openstack_helm_designate_image_tag }}"
+      bootstrap: "{{ lookup('vexxhost.atmosphere.image_ref', 'bootstrap', output='ref') }}"
+      db_drop: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_drop', output='ref') }}"
+      db_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_init', output='ref') }}"
+      rabbit_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'rabbit_init', output='ref') }}"
+      ks_endpoints: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_endpoints', output='ref') }}"
+      ks_service: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_service', output='ref') }}"
+      ks_user: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_user', output='ref') }}"
+      dep_check: "{{ lookup('vexxhost.atmosphere.image_ref', 'dep_check', output='ref') }}"
+      designate_db_sync: "{{ lookup('vexxhost.atmosphere.image_ref', 'designate_db_sync', output='ref') }}"
+      designate_api: "{{ lookup('vexxhost.atmosphere.image_ref', 'designate_api', output='ref') }}"
+      designate_central: "{{ lookup('vexxhost.atmosphere.image_ref', 'designate_central', output='ref') }}"
+      designate_mdns: "{{ lookup('vexxhost.atmosphere.image_ref', 'designate_mdns', output='ref') }}"
+      designate_worker: "{{ lookup('vexxhost.atmosphere.image_ref', 'designate_worker', output='ref') }}"
+      designate_producer: "{{ lookup('vexxhost.atmosphere.image_ref', 'designate_producer', output='ref') }}"
+      designate_sink: "{{ lookup('vexxhost.atmosphere.image_ref', 'designate_sink', output='ref') }}"
   pod:
     replicas:
       api: 3
diff --git a/roles/openstack_helm_glance/defaults/main.yml b/roles/openstack_helm_glance/defaults/main.yml
index 42e450a..5f49454 100644
--- a/roles/openstack_helm_glance/defaults/main.yml
+++ b/roles/openstack_helm_glance/defaults/main.yml
@@ -11,24 +11,6 @@
 #    :local:
 
 
-# .. envvar:: openstack_helm_glance_image_repository [[[
-#
-# Image repository location to be prefixed for all images
-openstack_helm_glance_image_repository: "{{ atmosphere_image_repository | default('quay.io/vexxhost') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_glance_image_tag [[[
-#
-# Image tag for container
-openstack_helm_glance_image_tag: "{{ atmosphere_openstack_release | default('zed') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_glance_heat_image_tag [[[
-#
-# Image tag for Heat to be used for jobs running via Helm hooks
-openstack_helm_glance_heat_image_tag: "{{ atmosphere_openstack_release | default('zed') }}"
-
-                                                                   # ]]]
 # .. envvar:: openstack_helm_glance_values [[[
 #
 # Overrides for Helm chart values
diff --git a/roles/openstack_helm_glance/vars/main.yml b/roles/openstack_helm_glance/vars/main.yml
index 7bb4fbd..8053896 100644
--- a/roles/openstack_helm_glance/vars/main.yml
+++ b/roles/openstack_helm_glance/vars/main.yml
@@ -18,19 +18,19 @@
   images:
     pull_policy: Always
     tags:
-      bootstrap: "{{ openstack_helm_glance_image_repository }}/heat:{{ openstack_helm_glance_heat_image_tag }}"
-      db_drop: "{{ openstack_helm_glance_image_repository }}/heat:{{ openstack_helm_glance_heat_image_tag }}"
-      db_init: "{{ openstack_helm_glance_image_repository }}/heat:{{ openstack_helm_glance_heat_image_tag }}"
-      dep_check: "{{ openstack_helm_glance_image_repository }}/kubernetes-entrypoint:latest"
-      glance_api: "{{ openstack_helm_glance_image_repository }}/glance:{{ openstack_helm_glance_image_tag }}"
-      glance_db_sync: "{{ openstack_helm_glance_image_repository }}/glance:{{ openstack_helm_glance_image_tag }}"
-      glance_metadefs_load: "{{ openstack_helm_glance_image_repository }}/glance:{{ openstack_helm_glance_image_tag }}"
-      glance_registry: "{{ openstack_helm_glance_image_repository }}/glance:{{ openstack_helm_glance_image_tag }}"
-      glance_storage_init: "{{ openstack_helm_glance_image_repository }}/glance:{{ openstack_helm_glance_image_tag }}"
-      ks_endpoints: "{{ openstack_helm_glance_image_repository }}/heat:{{ openstack_helm_glance_heat_image_tag }}"
-      ks_service: "{{ openstack_helm_glance_image_repository }}/heat:{{ openstack_helm_glance_heat_image_tag }}"
-      ks_user: "{{ openstack_helm_glance_image_repository }}/heat:{{ openstack_helm_glance_heat_image_tag }}"
-      rabbit_init: "{{ openstack_helm_glance_image_repository }}/rabbitmq:3.8.23-management"
+      bootstrap: "{{ lookup('vexxhost.atmosphere.image_ref', 'bootstrap', output='ref') }}"
+      db_drop: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_drop', output='ref') }}"
+      db_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_init', output='ref') }}"
+      dep_check: "{{ lookup('vexxhost.atmosphere.image_ref', 'dep_check', output='ref') }}"
+      glance_api: "{{ lookup('vexxhost.atmosphere.image_ref', 'glance_api', output='ref') }}"
+      glance_db_sync: "{{ lookup('vexxhost.atmosphere.image_ref', 'glance_db_sync', output='ref') }}"
+      glance_metadefs_load: "{{ lookup('vexxhost.atmosphere.image_ref', 'glance_metadefs_load', output='ref') }}"
+      glance_registry: "{{ lookup('vexxhost.atmosphere.image_ref', 'glance_registry', output='ref') }}"
+      glance_storage_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'glance_storage_init', output='ref') }}"
+      ks_endpoints: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_endpoints', output='ref') }}"
+      ks_service: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_service', output='ref') }}"
+      ks_user: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_user', output='ref') }}"
+      rabbit_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'rabbit_init', output='ref') }}"
   bootstrap:
     enabled: false
   pod:
diff --git a/roles/openstack_helm_heat/defaults/main.yml b/roles/openstack_helm_heat/defaults/main.yml
index 8b10d53..bbbe6d33 100644
--- a/roles/openstack_helm_heat/defaults/main.yml
+++ b/roles/openstack_helm_heat/defaults/main.yml
@@ -11,36 +11,12 @@
 #    :local:
 
 
-# .. envvar:: openstack_helm_heat_image_repository [[[
-#
-# Image repository location to be prefixed for all images
-openstack_helm_heat_image_repository: "{{ atmosphere_image_repository | default('us-docker.pkg.dev/vexxhost-infra/openstack') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_heat_image_tag [[[
-#
-# Image tag for container
-openstack_helm_heat_image_tag: "{{ atmosphere_openstack_release | default('wallaby') }}"
-
-                                                                   # ]]]
 # .. envvar:: openstack_helm_heat_auth_encryption_key [[[
 #
 # Unique value to use for encrypting Heat secrets
 openstack_helm_heat_auth_encryption_key: "{{ undef(hint='You must specifiy an encryption key for Heat.') }}"
 
                                                                    # ]]]
-# .. envvar:: openstack_helm_heat_diff [[[
-#
-# Disable a diff of the release values and ask for manual confirmation
-openstack_helm_heat_diff: false
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_heat_migrate_from_mariadb [[[
-#
-# Execute a migration from legacy MariaDB to Percona XtraDB cluster
-openstack_helm_heat_migrate_from_mariadb: false
-
-                                                                   # ]]]
 # .. envvar:: openstack_helm_heat_values [[[
 #
 # Overrides for Helm chart values
diff --git a/roles/openstack_helm_heat/vars/main.yml b/roles/openstack_helm_heat/vars/main.yml
index e56d820..1eb2bc9 100644
--- a/roles/openstack_helm_heat/vars/main.yml
+++ b/roles/openstack_helm_heat/vars/main.yml
@@ -18,21 +18,21 @@
   images:
     pull_policy: Always
     tags:
-      bootstrap: "{{ openstack_helm_heat_image_repository }}/heat:{{ openstack_helm_heat_image_tag }}"
-      db_drop: "{{ openstack_helm_heat_image_repository }}/heat:{{ openstack_helm_heat_image_tag }}"
-      db_init: "{{ openstack_helm_heat_image_repository }}/heat:{{ openstack_helm_heat_image_tag }}"
-      dep_check: "{{ openstack_helm_heat_image_repository }}/kubernetes-entrypoint:latest"
-      heat_api: "{{ openstack_helm_heat_image_repository }}/heat:{{ openstack_helm_heat_image_tag }}"
-      heat_cfn: "{{ openstack_helm_heat_image_repository }}/heat:{{ openstack_helm_heat_image_tag }}"
-      heat_cloudwatch: "{{ openstack_helm_heat_image_repository }}/heat:{{ openstack_helm_heat_image_tag }}"
-      heat_db_sync: "{{ openstack_helm_heat_image_repository }}/heat:{{ openstack_helm_heat_image_tag }}"
-      heat_engine_cleaner: "{{ openstack_helm_heat_image_repository }}/heat:{{ openstack_helm_heat_image_tag }}"
-      heat_engine: "{{ openstack_helm_heat_image_repository }}/heat:{{ openstack_helm_heat_image_tag }}"
-      heat_purge_deleted: "{{ openstack_helm_heat_image_repository }}/heat:{{ openstack_helm_heat_image_tag }}"
-      ks_endpoints: "{{ openstack_helm_heat_image_repository }}/heat:{{ openstack_helm_heat_image_tag }}"
-      ks_service: "{{ openstack_helm_heat_image_repository }}/heat:{{ openstack_helm_heat_image_tag }}"
-      ks_user: "{{ openstack_helm_heat_image_repository }}/heat:{{ openstack_helm_heat_image_tag }}"
-      rabbit_init: "{{ openstack_helm_heat_image_repository }}/rabbitmq:3.8.23-management"
+      bootstrap: "{{ lookup('vexxhost.atmosphere.image_ref', 'bootstrap', output='ref') }}"
+      db_drop: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_drop', output='ref') }}"
+      db_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_init', output='ref') }}"
+      dep_check: "{{ lookup('vexxhost.atmosphere.image_ref', 'dep_check', output='ref') }}"
+      heat_api: "{{ lookup('vexxhost.atmosphere.image_ref', 'heat_api', output='ref') }}"
+      heat_cfn: "{{ lookup('vexxhost.atmosphere.image_ref', 'heat_cfn', output='ref') }}"
+      heat_cloudwatch: "{{ lookup('vexxhost.atmosphere.image_ref', 'heat_cloudwatch', output='ref') }}"
+      heat_db_sync: "{{ lookup('vexxhost.atmosphere.image_ref', 'heat_db_sync', output='ref') }}"
+      heat_engine_cleaner: "{{ lookup('vexxhost.atmosphere.image_ref', 'heat_engine_cleaner', output='ref') }}"
+      heat_engine: "{{ lookup('vexxhost.atmosphere.image_ref', 'heat_engine', output='ref') }}"
+      heat_purge_deleted: "{{ lookup('vexxhost.atmosphere.image_ref', 'heat_purge_deleted', output='ref') }}"
+      ks_endpoints: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_endpoints', output='ref') }}"
+      ks_service: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_service', output='ref') }}"
+      ks_user: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_user', output='ref') }}"
+      rabbit_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'rabbit_init', output='ref') }}"
   pod:
     replicas:
       api: 3
diff --git a/roles/openstack_helm_horizon/defaults/main.yml b/roles/openstack_helm_horizon/defaults/main.yml
index f9d9ec8..42cf44b 100644
--- a/roles/openstack_helm_horizon/defaults/main.yml
+++ b/roles/openstack_helm_horizon/defaults/main.yml
@@ -11,24 +11,6 @@
 #    :local:
 
 
-# .. envvar:: openstack_helm_horizon_image_repository [[[
-#
-# Image repository location to be prefixed for all images
-openstack_helm_horizon_image_repository: "{{ atmosphere_image_repository | default('us-docker.pkg.dev/vexxhost-infra/openstack') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_horizon_image_tag [[[
-#
-# Image tag for container
-openstack_helm_horizon_image_tag: "{{ atmosphere_openstack_release | default('wallaby') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_horizon_heat_image_tag [[[
-#
-# Image tag for Heat to be used for jobs running via Helm hooks
-openstack_helm_horizon_heat_image_tag: "{{ atmosphere_openstack_release | default('wallaby') }}"
-
-                                                                   # ]]]
 # .. envvar:: openstack_helm_horizon_values [[[
 #
 # Overrides for Helm chart values
diff --git a/roles/openstack_helm_horizon/vars/main.yml b/roles/openstack_helm_horizon/vars/main.yml
index eabe3f9..4b0faa4 100644
--- a/roles/openstack_helm_horizon/vars/main.yml
+++ b/roles/openstack_helm_horizon/vars/main.yml
@@ -17,16 +17,16 @@
   images:
     pull_policy: Always
     tags:
-      bootstrap: "{{ openstack_helm_horizon_image_repository }}/heat:{{ openstack_helm_horizon_heat_image_tag }}"
-      db_drop: "{{ openstack_helm_horizon_image_repository }}/heat:{{ openstack_helm_horizon_heat_image_tag }}"
-      db_init: "{{ openstack_helm_horizon_image_repository }}/heat:{{ openstack_helm_horizon_heat_image_tag }}"
-      dep_check: "{{ openstack_helm_horizon_image_repository }}/kubernetes-entrypoint:latest"
-      ks_endpoints: "{{ openstack_helm_horizon_image_repository }}/heat:{{ openstack_helm_horizon_heat_image_tag }}"
-      ks_service: "{{ openstack_helm_horizon_image_repository }}/heat:{{ openstack_helm_horizon_heat_image_tag }}"
-      ks_user: "{{ openstack_helm_horizon_image_repository }}/heat:{{ openstack_helm_horizon_heat_image_tag }}"
-      horizon_db_sync: "{{ openstack_helm_horizon_image_repository }}/horizon:{{ openstack_helm_horizon_image_tag }}"
-      horizon: "{{ openstack_helm_horizon_image_repository }}/horizon:{{ openstack_helm_horizon_image_tag }}"
-      rabbit_init: "{{ openstack_helm_horizon_image_repository }}/rabbitmq:3.8.23-management"
+      bootstrap: "{{ lookup('vexxhost.atmosphere.image_ref', 'bootstrap', output='ref') }}"
+      db_drop: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_drop', output='ref') }}"
+      db_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_init', output='ref') }}"
+      dep_check: "{{ lookup('vexxhost.atmosphere.image_ref', 'dep_check', output='ref') }}"
+      ks_endpoints: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_endpoints', output='ref') }}"
+      ks_service: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_service', output='ref') }}"
+      ks_user: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_user', output='ref') }}"
+      horizon_db_sync: "{{ lookup('vexxhost.atmosphere.image_ref', 'horizon_db_sync', output='ref') }}"
+      horizon: "{{ lookup('vexxhost.atmosphere.image_ref', 'horizon', output='ref') }}"
+      rabbit_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'rabbit_init', output='ref') }}"
   pod:
     replicas:
       server: 3
diff --git a/roles/openstack_helm_infra_libvirt/defaults/main.yml b/roles/openstack_helm_infra_libvirt/defaults/main.yml
index 3d31131..06d3c20 100644
--- a/roles/openstack_helm_infra_libvirt/defaults/main.yml
+++ b/roles/openstack_helm_infra_libvirt/defaults/main.yml
@@ -11,18 +11,6 @@
 #    :local:
 
 
-# .. envvar:: openstack_helm_infra_libvirt_image_repository [[[
-#
-# Image repository location to be prefixed for all images
-openstack_helm_infra_libvirt_image_repository: "{{ atmosphere_image_repository | default('quay.io/vexxhost') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_infra_libvirt_image_tag [[[
-#
-# Image tag for container
-openstack_helm_infra_libvirt_image_tag: "{{ atmosphere_openstack_release | default('yoga-focal') }}"
-
-                                                                   # ]]]
 # .. envvar:: openstack_helm_infra_libvirt_values [[[
 #
 # Overrides for Helm chart values
diff --git a/roles/openstack_helm_infra_libvirt/vars/main.yml b/roles/openstack_helm_infra_libvirt/vars/main.yml
index f642b45..d02c0ca 100644
--- a/roles/openstack_helm_infra_libvirt/vars/main.yml
+++ b/roles/openstack_helm_infra_libvirt/vars/main.yml
@@ -16,9 +16,9 @@
   endpoints: "{{ openstack_helm_endpoints }}"
   images:
     tags:
-      ceph_config_helper: "{{ openstack_helm_infra_libvirt_image_repository }}/libvirtd:{{ openstack_helm_infra_libvirt_image_tag }}"
-      dep_check: "{{ openstack_helm_infra_libvirt_image_repository }}/kubernetes-entrypoint:latest"
-      libvirt: "{{ openstack_helm_infra_libvirt_image_repository }}/libvirtd:{{ openstack_helm_infra_libvirt_image_tag }}"
+      ceph_config_helper: "{{ lookup('vexxhost.atmosphere.image_ref', 'ceph_config_helper', output='ref') }}"
+      dep_check: "{{ lookup('vexxhost.atmosphere.image_ref', 'dep_check', output='ref') }}"
+      libvirt: "{{ lookup('vexxhost.atmosphere.image_ref', 'libvirt', output='ref') }}"
   conf:
     ceph:
       enabled: "{{ atmosphere_ceph_enabled | default(true) | bool }}"
diff --git a/roles/openstack_helm_infra_openvswitch/defaults/main.yml b/roles/openstack_helm_infra_openvswitch/defaults/main.yml
index f43de8c..3407a49 100644
--- a/roles/openstack_helm_infra_openvswitch/defaults/main.yml
+++ b/roles/openstack_helm_infra_openvswitch/defaults/main.yml
@@ -11,18 +11,6 @@
 #    :local:
 
 
-# .. envvar:: openstack_helm_infra_openvswitch_image_repository [[[
-#
-# Image repository location to be prefixed for all images
-openstack_helm_infra_openvswitch_image_repository: "{{ atmosphere_image_repository | default('quay.io/vexxhost') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_infra_openvswitch_image_tag [[[
-#
-# Image tag for container
-openstack_helm_infra_openvswitch_image_tag: "{{ atmosphere_openstack_release | default('2.17.3') }}"
-
-                                                                   # ]]]
 # .. envvar:: openstack_helm_infra_openvswitch_values [[[
 #
 # Overrides for Helm chart values
diff --git a/roles/openstack_helm_infra_openvswitch/vars/main.yml b/roles/openstack_helm_infra_openvswitch/vars/main.yml
index e84639e..f4cb234 100644
--- a/roles/openstack_helm_infra_openvswitch/vars/main.yml
+++ b/roles/openstack_helm_infra_openvswitch/vars/main.yml
@@ -16,6 +16,6 @@
   endpoints: "{{ openstack_helm_endpoints }}"
   images:
     tags:
-      dep_check: "{{ openstack_helm_infra_openvswitch_image_repository }}/kubernetes-entrypoint:latest"
-      openvswitch_db_server: "{{ openstack_helm_infra_openvswitch_image_repository }}/openvswitch:{{ openstack_helm_infra_openvswitch_image_tag }}"
-      openvswitch_vswitchd: "{{ openstack_helm_infra_openvswitch_image_repository }}/openvswitch:{{ openstack_helm_infra_openvswitch_image_tag }}"
+      dep_check: "{{ lookup('vexxhost.atmosphere.image_ref', 'dep_check', output='ref') }}"
+      openvswitch_db_server: "{{ lookup('vexxhost.atmosphere.image_ref', 'openvswitch_db_server', output='ref') }}"
+      openvswitch_vswitchd: "{{ lookup('vexxhost.atmosphere.image_ref', 'openvswitch_vswitchd', output='ref') }}"
diff --git a/roles/openstack_helm_keystone/defaults/main.yml b/roles/openstack_helm_keystone/defaults/main.yml
index fa8ecf0..d0a27cc 100644
--- a/roles/openstack_helm_keystone/defaults/main.yml
+++ b/roles/openstack_helm_keystone/defaults/main.yml
@@ -11,24 +11,6 @@
 #    :local:
 
 
-# .. envvar:: openstack_helm_keystone_image_repository [[[
-#
-# Image repository location to be prefixed for all images
-openstack_helm_keystone_image_repository: "{{ atmosphere_image_repository | default('quay.io/vexxhost') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_keystone_image_tag [[[
-#
-# Image tag for container
-openstack_helm_keystone_image_tag: "{{ atmosphere_openstack_release | default('wallaby') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_keystone_heat_image_tag [[[
-#
-# Image tag for Heat to be used for jobs running via Helm hooks
-openstack_helm_keystone_heat_image_tag: "{{ atmosphere_openstack_release | default('wallaby') }}"
-
-                                                                   # ]]]
 # .. envvar:: openstack_helm_keystone_values [[[
 #
 # Overrides for Helm chart values
diff --git a/roles/openstack_helm_keystone/vars/main.yml b/roles/openstack_helm_keystone/vars/main.yml
index e75a3dc..73b200b 100644
--- a/roles/openstack_helm_keystone/vars/main.yml
+++ b/roles/openstack_helm_keystone/vars/main.yml
@@ -17,20 +17,20 @@
   images:
     pull_policy: Always
     tags:
-      bootstrap: "{{ openstack_helm_keystone_image_repository }}/heat:{{ openstack_helm_keystone_heat_image_tag }}"
-      db_drop: "{{ openstack_helm_keystone_image_repository }}/heat:{{ openstack_helm_keystone_heat_image_tag }}"
-      db_init: "{{ openstack_helm_keystone_image_repository }}/heat:{{ openstack_helm_keystone_heat_image_tag }}"
-      dep_check: "{{ openstack_helm_keystone_image_repository }}/kubernetes-entrypoint:latest"
-      keystone_api: "{{ openstack_helm_keystone_image_repository }}/keystone:{{ openstack_helm_keystone_image_tag }}"
-      keystone_credential_cleanup: "{{ openstack_helm_keystone_image_repository }}/heat:{{ openstack_helm_keystone_heat_image_tag }}"
-      keystone_credential_rotate: "{{ openstack_helm_keystone_image_repository }}/keystone:{{ openstack_helm_keystone_image_tag }}"
-      keystone_credential_setup: "{{ openstack_helm_keystone_image_repository }}/keystone:{{ openstack_helm_keystone_image_tag }}"
-      keystone_db_sync: "{{ openstack_helm_keystone_image_repository }}/keystone:{{ openstack_helm_keystone_image_tag }}"
-      keystone_domain_manage: "{{ openstack_helm_keystone_image_repository }}/heat:{{ openstack_helm_keystone_heat_image_tag }}"
-      keystone_fernet_rotate: "{{ openstack_helm_keystone_image_repository }}/keystone:{{ openstack_helm_keystone_image_tag }}"
-      keystone_fernet_setup: "{{ openstack_helm_keystone_image_repository }}/keystone:{{ openstack_helm_keystone_image_tag }}"
-      ks_user: "{{ openstack_helm_keystone_image_repository }}/heat:{{ openstack_helm_keystone_heat_image_tag }}"
-      rabbit_init: "{{ openstack_helm_keystone_image_repository }}/rabbitmq:3.8.23-management"
+      bootstrap: "{{ lookup('vexxhost.atmosphere.image_ref', 'bootstrap', output='ref') }}"
+      db_drop: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_drop', output='ref') }}"
+      db_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_init', output='ref') }}"
+      dep_check: "{{ lookup('vexxhost.atmosphere.image_ref', 'dep_check', output='ref') }}"
+      keystone_api: "{{ lookup('vexxhost.atmosphere.image_ref', 'keystone_api', output='ref') }}"
+      keystone_credential_cleanup: "{{ lookup('vexxhost.atmosphere.image_ref', 'keystone_credential_cleanup', output='ref') }}"
+      keystone_credential_rotate: "{{ lookup('vexxhost.atmosphere.image_ref', 'keystone_credential_rotate', output='ref') }}"
+      keystone_credential_setup: "{{ lookup('vexxhost.atmosphere.image_ref', 'keystone_credential_setup', output='ref') }}"
+      keystone_db_sync: "{{ lookup('vexxhost.atmosphere.image_ref', 'keystone_db_sync', output='ref') }}"
+      keystone_domain_manage: "{{ lookup('vexxhost.atmosphere.image_ref', 'keystone_domain_manage', output='ref') }}"
+      keystone_fernet_rotate: "{{ lookup('vexxhost.atmosphere.image_ref', 'keystone_fernet_rotate', output='ref') }}"
+      keystone_fernet_setup: "{{ lookup('vexxhost.atmosphere.image_ref', 'keystone_fernet_setup', output='ref') }}"
+      ks_user: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_user', output='ref') }}"
+      rabbit_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'rabbit_init', output='ref') }}"
   pod:
     #     mounts = {
     #       keystone_api = {
diff --git a/roles/openstack_helm_magnum/tasks/main.yml b/roles/openstack_helm_magnum/tasks/main.yml
index 46e08e3..0ee4691 100644
--- a/roles/openstack_helm_magnum/tasks/main.yml
+++ b/roles/openstack_helm_magnum/tasks/main.yml
@@ -69,7 +69,7 @@
                       value: /var/lib/registry
                     - name: REGISTRY_COMPATIBILITY_SCHEMA1_ENABLED
                       value: "true"
-                  image: docker.io/library/registry:2.7.1
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'magnum_registry', output='ref') }}"
                   ports:
                     - containerPort: 5000
                       name: registry
@@ -135,189 +135,189 @@
                     - --dest-tls-verify=false
                     - docker://docker.io/calico/cni:v3.13.1
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/cni:v3.13.1
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-cni-v3-13-1
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://docker.io/calico/kube-controllers:v3.13.1
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/kube-controllers:v3.13.1
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-kube-controllers-v3-13-1
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://docker.io/calico/node:v3.13.1
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/node:v3.13.1
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-node-v3-13-1
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://docker.io/calico/pod2daemon-flexvol:v3.13.1
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/pod2daemon-flexvol:v3.13.1
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-pod2daemon-flexvol-v3-13-1
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://docker.io/coredns/coredns:1.6.6
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/coredns:1.6.6
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-coredns-1-6-6
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://docker.io/k8scloudprovider/cinder-csi-plugin:v1.18.0
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/cinder-csi-plugin:v1.18.0
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-cinder-csi-plugin-v1-18-0
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://docker.io/k8scloudprovider/k8s-keystone-auth:v1.18.0
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/k8s-keystone-auth:v1.18.0
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-k8s-keystone-auth-v1-18-0
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://docker.io/k8scloudprovider/magnum-auto-healer:v1.18.0
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/magnum-auto-healer:v1.18.0
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-magnum-auto-healer-v1-18-0
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://docker.io/k8scloudprovider/openstack-cloud-controller-manager:v1.18.0
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/openstack-cloud-controller-manager:v1.18.0
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-openstack-cloud-controller-manager-v1-18-0
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://docker.io/kubernetesui/dashboard:v2.0.0
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/dashboard:v2.0.0
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-dashboard-v2-0-0
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://docker.io/kubernetesui/metrics-scraper:v1.0.4
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/metrics-scraper:v1.0.4
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-metrics-scraper-v1-0-4
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://docker.io/openstackmagnum/cluster-autoscaler:v1.22.0
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/cluster-autoscaler:v1.22.0
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-cluster-autoscaler-v1-22-0
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://docker.io/openstackmagnum/heat-container-agent:wallaby-stable-1
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/heat-container-agent:wallaby-stable-1
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-heat-container-agent-wallaby-stable-1
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://docker.io/planetlabs/draino:abf028a
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/draino:abf028a
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-draino-abf028a
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://docker.io/rancher/hyperkube:v1.19.11-rancher1
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/hyperkube:v1.19.11
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-hyperkube-v1-19-11
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://docker.io/rancher/hyperkube:v1.20.7-rancher1
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/hyperkube:v1.20.7
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-hyperkube-v1-20-7
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://docker.io/rancher/hyperkube:v1.21.1-rancher1
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/hyperkube:v1.21.1
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-hyperkube-v1-21-1
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://gcr.io/google_containers/cluster-proportional-autoscaler-amd64:1.1.2
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/cluster-proportional-autoscaler-amd64:1.1.2
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-cluster-proportional-autoscaler-amd64-1-1-2
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://gcr.io/google_containers/metrics-server-amd64:v0.3.5
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/metrics-server-amd64:v0.3.5
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-metrics-server-amd64-v0-3-5
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://gcr.io/google_containers/node-problem-detector:v0.6.2
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/node-problem-detector:v0.6.2
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-node-problem-detector-v0-6-2
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://gcr.io/google_containers/pause:3.1
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/pause:3.1
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-pause-3-1
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://quay.io/coreos/etcd:v3.4.6
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/etcd:v3.4.6
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-etcd-v3-4-6
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://quay.io/k8scsi/csi-attacher:v2.0.0
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/csi-attacher:v2.0.0
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-csi-attacher-v2-0-0
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://quay.io/k8scsi/csi-node-driver-registrar:v1.1.0
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/csi-node-driver-registrar:v1.1.0
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-csi-node-driver-registrar-v1-1-0
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://quay.io/k8scsi/csi-provisioner:v1.4.0
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/csi-provisioner:v1.4.0
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-csi-provisioner-v1-4-0
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://quay.io/k8scsi/csi-resizer:v0.3.0
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/csi-resizer:v0.3.0
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-csi-resizer-v0-3-0
                 - args:
                     - copy
                     - --dest-tls-verify=false
                     - docker://quay.io/k8scsi/csi-snapshotter:v1.2.2
                     - docker://magnum-registry.openstack.svc.cluster.local:5000/magnum/csi-snapshotter:v1.2.2
-                  image: quay.io/skopeo/stable:latest
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'skopeo', output='ref') }}"
                   name: magnum-csi-snapshotter-v1-2-2
               nodeSelector:
                 openstack-control-plane: enabled
diff --git a/roles/openstack_helm_neutron/defaults/main.yml b/roles/openstack_helm_neutron/defaults/main.yml
index 2fe2c66..9745d4b 100644
--- a/roles/openstack_helm_neutron/defaults/main.yml
+++ b/roles/openstack_helm_neutron/defaults/main.yml
@@ -11,24 +11,6 @@
 #    :local:
 
 
-# .. envvar:: openstack_helm_neutron_image_repository [[[
-#
-# Image repository location to be prefixed for all images
-openstack_helm_neutron_image_repository: "{{ atmosphere_image_repository | default('us-docker.pkg.dev/vexxhost-infra/openstack') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_neutron_image_tag [[[
-#
-# Image tag for container
-openstack_helm_neutron_image_tag: "{{ atmosphere_openstack_release | default('wallaby') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_neutron_heat_image_tag [[[
-#
-# Image tag for Heat to be used for jobs running via Helm hooks
-openstack_helm_neutron_heat_image_tag: "{{ atmosphere_openstack_release | default('wallaby') }}"
-
-                                                                   # ]]]
 # .. envvar:: openstack_helm_neutron_values [[[
 #
 # Overrides for Helm chart values
diff --git a/roles/openstack_helm_neutron/vars/main.yml b/roles/openstack_helm_neutron/vars/main.yml
index b48307d..91003c2 100644
--- a/roles/openstack_helm_neutron/vars/main.yml
+++ b/roles/openstack_helm_neutron/vars/main.yml
@@ -17,27 +17,27 @@
   images:
     pull_policy: Always
     tags:
-      bootstrap: "{{ openstack_helm_neutron_image_repository }}/heat:{{ openstack_helm_neutron_heat_image_tag }}"
-      db_drop: "{{ openstack_helm_neutron_image_repository }}/heat:{{ openstack_helm_neutron_heat_image_tag }}"
-      db_init: "{{ openstack_helm_neutron_image_repository }}/heat:{{ openstack_helm_neutron_heat_image_tag }}"
-      dep_check: "{{ openstack_helm_neutron_image_repository }}/kubernetes-entrypoint:latest"
-      ks_endpoints: "{{ openstack_helm_neutron_image_repository }}/heat:{{ openstack_helm_neutron_heat_image_tag }}"
-      ks_service: "{{ openstack_helm_neutron_image_repository }}/heat:{{ openstack_helm_neutron_heat_image_tag }}"
-      ks_user: "{{ openstack_helm_neutron_image_repository }}/heat:{{ openstack_helm_neutron_heat_image_tag }}"
-      neutron_bagpipe_bgp: "{{ openstack_helm_neutron_image_repository }}/neutron:{{ openstack_helm_neutron_image_tag }}"
-      neutron_db_sync: "{{ openstack_helm_neutron_image_repository }}/neutron:{{ openstack_helm_neutron_image_tag }}"
-      neutron_dhcp: "{{ openstack_helm_neutron_image_repository }}/neutron:{{ openstack_helm_neutron_image_tag }}"
-      neutron_ironic_agent: "{{ openstack_helm_neutron_image_repository }}/neutron:{{ openstack_helm_neutron_image_tag }}"
-      neutron_l2gw: "{{ openstack_helm_neutron_image_repository }}/neutron:{{ openstack_helm_neutron_image_tag }}"
-      neutron_l3: "{{ openstack_helm_neutron_image_repository }}/neutron:{{ openstack_helm_neutron_image_tag }}"
-      neutron_linuxbridge_agent: "{{ openstack_helm_neutron_image_repository }}/neutron:{{ openstack_helm_neutron_image_tag }}"
-      neutron_metadata: "{{ openstack_helm_neutron_image_repository }}/neutron:{{ openstack_helm_neutron_image_tag }}"
-      neutron_netns_cleanup_cron: "{{ openstack_helm_neutron_image_repository }}/neutron:{{ openstack_helm_neutron_image_tag }}"
-      neutron_openvswitch_agent: "{{ openstack_helm_neutron_image_repository }}/neutron:{{ openstack_helm_neutron_image_tag }}"
-      neutron_server: "{{ openstack_helm_neutron_image_repository }}/neutron:{{ openstack_helm_neutron_image_tag }}"
-      neutron_sriov_agent_init: "{{ openstack_helm_neutron_image_repository }}/neutron:{{ openstack_helm_neutron_image_tag }}"
-      neutron_sriov_agent: "{{ openstack_helm_neutron_image_repository }}/neutron:{{ openstack_helm_neutron_image_tag }}"
-      rabbit_init: "{{ openstack_helm_neutron_image_repository }}/rabbitmq:3.8.23-management"
+      bootstrap: "{{ lookup('vexxhost.atmosphere.image_ref', 'bootstrap', output='ref') }}"
+      db_drop: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_drop', output='ref') }}"
+      db_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_init', output='ref') }}"
+      dep_check: "{{ lookup('vexxhost.atmosphere.image_ref', 'dep_check', output='ref') }}"
+      ks_endpoints: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_endpoints', output='ref') }}"
+      ks_service: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_service', output='ref') }}"
+      ks_user: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_user', output='ref') }}"
+      neutron_bagpipe_bgp: "{{ lookup('vexxhost.atmosphere.image_ref', 'neutron_bagpipe_bgp', output='ref') }}"
+      neutron_db_sync: "{{ lookup('vexxhost.atmosphere.image_ref', 'neutron_db_sync', output='ref') }}"
+      neutron_dhcp: "{{ lookup('vexxhost.atmosphere.image_ref', 'neutron_dhcp', output='ref') }}"
+      neutron_ironic_agent: "{{ lookup('vexxhost.atmosphere.image_ref', 'neutron_ironic_agent', output='ref') }}"
+      neutron_l2gw: "{{ lookup('vexxhost.atmosphere.image_ref', 'neutron_l2gw', output='ref') }}"
+      neutron_l3: "{{ lookup('vexxhost.atmosphere.image_ref', 'neutron_l3', output='ref') }}"
+      neutron_linuxbridge_agent: "{{ lookup('vexxhost.atmosphere.image_ref', 'neutron_linuxbridge_agent', output='ref') }}"
+      neutron_metadata: "{{ lookup('vexxhost.atmosphere.image_ref', 'neutron_metadata', output='ref') }}"
+      neutron_netns_cleanup_cron: "{{ lookup('vexxhost.atmosphere.image_ref', 'neutron_netns_cleanup_cron', output='ref') }}"
+      neutron_openvswitch_agent: "{{ lookup('vexxhost.atmosphere.image_ref', 'neutron_openvswitch_agent', output='ref') }}"
+      neutron_server: "{{ lookup('vexxhost.atmosphere.image_ref', 'neutron_server', output='ref') }}"
+      neutron_sriov_agent_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'neutron_sriov_agent_init', output='ref') }}"
+      neutron_sriov_agent: "{{ lookup('vexxhost.atmosphere.image_ref', 'neutron_sriov_agent', output='ref') }}"
+      rabbit_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'rabbit_init', output='ref') }}"
   pod:
     replicas:
       server: 3
diff --git a/roles/openstack_helm_nova/defaults/main.yml b/roles/openstack_helm_nova/defaults/main.yml
index eaeb06d..c0415ad 100644
--- a/roles/openstack_helm_nova/defaults/main.yml
+++ b/roles/openstack_helm_nova/defaults/main.yml
@@ -11,42 +11,6 @@
 #    :local:
 
 
-# .. envvar:: openstack_helm_nova_image_repository [[[
-#
-# Image repository location to be prefixed for all images
-openstack_helm_nova_image_repository: "{{ atmosphere_image_repository | default('quay.io/vexxhost') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_nova_image_tag [[[
-#
-# Image tag for container
-openstack_helm_nova_image_tag: "{{ atmosphere_openstack_release | default('wallaby') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_nova_ssh_image_tag [[[
-#
-# Image tag for SSH container
-openstack_helm_nova_ssh_image_tag: "{{ atmosphere_openstack_release | default('wallaby') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_nova_heat_image_tag [[[
-#
-# Image tag for Heat to be used for jobs running via Helm hooks
-openstack_helm_nova_heat_image_tag: "{{ atmosphere_openstack_release | default('wallaby') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_nova_diff [[[
-#
-# Disable a diff of the release values and ask for manual confirmation
-openstack_helm_nova_diff: false
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_nova_migrate_from_mariadb [[[
-#
-# Execute a migration from legacy MariaDB to Percona XtraDB cluster
-openstack_helm_nova_migrate_from_mariadb: false
-
-                                                                   # ]]]
 # .. envvar:: openstack_helm_nova_values [[[
 #
 # Overrides for Helm chart values
diff --git a/roles/openstack_helm_nova/vars/main.yml b/roles/openstack_helm_nova/vars/main.yml
index 5635922..afb83b5 100644
--- a/roles/openstack_helm_nova/vars/main.yml
+++ b/roles/openstack_helm_nova/vars/main.yml
@@ -23,32 +23,31 @@
   images:
     pull_policy: Always
     tags:
-      bootstrap: "{{ openstack_helm_nova_image_repository }}/heat:{{ openstack_helm_nova_heat_image_tag }}"
-      db_drop: "{{ openstack_helm_nova_image_repository }}/heat:{{ openstack_helm_nova_heat_image_tag }}"
-      db_init: "{{ openstack_helm_nova_image_repository }}/heat:{{ openstack_helm_nova_heat_image_tag }}"
-      dep_check: "{{ openstack_helm_nova_image_repository }}/kubernetes-entrypoint:latest"
-      ks_endpoints: "{{ openstack_helm_nova_image_repository }}/heat:{{ openstack_helm_nova_heat_image_tag }}"
-      ks_service: "{{ openstack_helm_nova_image_repository }}/heat:{{ openstack_helm_nova_heat_image_tag }}"
-      ks_user: "{{ openstack_helm_nova_image_repository }}/heat:{{ openstack_helm_nova_heat_image_tag }}"
-      nova_api: "{{ openstack_helm_nova_image_repository }}/nova:{{ openstack_helm_nova_image_tag }}"
-      nova_archive_deleted_rows: "{{ openstack_helm_nova_image_repository }}/nova:{{ openstack_helm_nova_image_tag }}"
-      nova_cell_setup_init: "{{ openstack_helm_nova_image_repository }}/heat:{{ openstack_helm_nova_heat_image_tag }}"
-      nova_cell_setup: "{{ openstack_helm_nova_image_repository }}/nova:{{ openstack_helm_nova_image_tag }}"
-      # TODO(mnaser): Fix Ironic images
-      nova_compute_ironic: "docker.io/kolla/ubuntu-source-nova-compute-ironic:wallaby"
-      nova_compute_ssh: "{{ openstack_helm_nova_image_repository }}/nova-ssh:{{ openstack_helm_nova_ssh_image_tag }}"
-      nova_compute: "{{ openstack_helm_nova_image_repository }}/nova:{{ openstack_helm_nova_image_tag }}"
-      nova_conductor: "{{ openstack_helm_nova_image_repository }}/nova:{{ openstack_helm_nova_image_tag }}"
-      nova_consoleauth: "{{ openstack_helm_nova_image_repository }}/nova:{{ openstack_helm_nova_image_tag }}"
-      nova_db_sync: "{{ openstack_helm_nova_image_repository }}/nova:{{ openstack_helm_nova_image_tag }}"
-      nova_novncproxy_assets: "{{ openstack_helm_nova_image_repository }}/nova:{{ openstack_helm_nova_image_tag }}"
-      nova_novncproxy: "{{ openstack_helm_nova_image_repository }}/nova:{{ openstack_helm_nova_image_tag }}"
-      nova_placement: "{{ openstack_helm_nova_image_repository }}/nova:{{ openstack_helm_nova_image_tag }}"
-      nova_scheduler: "{{ openstack_helm_nova_image_repository }}/nova:{{ openstack_helm_nova_image_tag }}"
-      nova_service_cleaner: "{{ openstack_helm_nova_image_repository }}/cli:latest"
-      nova_spiceproxy_assets: "{{ openstack_helm_nova_image_repository }}/nova:{{ openstack_helm_nova_image_tag }}"
-      nova_spiceproxy: "{{ openstack_helm_nova_image_repository }}/nova:{{ openstack_helm_nova_image_tag }}"
-      rabbit_init: "{{ openstack_helm_nova_image_repository }}/rabbitmq:3.8.23-management"
+      bootstrap: "{{ lookup('vexxhost.atmosphere.image_ref', 'bootstrap', output='ref') }}"
+      db_drop: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_drop', output='ref') }}"
+      db_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_init', output='ref') }}"
+      dep_check: "{{ lookup('vexxhost.atmosphere.image_ref', 'dep_check', output='ref') }}"
+      ks_endpoints: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_endpoints', output='ref') }}"
+      ks_service: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_service', output='ref') }}"
+      ks_user: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_user', output='ref') }}"
+      nova_api: "{{ lookup('vexxhost.atmosphere.image_ref', 'nova_api', output='ref') }}"
+      nova_archive_deleted_rows: "{{ lookup('vexxhost.atmosphere.image_ref', 'nova_archive_deleted_rows', output='ref') }}"
+      nova_cell_setup_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'nova_cell_setup_init', output='ref') }}"
+      nova_cell_setup: "{{ lookup('vexxhost.atmosphere.image_ref', 'nova_cell_setup', output='ref') }}"
+      nova_compute_ironic: "{{ lookup('vexxhost.atmosphere.image_ref', 'nova_compute_ironic', output='ref') }}"
+      nova_compute_ssh: "{{ lookup('vexxhost.atmosphere.image_ref', 'nova_compute_ssh', output='ref') }}"
+      nova_compute: "{{ lookup('vexxhost.atmosphere.image_ref', 'nova_compute', output='ref') }}"
+      nova_conductor: "{{ lookup('vexxhost.atmosphere.image_ref', 'nova_conductor', output='ref') }}"
+      nova_consoleauth: "{{ lookup('vexxhost.atmosphere.image_ref', 'nova_consoleauth', output='ref') }}"
+      nova_db_sync: "{{ lookup('vexxhost.atmosphere.image_ref', 'nova_db_sync', output='ref') }}"
+      nova_novncproxy_assets: "{{ lookup('vexxhost.atmosphere.image_ref', 'nova_novncproxy_assets', output='ref') }}"
+      nova_novncproxy: "{{ lookup('vexxhost.atmosphere.image_ref', 'nova_novncproxy', output='ref') }}"
+      nova_placement: "{{ lookup('vexxhost.atmosphere.image_ref', 'nova_placement', output='ref') }}"
+      nova_scheduler: "{{ lookup('vexxhost.atmosphere.image_ref', 'nova_scheduler', output='ref') }}"
+      nova_service_cleaner: "{{ lookup('vexxhost.atmosphere.image_ref', 'nova_service_cleaner', output='ref') }}"
+      nova_spiceproxy_assets: "{{ lookup('vexxhost.atmosphere.image_ref', 'nova_spiceproxy_assets', output='ref') }}"
+      nova_spiceproxy: "{{ lookup('vexxhost.atmosphere.image_ref', 'nova_spiceproxy', output='ref') }}"
+      rabbit_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'rabbit_init', output='ref') }}"
   network:
     ssh:
       enabled: true
diff --git a/roles/openstack_helm_octavia/defaults/main.yml b/roles/openstack_helm_octavia/defaults/main.yml
index dbdc255..f937de8 100644
--- a/roles/openstack_helm_octavia/defaults/main.yml
+++ b/roles/openstack_helm_octavia/defaults/main.yml
@@ -11,30 +11,6 @@
 #    :local:
 
 
-# .. envvar:: openstack_helm_octavia_image_repository [[[
-#
-# Image repository location to be prefixed for all images
-openstack_helm_octavia_image_repository: "{{ atmosphere_image_repository | default('quay.io/vexxhost') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_octavia_image_tag [[[
-#
-# Image tag for container
-openstack_helm_octavia_image_tag: zed
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_octavia_heat_image_tag [[[
-#
-# Image tag for Heat to be used for jobs running via Helm hooks
-openstack_helm_octavia_heat_image_tag: zed
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_octavia_neutron_image_tag [[[
-#
-# Image tag for Neutron to be used for openvswitch_vswitchd
-openstack_helm_octavia_neutron_image_tag: zed
-
-                                                                   # ]]]
 # .. envvar:: openstack_helm_octavia_values [[[
 #
 # Overrides for Helm chart values
diff --git a/roles/openstack_helm_octavia/vars/main.yml b/roles/openstack_helm_octavia/vars/main.yml
index 002101f..7f320e3 100644
--- a/roles/openstack_helm_octavia/vars/main.yml
+++ b/roles/openstack_helm_octavia/vars/main.yml
@@ -16,21 +16,21 @@
   endpoints: "{{ openstack_helm_endpoints }}"
   images:
     tags:
-      bootstrap: "{{ openstack_helm_octavia_image_repository }}/heat:{{ openstack_helm_octavia_heat_image_tag }}"
-      db_drop: "{{ openstack_helm_octavia_image_repository }}/heat:{{ openstack_helm_octavia_heat_image_tag }}"
-      db_init: "{{ openstack_helm_octavia_image_repository }}/heat:{{ openstack_helm_octavia_heat_image_tag }}"
-      dep_check: "{{ openstack_helm_octavia_image_repository }}/kubernetes-entrypoint:latest"
-      ks_endpoints: "{{ openstack_helm_octavia_image_repository }}/heat:{{ openstack_helm_octavia_heat_image_tag }}"
-      ks_service: "{{ openstack_helm_octavia_image_repository }}/heat:{{ openstack_helm_octavia_heat_image_tag }}"
-      ks_user: "{{ openstack_helm_octavia_image_repository }}/heat:{{ openstack_helm_octavia_heat_image_tag }}"
-      rabbit_init: "{{ openstack_helm_octavia_image_repository }}/rabbitmq:3.8.23-management"
-      octavia_api: "{{ openstack_helm_octavia_image_repository }}/octavia:{{ openstack_helm_octavia_image_tag }}"
-      octavia_db_sync: "{{ openstack_helm_octavia_image_repository }}/octavia:{{ openstack_helm_octavia_image_tag }}"
-      octavia_health_manager: "{{ openstack_helm_octavia_image_repository }}/octavia:{{ openstack_helm_octavia_image_tag }}"
-      octavia_health_manager_init: "{{ openstack_helm_octavia_image_repository }}/heat:{{ openstack_helm_octavia_heat_image_tag }}"
-      octavia_housekeeping: "{{ openstack_helm_octavia_image_repository }}/octavia:{{ openstack_helm_octavia_image_tag }}"
-      octavia_worker: "{{ openstack_helm_octavia_image_repository }}/octavia:{{ openstack_helm_octavia_image_tag }}"
-      openvswitch_vswitchd: "{{ openstack_helm_octavia_image_repository }}/neutron:{{ openstack_helm_octavia_neutron_image_tag }}"
+      bootstrap: "{{ lookup('vexxhost.atmosphere.image_ref', 'bootstrap', output='ref') }}"
+      db_drop: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_drop', output='ref') }}"
+      db_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_init', output='ref') }}"
+      dep_check: "{{ lookup('vexxhost.atmosphere.image_ref', 'dep_check', output='ref') }}"
+      ks_endpoints: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_endpoints', output='ref') }}"
+      ks_service: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_service', output='ref') }}"
+      ks_user: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_user', output='ref') }}"
+      rabbit_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'rabbit_init', output='ref') }}"
+      octavia_api: "{{ lookup('vexxhost.atmosphere.image_ref', 'octavia_api', output='ref') }}"
+      octavia_db_sync: "{{ lookup('vexxhost.atmosphere.image_ref', 'octavia_db_sync', output='ref') }}"
+      octavia_health_manager: "{{ lookup('vexxhost.atmosphere.image_ref', 'octavia_health_manager', output='ref') }}"
+      octavia_health_manager_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'octavia_health_manager_init', output='ref') }}"
+      octavia_housekeeping: "{{ lookup('vexxhost.atmosphere.image_ref', 'octavia_housekeeping', output='ref') }}"
+      octavia_worker: "{{ lookup('vexxhost.atmosphere.image_ref', 'octavia_worker', output='ref') }}"
+      openvswitch_vswitchd: "{{ lookup('vexxhost.atmosphere.image_ref', 'openvswitch_vswitchd', output='ref') }}"
   pod:
     mounts:
       octavia_api:
diff --git a/roles/openstack_helm_placement/defaults/main.yml b/roles/openstack_helm_placement/defaults/main.yml
index 3ff3ff6..9065332 100644
--- a/roles/openstack_helm_placement/defaults/main.yml
+++ b/roles/openstack_helm_placement/defaults/main.yml
@@ -11,24 +11,6 @@
 #    :local:
 
 
-# .. envvar:: openstack_helm_placement_image_repository [[[
-#
-# Image repository location to be prefixed for all images
-openstack_helm_placement_image_repository: "{{ atmosphere_image_repository | default('quay.io/vexxhost') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_placement_image_tag [[[
-#
-# Image tag for container
-openstack_helm_placement_image_tag: "{{ atmosphere_openstack_release | default('wallaby') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_placement_heat_image_tag [[[
-#
-# Image tag for Heat to be used for jobs running via Helm hooks
-openstack_helm_placement_heat_image_tag: "{{ atmosphere_openstack_release | default('wallaby') }}"
-
-                                                                   # ]]]
 # .. envvar:: openstack_helm_placement_values [[[
 #
 # Overrides for Helm chart values
diff --git a/roles/openstack_helm_placement/vars/main.yml b/roles/openstack_helm_placement/vars/main.yml
index cdffca4..0046b8e 100644
--- a/roles/openstack_helm_placement/vars/main.yml
+++ b/roles/openstack_helm_placement/vars/main.yml
@@ -17,16 +17,16 @@
   images:
     pull_policy: Always
     tags:
-      bootstrap: "{{ openstack_helm_placement_image_repository }}/heat:{{ openstack_helm_placement_heat_image_tag }}"
-      db_drop: "{{ openstack_helm_placement_image_repository }}/heat:{{ openstack_helm_placement_heat_image_tag }}"
-      db_init: "{{ openstack_helm_placement_image_repository }}/heat:{{ openstack_helm_placement_heat_image_tag }}"
-      dep_check: "{{ openstack_helm_placement_image_repository }}/kubernetes-entrypoint:latest"
-      ks_endpoints: "{{ openstack_helm_placement_image_repository }}/heat:{{ openstack_helm_placement_heat_image_tag }}"
-      ks_service: "{{ openstack_helm_placement_image_repository }}/heat:{{ openstack_helm_placement_heat_image_tag }}"
-      ks_user: "{{ openstack_helm_placement_image_repository }}/heat:{{ openstack_helm_placement_heat_image_tag }}"
-      placement_db_sync: "{{ openstack_helm_placement_image_repository }}/placement:{{ openstack_helm_placement_image_tag }}"
-      placement: "{{ openstack_helm_placement_image_repository }}/placement:{{ openstack_helm_placement_image_tag }}"
-      rabbit_init: "{{ openstack_helm_placement_image_repository }}/rabbitmq:3.8.23-management"
+      bootstrap: "{{ lookup('vexxhost.atmosphere.image_ref', 'bootstrap', output='ref') }}"
+      db_drop: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_drop', output='ref') }}"
+      db_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_init', output='ref') }}"
+      dep_check: "{{ lookup('vexxhost.atmosphere.image_ref', 'dep_check', output='ref') }}"
+      ks_endpoints: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_endpoints', output='ref') }}"
+      ks_service: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_service', output='ref') }}"
+      ks_user: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_user', output='ref') }}"
+      placement_db_sync: "{{ lookup('vexxhost.atmosphere.image_ref', 'placement_db_sync', output='ref') }}"
+      placement: "{{ lookup('vexxhost.atmosphere.image_ref', 'placement', output='ref') }}"
+      rabbit_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'rabbit_init', output='ref') }}"
   pod:
     replicas:
       api: 3
diff --git a/roles/openstack_helm_senlin/defaults/main.yml b/roles/openstack_helm_senlin/defaults/main.yml
index 350ff47..dab1fdf 100644
--- a/roles/openstack_helm_senlin/defaults/main.yml
+++ b/roles/openstack_helm_senlin/defaults/main.yml
@@ -11,36 +11,6 @@
 #    :local:
 
 
-# .. envvar:: openstack_helm_senlin_image_repository [[[
-#
-# Image repository location to be prefixed for all images
-openstack_helm_senlin_image_repository: "{{ atmosphere_image_repository | default('us-docker.pkg.dev/vexxhost-infra/openstack') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_senlin_image_tag [[[
-#
-# Image tag for container
-openstack_helm_senlin_image_tag: "{{ atmosphere_openstack_release | default('wallaby') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_senlin_heat_image_tag [[[
-#
-# Image tag for Heat to be used for jobs running via Helm hooks
-openstack_helm_senlin_heat_image_tag: "{{ atmosphere_openstack_release | default('wallaby') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_senlin_diff [[[
-#
-# Disable a diff of the release values and ask for manual confirmation
-openstack_helm_senlin_diff: false
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_senlin_migrate_from_mariadb [[[
-#
-# Execute a migration from legacy MariaDB to Percona XtraDB cluster
-openstack_helm_senlin_migrate_from_mariadb: false
-
-                                                                   # ]]]
 # .. envvar:: openstack_helm_senlin_values [[[
 #
 # Overrides for Helm chart values
diff --git a/roles/openstack_helm_senlin/vars/main.yml b/roles/openstack_helm_senlin/vars/main.yml
index 4528366..462c949 100644
--- a/roles/openstack_helm_senlin/vars/main.yml
+++ b/roles/openstack_helm_senlin/vars/main.yml
@@ -18,20 +18,20 @@
   images:
     pull_policy: Always
     tags:
-      bootstrap: "{{ openstack_helm_senlin_image_repository }}/heat:{{ openstack_helm_senlin_heat_image_tag }}"
-      db_drop: "{{ openstack_helm_senlin_image_repository }}/heat:{{ openstack_helm_senlin_heat_image_tag }}"
-      db_init: "{{ openstack_helm_senlin_image_repository }}/heat:{{ openstack_helm_senlin_heat_image_tag }}"
-      dep_check: "{{ openstack_helm_senlin_image_repository }}/kubernetes-entrypoint:latest"
-      ks_endpoints: "{{ openstack_helm_senlin_image_repository }}/heat:{{ openstack_helm_senlin_heat_image_tag }}"
-      ks_service: "{{ openstack_helm_senlin_image_repository }}/heat:{{ openstack_helm_senlin_heat_image_tag }}"
-      ks_user: "{{ openstack_helm_senlin_image_repository }}/heat:{{ openstack_helm_senlin_heat_image_tag }}"
-      rabbit_init: "{{ openstack_helm_senlin_image_repository }}/rabbitmq:3.8.23-management"
-      senlin_api: "{{ openstack_helm_senlin_image_repository }}/senlin:{{ openstack_helm_senlin_image_tag }}"
-      senlin_conductor: "{{ openstack_helm_senlin_image_repository }}/senlin:{{ openstack_helm_senlin_image_tag }}"
-      senlin_db_sync: "{{ openstack_helm_senlin_image_repository }}/senlin:{{ openstack_helm_senlin_image_tag }}"
-      senlin_engine_cleaner: "{{ openstack_helm_senlin_image_repository }}/senlin:{{ openstack_helm_senlin_image_tag }}"
-      senlin_engine: "{{ openstack_helm_senlin_image_repository }}/senlin:{{ openstack_helm_senlin_image_tag }}"
-      senlin_health_manager: "{{ openstack_helm_senlin_image_repository }}/senlin:{{ openstack_helm_senlin_image_tag }}"
+      bootstrap: "{{ lookup('vexxhost.atmosphere.image_ref', 'bootstrap', output='ref') }}"
+      db_drop: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_drop', output='ref') }}"
+      db_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'db_init', output='ref') }}"
+      dep_check: "{{ lookup('vexxhost.atmosphere.image_ref', 'dep_check', output='ref') }}"
+      ks_endpoints: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_endpoints', output='ref') }}"
+      ks_service: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_service', output='ref') }}"
+      ks_user: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_user', output='ref') }}"
+      rabbit_init: "{{ lookup('vexxhost.atmosphere.image_ref', 'rabbit_init', output='ref') }}"
+      senlin_api: "{{ lookup('vexxhost.atmosphere.image_ref', 'senlin_api', output='ref') }}"
+      senlin_conductor: "{{ lookup('vexxhost.atmosphere.image_ref', 'senlin_conductor', output='ref') }}"
+      senlin_db_sync: "{{ lookup('vexxhost.atmosphere.image_ref', 'senlin_db_sync', output='ref') }}"
+      senlin_engine_cleaner: "{{ lookup('vexxhost.atmosphere.image_ref', 'senlin_engine_cleaner', output='ref') }}"
+      senlin_engine: "{{ lookup('vexxhost.atmosphere.image_ref', 'senlin_engine', output='ref') }}"
+      senlin_health_manager: "{{ lookup('vexxhost.atmosphere.image_ref', 'senlin_health_manager', output='ref') }}"
   pod:
     replicas:
       api: 3
diff --git a/roles/openstack_helm_tempest/defaults/main.yml b/roles/openstack_helm_tempest/defaults/main.yml
index 3dba304..28892e6 100644
--- a/roles/openstack_helm_tempest/defaults/main.yml
+++ b/roles/openstack_helm_tempest/defaults/main.yml
@@ -11,24 +11,6 @@
 #    :local:
 
 
-# .. envvar:: openstack_helm_tempest_image_repository [[[
-#
-# Image repository location to be prefixed for all images
-openstack_helm_tempest_image_repository: "{{ atmosphere_image_repository | default('us-docker.pkg.dev/vexxhost-infra/openstack') }}"
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_tempest_image_tag [[[
-#
-# Image tag for container
-openstack_helm_tempest_image_tag: 30.1.0-4
-
-                                                                   # ]]]
-# .. envvar:: openstack_helm_tempest_heat_image_tag [[[
-#
-# Image tag for Heat to be used for jobs running via Helm hooks
-openstack_helm_tempest_heat_image_tag: "{{ atmosphere_openstack_release | default('wallaby') }}"
-
-                                                                   # ]]]
 # .. envvar:: openstack_helm_tempest_values [[[
 #
 # Overrides for Helm chart values
diff --git a/roles/openstack_helm_tempest/vars/main.yml b/roles/openstack_helm_tempest/vars/main.yml
index 8a97656..5572a0e 100644
--- a/roles/openstack_helm_tempest/vars/main.yml
+++ b/roles/openstack_helm_tempest/vars/main.yml
@@ -16,9 +16,9 @@
   endpoints: "{{ openstack_helm_endpoints }}"
   images:
     tags:
-      dep_check: "{{ openstack_helm_tempest_image_repository }}/kubernetes-entrypoint:latest"
-      tempest_run_tests: "{{ openstack_helm_tempest_image_repository }}/tempest:{{ openstack_helm_tempest_image_tag }}"
-      ks_user: "{{ openstack_helm_tempest_image_repository }}/heat:{{ openstack_helm_tempest_heat_image_tag }}"
+      dep_check: "{{ lookup('vexxhost.atmosphere.image_ref', 'dep_check', output='ref') }}"
+      ks_user: "{{ lookup('vexxhost.atmosphere.image_ref', 'ks_user', output='ref') }}"
+      tempest_run_tests: "{{ lookup('vexxhost.atmosphere.image_ref', 'tempest_run_tests', output='ref') }}"
   jobs:
     run_tests:
       restartPolicy: Never
diff --git a/roles/prometheus_ethtool_exporter/tasks/main.yml b/roles/prometheus_ethtool_exporter/tasks/main.yml
index 24d01a8..79f6ce0 100644
--- a/roles/prometheus_ethtool_exporter/tasks/main.yml
+++ b/roles/prometheus_ethtool_exporter/tasks/main.yml
@@ -31,7 +31,7 @@
                       valueFrom:
                         fieldRef:
                           fieldPath: status.podIP
-                  image: quay.io/vexxhost/ethtool-exporter:{{ prometheus_ethtool_exporter_image_tag }}
+                  image: "{{ lookup('vexxhost.atmosphere.image_ref', 'prometheus_ethtool_exporter', output='ref') }}"
                   args:
                     - "-L"
                     - "$(IP)"
diff --git a/roles/prometheus_pushgateway/tasks/main.yml b/roles/prometheus_pushgateway/tasks/main.yml
index 84a7b8b..4114ac8 100644
--- a/roles/prometheus_pushgateway/tasks/main.yml
+++ b/roles/prometheus_pushgateway/tasks/main.yml
@@ -31,6 +31,8 @@
                 kind: HelmRepository
                 name: prometheus-community
           values:
+            image:
+              repository: "{{ lookup('vexxhost.atmosphere.image_ref', 'prometheus_pushgateway', output='name') }}"
             nodeSelector:
               openstack-control-plane: enabled
             serviceMonitor: