diff --git a/ansible/roles/inspection-store/tasks/start.yml b/ansible/roles/inspection-store/tasks/start.yml
index e5565ab8e..0bd7cb6ad 100644
--- a/ansible/roles/inspection-store/tasks/start.yml
+++ b/ansible/roles/inspection-store/tasks/start.yml
@@ -8,9 +8,10 @@
     read_only: "{{ item.value.read_only | default(omit) }}"
     restart_policy: "{{ inspection_store_restart_policy }}"
     restart_retries: "{{ inspection_store_restart_retries | default(omit) }}"
-    state: "{{ item.value.enabled | ternary('started', 'absent') }}"
+    state: started
     volumes: "{{ item.value.volumes }}"
     network_mode: "{{ item.value.network_mode | default(omit) }}"
   with_dict: "{{ inspection_store_services }}"
   notify:
     - Ensure inspection store data directory exists
+  when: item.value.enabled | bool
diff --git a/ansible/roles/opensm/tasks/deploy.yml b/ansible/roles/opensm/tasks/deploy.yml
index d471e96dc..eebd9c2de 100644
--- a/ansible/roles/opensm/tasks/deploy.yml
+++ b/ansible/roles/opensm/tasks/deploy.yml
@@ -8,6 +8,7 @@
     read_only: "{{ item.value.read_only | default(omit) }}"
     restart_policy: "{{ opensm_restart_policy }}"
     restart_retries: "{{ opensm_restart_retries | default(omit) }}"
-    state: "{{ item.value.enabled | ternary('started', 'absent') }}"
+    state: started
     volumes: "{{ item.value.volumes }}"
   with_dict: "{{ opensm_services }}"
+  when: item.value.enabled | bool
diff --git a/releasenotes/notes/overcloud-extras-service-absent-2e8a01e1c31f038b.yaml b/releasenotes/notes/overcloud-extras-service-absent-2e8a01e1c31f038b.yaml
new file mode 100644
index 000000000..3ef7c7d90
--- /dev/null
+++ b/releasenotes/notes/overcloud-extras-service-absent-2e8a01e1c31f038b.yaml
@@ -0,0 +1,7 @@
+---
+upgrade:
+  - |
+    Stops automatically removing the ``inspection_store`` and ``opensm``
+    containers when they become disabled in Kayobe configuration. Manual
+    container removal is now necessary, except in the case of a full service
+    destroy.