diff --git a/ansible/group_vars/all.yml b/ansible/group_vars/all.yml
index 4974e51a2127db1eced933da84e83ba078bf20a7..c1a2940150f88b3ce3d1b0f7de2f9451823e2c4b 100644
--- a/ansible/group_vars/all.yml
+++ b/ansible/group_vars/all.yml
@@ -581,6 +581,15 @@ monasca_agent_user: "monasca-agent"
 # can access these from the Monasca APIs.
 monasca_control_plane_project: "monasca_control_plane"
 
+####################
+# Global Options
+####################
+# List of containers to skip during stop command in YAML list format
+# skip_stop_containers:
+#   - container1
+#   - container2
+skip_stop_containers: []
+
 ####################
 # Logging options
 ####################
diff --git a/ansible/roles/barbican/tasks/stop.yml b/ansible/roles/barbican/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..f7a415e26ae22eaef79d261bdb8f9490a8671dda
--- /dev/null
+++ b/ansible/roles/barbican/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ barbican_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/bifrost/tasks/stop.yml b/ansible/roles/bifrost/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..797bd828cdbb3d5c923c9515167ec273060719ed
--- /dev/null
+++ b/ansible/roles/bifrost/tasks/stop.yml
@@ -0,0 +1,9 @@
+---
+- name: Stopping bifrost_deploy container
+  kolla_docker:
+    action: "stop_container"
+    common_options: "{{ docker_common_options }}"
+    name: "bifrost_deploy"
+  when:
+    - inventory_hostname in groups['bifrost']
+    - "'bifrost_deploy' not in skip_stop_containers"
diff --git a/ansible/roles/blazar/tasks/stop.yml b/ansible/roles/blazar/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..bd95ef5162a63e423d012a8bd665f5fbac722102
--- /dev/null
+++ b/ansible/roles/blazar/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ blazar_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/ceilometer/tasks/stop.yml b/ansible/roles/ceilometer/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..fe151a027df28c391a6cc0115978bfb0535687e5
--- /dev/null
+++ b/ansible/roles/ceilometer/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ ceilometer_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/ceph/tasks/stop.yml b/ansible/roles/ceph/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..e3852b5fdebae702519692e6a383e3c782c46c2a
--- /dev/null
+++ b/ansible/roles/ceph/tasks/stop.yml
@@ -0,0 +1,63 @@
+---
+- name: Stopping ceph-mon container
+  kolla_docker:
+    action: "stop_container"
+    common_options: "{{ docker_common_options }}"
+    name: "ceph_mon"
+  when:
+    - inventory_hostname in groups['ceph-mon']
+    - "'ceph_mon' not in skip_stop_containers"
+
+- name: Find running ceph-osds containers
+  command: "docker ps --filter name=ceph_osd_ --format {% raw %}{{.Names}}{% endraw %}"
+  register: ceph_osd_containers
+
+- name: Stopping ceph-osd container
+  kolla_docker:
+    action: "stop_container"
+    common_options: "{{ docker_common_options }}"
+    name: "{{ item }}"
+  with_items: "{{ ceph_osd_containers.stdout_lines }}"
+  when:
+    - inventory_hostname in groups['ceph-osd']
+    - ceph_osd_containers.stdout_lines | length >= 1
+    - item not in skip_stop_containers
+
+- name: Stopping ceph-rgw container
+  kolla_docker:
+    action: "stop_container"
+    common_options: "{{ docker_common_options }}"
+    name: "ceph_rgw"
+  when:
+    - inventory_hostname in groups['ceph-rgw']
+    - enable_ceph_rgw | bool
+    - "'ceph_rgw' not in skip_stop_containers"
+
+- name: Stopping ceph-mgr container
+  kolla_docker:
+    action: "stop_container"
+    common_options: "{{ docker_common_options }}"
+    name: "ceph_mgr"
+  when:
+    - inventory_hostname in groups['ceph-mgr']
+    - "'ceph_mgr' not in skip_stop_containers"
+
+- name: Stopping ceph-mds container
+  kolla_docker:
+    action: "stop_container"
+    common_options: "{{ docker_common_options }}"
+    name: "ceph_mds"
+  when:
+    - enable_ceph_mds | bool
+    - inventory_hostname in groups['ceph-mds']
+    - "'ceph_mds' not in skip_stop_containers"
+
+- name: Stopping ceph-nfs container
+  kolla_docker:
+    action: "stop_container"
+    common_options: "{{ docker_common_options }}"
+    name: "ceph_nfs"
+  when:
+    - enable_ceph_nfs | bool
+    - inventory_hostname in groups['ceph-nfs']
+    - "'ceph_nfs' not in skip_stop_containers"
diff --git a/ansible/roles/chrony/tasks/stop.yml b/ansible/roles/chrony/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..03883ff3631f265f3632002fb24c090043c6a6ec
--- /dev/null
+++ b/ansible/roles/chrony/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ chrony_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/cinder/tasks/stop.yml b/ansible/roles/cinder/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..7de1a95d76db1505f1e1ceba37086d013332f392
--- /dev/null
+++ b/ansible/roles/cinder/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ cinder_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/cloudkitty/tasks/stop.yml b/ansible/roles/cloudkitty/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..22c0f26568729d5743cba8e9572e70b0821b7826
--- /dev/null
+++ b/ansible/roles/cloudkitty/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ cloudkitty_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/collectd/tasks/stop.yml b/ansible/roles/collectd/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..01794e86852b1616a14cc37da5d40791ac5b6245
--- /dev/null
+++ b/ansible/roles/collectd/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ collectd_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/common/tasks/stop.yml b/ansible/roles/common/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..3b2aaf7e48f243dff997a675932b8ec8c0313cd0
--- /dev/null
+++ b/ansible/roles/common/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ common_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/congress/tasks/stop.yml b/ansible/roles/congress/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..8c2f0dbda0428f26830af92efb8a1af8821470f3
--- /dev/null
+++ b/ansible/roles/congress/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ congress_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/designate/tasks/stop.yml b/ansible/roles/designate/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..166323f5a8607a63dfd2e02f30d0376f9bc8c5ba
--- /dev/null
+++ b/ansible/roles/designate/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ designate_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/elasticsearch/tasks/stop.yml b/ansible/roles/elasticsearch/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..bbf5ce56b3768c4d95f184cb347c7a61d735303f
--- /dev/null
+++ b/ansible/roles/elasticsearch/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ elasticsearch_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/etcd/tasks/stop.yml b/ansible/roles/etcd/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..b68d9184d40bb8c6203c86f26baea09f2c96c5a6
--- /dev/null
+++ b/ansible/roles/etcd/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ etcd_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/freezer/tasks/stop.yml b/ansible/roles/freezer/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..cd9f745de008bb453aaf71981414e797cb0c4c90
--- /dev/null
+++ b/ansible/roles/freezer/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ freezer_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/glance/tasks/stop.yml b/ansible/roles/glance/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..8f0ce1a7d8ced658bcd44e82f813a19a397fe182
--- /dev/null
+++ b/ansible/roles/glance/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ glance_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/gnocchi/tasks/stop.yml b/ansible/roles/gnocchi/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..5bff185939e302075b78a7bb0cbc9de0c22d6d27
--- /dev/null
+++ b/ansible/roles/gnocchi/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ gnocchi_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/grafana/tasks/stop.yml b/ansible/roles/grafana/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..4a7696c0841be52444127604034cf3bf59291bb8
--- /dev/null
+++ b/ansible/roles/grafana/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ grafana_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/haproxy/tasks/stop.yml b/ansible/roles/haproxy/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..aa5d0f64193c9bdfbdbf94cdbba49081137be671
--- /dev/null
+++ b/ansible/roles/haproxy/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ haproxy_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/heat/tasks/stop.yml b/ansible/roles/heat/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..5211a14f63fe533bce6ff9458660894134a0dfaf
--- /dev/null
+++ b/ansible/roles/heat/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ heat_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/horizon/tasks/stop.yml b/ansible/roles/horizon/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..4a8e5781af26389ba9485d7f7d6f4c9a36640f69
--- /dev/null
+++ b/ansible/roles/horizon/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ horizon_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/influxdb/tasks/stop.yml b/ansible/roles/influxdb/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..29d340ee92b8bd36e855fabfd8e194ba46148784
--- /dev/null
+++ b/ansible/roles/influxdb/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ influxdb_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/ironic/tasks/stop.yml b/ansible/roles/ironic/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..aef5c515e1810d217f7a5b2c01540227439f54a0
--- /dev/null
+++ b/ansible/roles/ironic/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ ironic_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/iscsi/tasks/stop.yml b/ansible/roles/iscsi/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..dcb016a0a767650ec9eed7c92369a8bc84a55797
--- /dev/null
+++ b/ansible/roles/iscsi/tasks/stop.yml
@@ -0,0 +1,19 @@
+---
+- name: Stopping iscsid container
+  kolla_docker:
+    action: "stop_container"
+    common_options: "{{ docker_common_options }}"
+    name: "iscsid"
+  when: ( ( inventory_hostname in groups['compute'] or inventory_hostname in groups['cinder-volume'] ) and enable_cinder | bool and enable_cinder_backend_iscsi | bool  )
+         or ( inventory_hostname in groups['ironic-conductor'] and enable_ironic | bool and 'iscsid' not in skip_stop_containers)
+
+- name: Stopping tgtd container
+  kolla_docker:
+    action: "stop_container"
+    common_options: "{{ docker_common_options }}"
+    name: "tgtd"
+  when:
+    - inventory_hostname in groups['tgtd']
+    - enable_cinder | bool
+    - enable_cinder_backend_lvm | bool
+    - "'tgtd' not in skip_stop_containers"
diff --git a/ansible/roles/kafka/tasks/stop.yml b/ansible/roles/kafka/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..f52b76f38573887810b065f7ff6c4124fc4ae97a
--- /dev/null
+++ b/ansible/roles/kafka/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ kafka_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/karbor/tasks/stop.yml b/ansible/roles/karbor/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..54775a0581b5a1121b233f548abb51f86f124c53
--- /dev/null
+++ b/ansible/roles/karbor/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ karbor_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/keystone/tasks/stop.yml b/ansible/roles/keystone/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..44631106528aa491ebc06cef4a50616f9e32eee7
--- /dev/null
+++ b/ansible/roles/keystone/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ keystone_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/kibana/tasks/stop.yml b/ansible/roles/kibana/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..5c5034a464dddac0726fd329f06246871b6f75fa
--- /dev/null
+++ b/ansible/roles/kibana/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ kibana_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/kuryr/tasks/stop.yml b/ansible/roles/kuryr/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..674769b3571f4bda17ba7f1c5620aea2f7da07ab
--- /dev/null
+++ b/ansible/roles/kuryr/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ kuryr_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/magnum/tasks/stop.yml b/ansible/roles/magnum/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..0e6c3504dce1685b29103b6ec4116aadc22b725e
--- /dev/null
+++ b/ansible/roles/magnum/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ magnum_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/manila/tasks/stop.yml b/ansible/roles/manila/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..a65735642cbd04d0dd94ec562df9a2f39898f915
--- /dev/null
+++ b/ansible/roles/manila/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ manila_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/mariadb/tasks/stop.yml b/ansible/roles/mariadb/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..d60e30573f7b68e1f86fe5175c14c87352b72425
--- /dev/null
+++ b/ansible/roles/mariadb/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ mariadb_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/memcached/tasks/stop.yml b/ansible/roles/memcached/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..2ca860f3cee6bb9ff86429ac8c4bed0c6edc848c
--- /dev/null
+++ b/ansible/roles/memcached/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ memcached_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/mistral/tasks/stop.yml b/ansible/roles/mistral/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..e5feb2222909fb28ace1319b5cad2c199f307a3d
--- /dev/null
+++ b/ansible/roles/mistral/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ mistral_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/monasca/tasks/stop.yml b/ansible/roles/monasca/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..d387236b95602c23fe1a1de76d4ae566a1840bcd
--- /dev/null
+++ b/ansible/roles/monasca/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ monasca_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/mongodb/tasks/stop.yml b/ansible/roles/mongodb/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..47d98263f3f164f8a33288ca2081ad18b8bb737f
--- /dev/null
+++ b/ansible/roles/mongodb/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ mongodb_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/multipathd/tasks/stop.yml b/ansible/roles/multipathd/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..383564e8f172e5ce4cb3901224eb71378c968edc
--- /dev/null
+++ b/ansible/roles/multipathd/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ multipathd_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/murano/tasks/stop.yml b/ansible/roles/murano/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..e395fe4c0ca67668055b77045e965c3c3cf860a3
--- /dev/null
+++ b/ansible/roles/murano/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ murano_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/neutron/tasks/stop.yml b/ansible/roles/neutron/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..8c030e9e8782b7cf76a83700db8c0fd15e8289d4
--- /dev/null
+++ b/ansible/roles/neutron/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ neutron_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/stop/tasks/check.yml b/ansible/roles/nova-hyperv/tasks/stop.yml
similarity index 100%
rename from ansible/roles/stop/tasks/check.yml
rename to ansible/roles/nova-hyperv/tasks/stop.yml
diff --git a/ansible/roles/nova/tasks/stop.yml b/ansible/roles/nova/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..c4ddb863478b1e0370503c5cbf3cef4d7eba9b62
--- /dev/null
+++ b/ansible/roles/nova/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ nova_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/octavia/tasks/stop.yml b/ansible/roles/octavia/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..f6a48244edbe46651f0847320639970b4d444baf
--- /dev/null
+++ b/ansible/roles/octavia/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ octavia_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/opendaylight/tasks/stop.yml b/ansible/roles/opendaylight/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..7cfd5b44adb882420fbaf2fb6b419d478c7a0a1a
--- /dev/null
+++ b/ansible/roles/opendaylight/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ opendaylight_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/openvswitch/tasks/stop.yml b/ansible/roles/openvswitch/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..c6c8ca282220d815186814e4e396cd39c3badce3
--- /dev/null
+++ b/ansible/roles/openvswitch/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ openvswitch_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/ovs-dpdk/tasks/stop.yml b/ansible/roles/ovs-dpdk/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..a5a8a02e56c736732cc38c983faff68401f99d62
--- /dev/null
+++ b/ansible/roles/ovs-dpdk/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ ovsdpdk_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/panko/tasks/stop.yml b/ansible/roles/panko/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..3d4fec5c39c0c5ab542bf79199871301b1945ca5
--- /dev/null
+++ b/ansible/roles/panko/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ panko_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/prometheus/tasks/stop.yml b/ansible/roles/prometheus/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..cda4198a6ce5f27bf9279a46a745a54b1f4611d9
--- /dev/null
+++ b/ansible/roles/prometheus/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ prometheus_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/qdrouterd/tasks/stop.yml b/ansible/roles/qdrouterd/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..a466a87ff7b0536b33a68e455496baccdd986a4b
--- /dev/null
+++ b/ansible/roles/qdrouterd/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ qdrouterd_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/rabbitmq/tasks/stop.yml b/ansible/roles/rabbitmq/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..f13c35e5159c3a056d5c17166b0331b9d1586d84
--- /dev/null
+++ b/ansible/roles/rabbitmq/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ rabbitmq_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/rally/tasks/stop.yml b/ansible/roles/rally/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..792d4ccfe70bb5c6ea34bec6819f977947381bff
--- /dev/null
+++ b/ansible/roles/rally/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ rally_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/redis/tasks/stop.yml b/ansible/roles/redis/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..d4566d02e80e3dcdb1a6756a08f8e634b2fb8459
--- /dev/null
+++ b/ansible/roles/redis/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ redis_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/sahara/tasks/stop.yml b/ansible/roles/sahara/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..02c3e6a9058143f9e24bf8aade4fbb42e95318c0
--- /dev/null
+++ b/ansible/roles/sahara/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ sahara_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/searchlight/tasks/stop.yml b/ansible/roles/searchlight/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..d6f795395c46a5384ea876f6918bc99b89cf73de
--- /dev/null
+++ b/ansible/roles/searchlight/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ searchlight_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/senlin/tasks/stop.yml b/ansible/roles/senlin/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..336538ad2457740273206a7e393ddfa53c209bdb
--- /dev/null
+++ b/ansible/roles/senlin/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ senlin_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/service-stop/tasks/main.yml b/ansible/roles/service-stop/tasks/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..b1db420588c841499afc4ea796ba96da14305e37
--- /dev/null
+++ b/ansible/roles/service-stop/tasks/main.yml
@@ -0,0 +1,12 @@
+---
+- name: "Stopping {{ service_name }} containers"
+  vars:
+    service: "{{ item.value }}"
+  kolla_docker:
+    action: "stop_container"
+    common_options: "{{ docker_common_options }}"
+    name: "{{ service.container_name }}"
+  when:
+    - service.enabled | bool
+    - service.container_name not in skip_stop_containers
+  with_dict: "{{ project_services }}"
diff --git a/ansible/roles/skydive/tasks/stop.yml b/ansible/roles/skydive/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..a6e363029c06efbba6a8fd63200b95fdab22b8ee
--- /dev/null
+++ b/ansible/roles/skydive/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ skydive_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/solum/tasks/stop.yml b/ansible/roles/solum/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..2667cb92277fcc337fbbd4f65f4ccf8d4c49e42c
--- /dev/null
+++ b/ansible/roles/solum/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ solum_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/stop/tasks/copy_tools.yml b/ansible/roles/stop/tasks/copy_tools.yml
deleted file mode 100644
index e6a1ec62d884759384744e3e3a45387c3c907417..0000000000000000000000000000000000000000
--- a/ansible/roles/stop/tasks/copy_tools.yml
+++ /dev/null
@@ -1,17 +0,0 @@
----
-- name: Creating /kolla-stop/tools directory on node
-  file:
-    state: directory
-    path: /tmp/kolla-stop/tools
-
-- name: Copying validate-docker-execute.sh file
-  copy:
-    src: ../tools/validate-docker-execute.sh
-    dest: /tmp/kolla-stop/tools
-    mode: 0755
-
-- name: Copying stop-containers file
-  copy:
-    src: ../tools/stop-containers
-    dest: /tmp/kolla-stop/tools
-    mode: 0755
diff --git a/ansible/roles/stop/tasks/main.yml b/ansible/roles/stop/tasks/main.yml
deleted file mode 100644
index deb3ddfae1543295bf5b89797ec86d115f41da15..0000000000000000000000000000000000000000
--- a/ansible/roles/stop/tasks/main.yml
+++ /dev/null
@@ -1,4 +0,0 @@
----
-- include_tasks: copy_tools.yml
-
-- include_tasks: stop_containers.yml
diff --git a/ansible/roles/stop/tasks/stop_containers.yml b/ansible/roles/stop/tasks/stop_containers.yml
deleted file mode 100644
index df184d0fe26455a9fdd707985a0e6ca087d0a3ea..0000000000000000000000000000000000000000
--- a/ansible/roles/stop/tasks/stop_containers.yml
+++ /dev/null
@@ -1,3 +0,0 @@
----
-- name: Stopping Kolla containers
-  command: /tmp/kolla-stop/tools/stop-containers
diff --git a/ansible/roles/storm/tasks/stop.yml b/ansible/roles/storm/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..2bc5681d68bb760aee5ec1db290d318a1e2eeb1d
--- /dev/null
+++ b/ansible/roles/storm/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ storm_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/swift/tasks/stop.yml b/ansible/roles/swift/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..19ec5a08f03927b99af60aa60c9e4dd64551ce03
--- /dev/null
+++ b/ansible/roles/swift/tasks/stop.yml
@@ -0,0 +1,136 @@
+---
+- name: Stopping swift-rsyncd container
+  kolla_docker:
+    action: "stop_container"
+    common_options: "{{ docker_common_options }}"
+    name: "swift_rsyncd"
+  when: ( inventory_hostname in groups['swift-account-server'] or
+          inventory_hostname in groups['swift-container-server'] or
+          inventory_hostname in groups['swift-object-server'] ) and
+          'swift_rsyncd' not in skip_stop_containers
+
+- name: Stopping swift-account-server container
+  kolla_docker:
+    action: "stop_container"
+    common_options: "{{ docker_common_options }}"
+    name: "swift_account_server"
+  when:
+    - inventory_hostname in groups['swift-account-server']
+    - "'swift_account_server' not in skip_stop_containers"
+
+- name: Stopping swift-account-auditor container
+  kolla_docker:
+    action: "stop_container"
+    common_options: "{{ docker_common_options }}"
+    name: "swift_account_auditor"
+  when:
+    - inventory_hostname in groups['swift-account-server']
+    - "'swift_object_auditor' not in skip_stop_containers"
+
+- name: Stopping swift-account-replicator container
+  kolla_docker:
+    action: "stop_container"
+    common_options: "{{ docker_common_options }}"
+    name: "swift_account_replicator"
+  when:
+    - inventory_hostname in groups['swift-account-server']
+    - "'swift_account_replicator' not in skip_stop_containers"
+
+- name: Stopping swift-account-reaper container
+  kolla_docker:
+    action: "stop_container"
+    common_options: "{{ docker_common_options }}"
+    name: "swift_account_reaper"
+  when:
+    - inventory_hostname in groups['swift-account-server']
+    - "'swift_account_reaper' not in skip_stop_containers"
+
+- name: Stopping swift-container-server container
+  kolla_docker:
+    action: "stop_container"
+    common_options: "{{ docker_common_options }}"
+    name: "swift_container_server"
+  when:
+    - inventory_hostname in groups['swift-container-server']
+    - "'swift_container_server' not in skip_stop_containers"
+
+- name: Stopping swift-container-auditor container
+  kolla_docker:
+    action: "stop_container"
+    common_options: "{{ docker_common_options }}"
+    name: "swift_container_auditor"
+  when:
+    - inventory_hostname in groups['swift-container-server']
+    - "'swift_container_auditor' not in skip_stop_containers"
+
+- name: Stopping swift-container-replicator container
+  kolla_docker:
+    action: "stop_container"
+    common_options: "{{ docker_common_options }}"
+    name: "swift_container_replicator"
+  when:
+    - inventory_hostname in groups['swift-container-server']
+    - "'swift_container_replicator' not in skip_stop_containers"
+
+- name: Stopping swift-container-updater container
+  kolla_docker:
+    action: "stop_container"
+    common_options: "{{ docker_common_options }}"
+    name: "swift_container_updater"
+  when:
+    - inventory_hostname in groups['swift-container-server']
+    - "'swift_container_updater' not in skip_stop_containers"
+
+- name: Stopping swift-object-server container
+  kolla_docker:
+    action: "stop_container"
+    common_options: "{{ docker_common_options }}"
+    name: "swift_object_server"
+  when:
+    - inventory_hostname in groups['swift-object-server']
+    - "'swift_object_server' not in skip_stop_containers"
+
+- name: Stopping swift-object-auditor container
+  kolla_docker:
+    action: "stop_container"
+    common_options: "{{ docker_common_options }}"
+    name: "swift_object_auditor"
+  when:
+    - inventory_hostname in groups['swift-object-server']
+    - "'swift_object_auditor' not in skip_stop_containers"
+
+- name: Stopping swift-object-replicator container
+  kolla_docker:
+    action: "stop_container"
+    common_options: "{{ docker_common_options }}"
+    name: "swift_object_replicator"
+  when:
+    - inventory_hostname in groups['swift-object-server']
+    - "'swift_object_replicator' not in skip_stop_containers"
+
+- name: Stopping swift-object-updater container
+  kolla_docker:
+    action: "start_container"
+    common_options: "{{ docker_common_options }}"
+    name: "swift_object_updater"
+  when:
+    - inventory_hostname in groups['swift-object-server']
+    - "'swift_object_updater' not in skip_stop_containers"
+
+- name: Stopping swift-object-expirer container
+  kolla_docker:
+    action: "stop_container"
+    common_options: "{{ docker_common_options }}"
+    name: "swift_object_expirer"
+  when:
+    - inventory_hostname in groups['swift-object-server']
+    - "'swift_object_expirer' not in skip_stop_containers"
+
+- name: Stopping swift-proxy-server container
+  kolla_docker:
+    action: "stop_container"
+    common_options: "{{ docker_common_options }}"
+    name: "swift_proxy_server"
+  when:
+    - inventory_hostname in groups['swift-proxy-server']
+    - "'swift_proxy_server' not in skip_stop_containers"
diff --git a/ansible/roles/tacker/tasks/stop.yml b/ansible/roles/tacker/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..026d386a1d1af16a16ffe8d99882c21234e8fbfe
--- /dev/null
+++ b/ansible/roles/tacker/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ tacker_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/telegraf/tasks/stop.yml b/ansible/roles/telegraf/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..e30795e6a0c338fdb317874a1c0c620dbda8c5a9
--- /dev/null
+++ b/ansible/roles/telegraf/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ telegraf_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/tempest/tasks/stop.yml b/ansible/roles/tempest/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..86989d6615c42fc693fba451fe423634333f874a
--- /dev/null
+++ b/ansible/roles/tempest/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ tempest_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/trove/tasks/stop.yml b/ansible/roles/trove/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..35f3021d1c1d5c5b8942e69ad9ca97da0a7a395d
--- /dev/null
+++ b/ansible/roles/trove/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ trove_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/vitrage/tasks/stop.yml b/ansible/roles/vitrage/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..4f5c631bf6594f9887dd95895b475141e82117bf
--- /dev/null
+++ b/ansible/roles/vitrage/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ vitrage_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/vmtp/tasks/stop.yml b/ansible/roles/vmtp/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..3dc1e86830eaec52a27376b0546905de89223da8
--- /dev/null
+++ b/ansible/roles/vmtp/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ vmtp_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/watcher/tasks/stop.yml b/ansible/roles/watcher/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..c0e95da4904a02b7ba0a136cdfa6a6dcc11821eb
--- /dev/null
+++ b/ansible/roles/watcher/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ watcher_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/zookeeper/tasks/stop.yml b/ansible/roles/zookeeper/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..62f198d765e609cf178489cc17ea2b7b1f99aa4c
--- /dev/null
+++ b/ansible/roles/zookeeper/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ zookeeper_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/roles/zun/tasks/stop.yml b/ansible/roles/zun/tasks/stop.yml
new file mode 100644
index 0000000000000000000000000000000000000000..f07c93fee6735989c87f5afd29a189544b216c06
--- /dev/null
+++ b/ansible/roles/zun/tasks/stop.yml
@@ -0,0 +1,6 @@
+---
+- import_role:
+    role: service-stop
+  vars:
+    project_services: "{{ zun_services }}"
+    service_name: "{{ project_name }}"
diff --git a/ansible/stop.yml b/ansible/stop.yml
deleted file mode 100644
index 0ff7bf494f893d6bce6e63b9f2f6fe81731b9de1..0000000000000000000000000000000000000000
--- a/ansible/stop.yml
+++ /dev/null
@@ -1,4 +0,0 @@
----
-- hosts: all
-  roles:
-    - stop
diff --git a/releasenotes/notes/stop-per-service-85a996bb2751ed52.yaml b/releasenotes/notes/stop-per-service-85a996bb2751ed52.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..a669f507d593684fda227d62c9ad51a9db02e866
--- /dev/null
+++ b/releasenotes/notes/stop-per-service-85a996bb2751ed52.yaml
@@ -0,0 +1,11 @@
+---
+features:
+  - |
+    Add support to stop a service with ``kolla-ansible stop`` command.
+    This feature will allow to stop specific services with ``--tags`` and
+    ``--limit`` to a host.
+upgrade:
+  - |
+    New ``kolla-ansible stop`` command requires the usage of
+    ``--yes-i-really-really-mean-it`` to avoid accidentally
+    stopping services.
diff --git a/setup.cfg b/setup.cfg
index 7fc0546a1b1ec8463a9217927016a119033477d5..228ea5b598dec5167739d42820d22dbd243eb6aa 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -28,7 +28,6 @@ data_files =
     share/kolla-ansible/tools = tools/cleanup-containers
     share/kolla-ansible/tools = tools/cleanup-host
     share/kolla-ansible/tools = tools/cleanup-images
