diff --git a/ansible/group_vars/all.yml b/ansible/group_vars/all.yml
index 3f4fc4a108a256c1915272bea5bac70909aeaba4..70cec45ffb15c664abda92f308ccbfbd6ed15f54 100644
--- a/ansible/group_vars/all.yml
+++ b/ansible/group_vars/all.yml
@@ -86,6 +86,8 @@ tunnel_interface: "{{ network_interface }}"
 neutron_plugin_agent: "openvswitch"
 
 # The default ports used by each service.
+iscsi_port: "3260"
+
 mariadb_port: "3306"
 mariadb_wsrep_port: "4567"
 mariadb_ist_port: "4568"
@@ -188,6 +190,7 @@ enable_cinder: "no"
 enable_heat: "yes"
 enable_horizon: "yes"
 enable_ironic: "no"
+enable_iscsi: "no"
 enable_magnum: "no"
 enable_manila: "no"
 enable_mistral: "no"
diff --git a/ansible/inventory/all-in-one b/ansible/inventory/all-in-one
index 3bf301583fb6a89f35846b9833eeb39ca7f3e0a1..d8fa29d7af57f8c5a81e154762700048b14974db 100644
--- a/ansible/inventory/all-in-one
+++ b/ansible/inventory/all-in-one
@@ -146,6 +146,13 @@ cinder
 [cinder-volume:children]
 storage
 
+# iSCSI
+[iscsd:children]
+storage
+
+[tgtd:children]
+storage
+
 # Manila
 [manila-api:children]
 manila
diff --git a/ansible/roles/prechecks/tasks/port_checks.yml b/ansible/roles/prechecks/tasks/port_checks.yml
index 9f9c68853bd2978e418aede558a1b0855ce7e7fb..867c65fa1f54644fdb9a70edf830aa0cc45099e0 100644
--- a/ansible/roles/prechecks/tasks/port_checks.yml
+++ b/ansible/roles/prechecks/tasks/port_checks.yml
@@ -119,14 +119,6 @@
     state: stopped
   when: inventory_hostname in groups['haproxy']
 
-- name: Checking free port for iSCSI Target
-  wait_for:
-    host: "{{ hostvars[inventory_hostname]['ansible_' + storage_interface]['ipv4']['address'] }}"
-    port: "3260"
-    connect_timeout: 1
-    state: stopped
-  when: inventory_hostname in groups['cinder-volume']
-
 - name: Checking free port for Keystone Admin
   wait_for:
     host: "{{ hostvars[inventory_hostname]['ansible_' + api_interface]['ipv4']['address'] }}"
@@ -159,6 +151,14 @@
     state: stopped
   when: inventory_hostname in groups['haproxy']
 
+- name: Checking free port for iscsi
+  wait_for:
+    host: "{{ hostvars[inventory_hostname]['ansible_' + api_interface]['ipv4']['address'] }}"
+    port: "{{ iscsi_port }}"
+    connect_timeout: 1
+    state: stopped
+  when: inventory_hostname in groups['tgtd']
+
 - name: Checking free port for MariaDB
   wait_for:
     host: "{{ hostvars[inventory_hostname]['ansible_' + api_interface]['ipv4']['address'] }}"
diff --git a/ansible/site.yml b/ansible/site.yml
index 22f2d87a2efead114d7a37b0467f0dd016891749..a23196204c14da96926220b959bc764a41215066 100644
--- a/ansible/site.yml
+++ b/ansible/site.yml
@@ -20,6 +20,8 @@
     - haproxy
     - keystone
     - mariadb
+    - iscsid
+    - tgtd
     - murano-api
     - neutron-server
     - nova-api
@@ -50,6 +52,14 @@
         tags: mariadb,
         when: enable_mariadb | bool }
 
+- hosts:
+    - iscsid
+    - tgtd
+  roles:
+    - { role: iscsi,
+        tags: iscsi,
+        when: enable_iscsi | bool }
+
 - hosts: rabbitmq
   roles:
     - { role: rabbitmq,
diff --git a/kolla/common/config.py b/kolla/common/config.py
index 1d7fb88d4159ae3d8762e486b24f1db0307a41ba..5336a6240064aa2ea938bb6f29d5b5f9caa2dd3a 100644
--- a/kolla/common/config.py
+++ b/kolla/common/config.py
@@ -32,7 +32,7 @@ _PROFILE_OPTS = [
                 help='Infra images'),
     cfg.ListOpt('main',
                 default=['cinder', 'ceilometer', 'glance', 'heat',
-                         'horizon', 'keystone', 'neutron', 'nova',
+                         'horizon', 'iscsi', 'keystone', 'neutron', 'nova',
                          'swift'],
                 help='Main images'),
     cfg.ListOpt('aux',