-    share/kolla-ansible/tools = tools/stop-containers
     share/kolla-ansible/tools = tools/ovs-dpdkctl.sh
     share/kolla-ansible/doc = doc/*
     share/kolla-ansible/etc_examples = etc/*
diff --git a/tools/kolla-ansible b/tools/kolla-ansible
index 0706d7a76314862621c3b2a7242852a5247c7ae6..96024a348fca1743220e36c3f28e7b856ed917fa 100755
--- a/tools/kolla-ansible
+++ b/tools/kolla-ansible
@@ -330,7 +330,16 @@ EOF
         ;;
 (stop)
         ACTION="Stop Kolla containers"
-        PLAYBOOK="${BASEDIR}/ansible/stop.yml"
+        EXTRA_OPTS="$EXTRA_OPTS -e kolla_action=stop"
+        if [[ "${DANGER_CONFIRM}" != "--yes-i-really-really-mean-it" ]]; then
+            cat << EOF
+WARNING:
+    This will stop all deployed kolla containers, limit with tags is possible and also with
+    skip_stop_containers variable. To confirm, please add the following option:
+    --yes-i-really-really-mean-it
+EOF
+            exit 1
+        fi
         ;;
 (certificates)
         ACTION="Generate TLS Certificates"
diff --git a/tools/stop-containers b/tools/stop-containers
deleted file mode 100755
index f12c50f44ac391258830f9431f852b523b7eed5d..0000000000000000000000000000000000000000
--- a/tools/stop-containers
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-if [[ $(pgrep qemu) ]]; then
-    echo "Some qemu processes were detected."
-    echo "Docker will not be able to stop the nova_libvirt container with those running."
-    echo "Please clean them up before rerunning this script."
-    exit 1
-fi
-
-if [ -n "$1" ]; then
-    containers_to_stop=($(docker ps | grep -E "$1" | awk '{print $1}'))
-else
-    containers_to_stop=$(docker ps --filter "label=kolla_version" --format "{{.Names}}" -a)
-fi
-
-echo "Stopping containers..."
-(docker stop -t 30 ${containers_to_stop} 2>&1) > /dev/null
-
-echo "All containers stopped!"