diff --git a/ansible/inventory/all-in-one b/ansible/inventory/all-in-one
index 621a9c778ab221b8bb8b9b2ffe21e5cd1985e842..5b4a9156811f51d37e0ee60d87507bce2cf87b43 100644
--- a/ansible/inventory/all-in-one
+++ b/ansible/inventory/all-in-one
@@ -1,6 +1,14 @@
+# These initial groups are the only groups required to be modified. The
+# additional groups are for more control of the environment.
 [support]
 localhost       ansible_connection=local
 
+[compute]
+localhost       ansible_connection=local
+
+
+# You can explicitly specify which hosts run each project by updating the
+# groups in the sections below. Common services are grouped together.
 [database:children]
 support
 
@@ -12,3 +20,30 @@ support
 
 [glance:children]
 support
+
+[nova:children]
+support
+
+
+# Additional control implemented here. These groups allow you to control which
+# services run on which hosts at a per-service level.
+#
+# Word of caution: Some services are required to run on the same host to
+# function appropriately. For example, neutron-metadata-agent must run on the
+# same host as the l3-agent and (depending on configuration) the dhcp-agent.
+
+# Nova
+[nova-api:children]
+nova
+
+[nova-conductor:children]
+nova
+
+[nova-consoleauth:children]
+nova
+
+[nova-novncproxy:children]
+nova
+
+[nova-scheduler:children]
+nova
diff --git a/ansible/inventory/multinode b/ansible/inventory/multinode
index a38f7c035d210112ab8a499295ebc51c1b9ed5c1..5df5a783feb64e04f85a711a023d9128cb91a3cf 100644
--- a/ansible/inventory/multinode
+++ b/ansible/inventory/multinode
@@ -1,3 +1,5 @@
+# These initial groups are the only groups required to be modified. The
+# additional groups are for more control of the environment.
 [support]
 # These hostname must be resolvable from your deployment host
 support01       ansible_ssh_user=sam
@@ -7,6 +9,12 @@ support03       ansible_ssh_user=sam
 # The above can also be specified as follows:
 #support[01:03]     ansible_ssh_user=sam
 
+[compute]
+compute01
+
+
+# You can explicitly specify which hosts run each project by updating the
+# groups in the sections below. Common services are grouped together.
 [database:children]
 support
 
@@ -18,3 +26,30 @@ support
 
 [glance:children]
 support
+
+[nova:children]
+support
+
+
+# Additional control implemented here. These groups allow you to control which
+# services run on which hosts at a per-service level.
+#
+# Word of caution: Some services are required to run on the same host to
+# function appropriately. For example, neutron-metadata-agent must run on the
+# same host as the l3-agent and (depending on configuration) the dhcp-agent.
+
+# Nova
+[nova-api:children]
+nova
+
+[nova-conductor:children]
+nova
+
+[nova-consoleauth:children]
+nova
+
+[nova-novncproxy:children]
+nova
+
+[nova-scheduler:children]
+nova
diff --git a/ansible/roles/glance/defaults/main.yml b/ansible/roles/glance/defaults/main.yml
index b1b14aaf4c712bec53cb8cafb4dbd6d4db8787bd..cce4f70fd83287e8c089a85e29f57458458c830a 100644
--- a/ansible/roles/glance/defaults/main.yml
+++ b/ansible/roles/glance/defaults/main.yml
@@ -40,9 +40,6 @@ glance_public_address: "{{ kolla_external_address }}"
 glance_admin_address: "{{ kolla_internal_address }}"
 glance_internal_address: "{{ kolla_internal_address }}"
 
-glance_registry_port: "9191"
-glance_api_port: "9292"
-
 glance_logging_verbose: "{{ openstack_logging_verbose }}"
 glance_logging_debug: "{{ openstack_logging_debug }}"
 
diff --git a/ansible/roles/nova/defaults/main.yml b/ansible/roles/nova/defaults/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..82490ac633540dd6ffc70a2e190c3afa8c5f8c20
--- /dev/null
+++ b/ansible/roles/nova/defaults/main.yml
@@ -0,0 +1,71 @@
+---
+project_name: "nova"
+
+####################
+# Database
+####################
+nova_database_name: "nova"
+nova_database_user: "nova"
+nova_database_address: "{{ kolla_internal_address }}"
+
+# Do not override "service_*" variables
+service_database_name: "{{ nova_database_name }}"
+service_database_user: "{{ nova_database_user }}"
+service_database_password: "{{ nova_database_password }}"
+
+
+####################
+# Docker
+####################
+docker_nova_registry: "{{ docker_registry }}"
+docker_nova_namespace: "{{ docker_namespace }}"
+kolla_nova_base_distro: "{{ kolla_base_distro }}"
+kolla_nova_install_type: "{{ kolla_install_type }}"
+
+kolla_nova_libvirt_container_name: "nova-libvirt"
+docker_nova_libvirt_image: "{{ docker_nova_registry }}{{ docker_nova_namespace }}/{{ kolla_nova_base_distro }}-{{ kolla_nova_install_type }}-{{ kolla_nova_libvirt_container_name }}"
+docker_nova_libvirt_tag: "{{ openstack_release }}"
+docker_nova_libvirt_image_full: "{{ docker_nova_libvirt_image }}:{{ docker_nova_libvirt_tag }}"
+
+kolla_nova_api_container_name: "nova-api"
+docker_nova_api_image: "{{ docker_nova_registry }}{{ docker_nova_namespace }}/{{ kolla_nova_base_distro }}-{{ kolla_nova_install_type }}-{{ kolla_nova_api_container_name }}"
+docker_nova_api_tag: "{{ openstack_release }}"
+docker_nova_api_image_full: "{{ docker_nova_api_image }}:{{ docker_nova_api_tag }}"
+
+kolla_nova_conductor_container_name: "nova-conductor"
+docker_nova_conductor_image: "{{ docker_nova_registry }}{{ docker_nova_namespace }}/{{ kolla_nova_base_distro }}-{{ kolla_nova_install_type }}-{{ kolla_nova_conductor_container_name }}"
+docker_nova_conductor_tag: "{{ openstack_release }}"
+docker_nova_conductor_image_full: "{{ docker_nova_conductor_image }}:{{ docker_nova_conductor_tag }}"
+
+kolla_nova_consoleauth_container_name: "nova-consoleauth"
+docker_nova_consoleauth_image: "{{ docker_nova_registry }}{{ docker_nova_namespace }}/{{ kolla_nova_base_distro }}-{{ kolla_nova_install_type }}-{{ kolla_nova_consoleauth_container_name }}"
+docker_nova_consoleauth_tag: "{{ openstack_release }}"
+docker_nova_consoleauth_image_full: "{{ docker_nova_consoleauth_image }}:{{ docker_nova_consoleauth_tag }}"
+
+kolla_nova_novncproxy_container_name: "nova-novncproxy"
+docker_nova_novncproxy_image: "{{ docker_nova_registry }}{{ docker_nova_namespace }}/{{ kolla_nova_base_distro }}-{{ kolla_nova_install_type }}-{{ kolla_nova_novncproxy_container_name }}"
+docker_nova_novncproxy_tag: "{{ openstack_release }}"
+docker_nova_novncproxy_image_full: "{{ docker_nova_novncproxy_image }}:{{ docker_nova_novncproxy_tag }}"
+
+kolla_nova_scheduler_container_name: "nova-scheduler"
+docker_nova_scheduler_image: "{{ docker_nova_registry }}{{ docker_nova_namespace }}/{{ kolla_nova_base_distro }}-{{ kolla_nova_install_type }}-{{ kolla_nova_scheduler_container_name }}"
+docker_nova_scheduler_tag: "{{ openstack_release }}"
+docker_nova_scheduler_image_full: "{{ docker_nova_scheduler_image }}:{{ docker_nova_scheduler_tag }}"
+
+kolla_nova_compute_container_name: "nova-compute"
+docker_nova_compute_image: "{{ docker_nova_registry }}{{ docker_nova_namespace }}/{{ kolla_nova_base_distro }}-{{ kolla_nova_install_type }}-{{ kolla_nova_compute_container_name }}"
+docker_nova_compute_tag: "{{ openstack_release }}"
+docker_nova_compute_image_full: "{{ docker_nova_compute_image }}:{{ docker_nova_compute_tag }}"
+
+
+####################
+# Openstack
+####################
+nova_public_address: "{{ kolla_external_address }}"
+nova_admin_address: "{{ kolla_internal_address }}"
+nova_internal_address: "{{ kolla_internal_address }}"
+
+nova_logging_verbose: "{{ openstack_logging_verbose }}"
+nova_logging_debug: "{{ openstack_logging_debug }}"
+
+nova_keystone_user: "nova"
diff --git a/ansible/roles/nova/tasks/bootstrap.yml b/ansible/roles/nova/tasks/bootstrap.yml
new file mode 100644
index 0000000000000000000000000000000000000000..39f32a97e648d0cc2a609750d0b664e079e8c571
--- /dev/null
+++ b/ansible/roles/nova/tasks/bootstrap.yml
@@ -0,0 +1,12 @@
+---
+- include: ../../bootstrap.yml
+  vars:
+    container_detach: False
+    container_environment:
+      KOLLA_BOOTSTRAP:
+      KOLLA_CONFIG_STRATEGY: "{{ config_strategy }}"
+    container_image: "{{ docker_nova_api_image_full }}"
+    container_name: "bootstrap_nova"
+    container_restart_policy: "no"
+    container_volumes:
+      - "{{ node_config_directory }}/nova-api/:/opt/kolla/nova-api/:ro"
diff --git a/ansible/roles/nova/tasks/config.yml b/ansible/roles/nova/tasks/config.yml
new file mode 100644
index 0000000000000000000000000000000000000000..b1ea0df0553ecbf89eca59c86dad8e8c19f9481e
--- /dev/null
+++ b/ansible/roles/nova/tasks/config.yml
@@ -0,0 +1,120 @@
+---
+- include: ../../config.yml
+  vars:
+    service_name: "nova-api"
+    config_source:
+      - "roles/{{ project_name }}/templates/nova.conf.j2"
+      - "/etc/kolla/config/global.conf"
+      - "/etc/kolla/config/database.conf"
+      - "/etc/kolla/config/messaging.conf"
+      - "/etc/kolla/config/{{ project_name }}.conf"
+      - "/etc/kolla/config/{{ project_name }}/{{ service_name }}.conf"
+    config_template_dest:
+      - "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_minimal"
+      - "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_global"
+      - "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_database"
+      - "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_messaging"
+      - "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_augment"
+      - "{{ node_templates_directory }}/{{ service_name }}/{{ service_name }}.conf_augment"
+    config_dest: "{{ node_config_directory }}/{{ service_name }}/nova.conf"
+  when: inventory_hostname in groups['nova-api']
+
+- include: ../../config.yml
+  vars:
+    service_name: "nova-conductor"
+    config_source:
+      - "roles/{{ project_name }}/templates/nova.conf.j2"
+      - "/etc/kolla/config/global.conf"
+      - "/etc/kolla/config/database.conf"
+      - "/etc/kolla/config/messaging.conf"
+      - "/etc/kolla/config/{{ project_name }}.conf"
+      - "/etc/kolla/config/{{ project_name }}/{{ service_name }}.conf"
+    config_template_dest:
+      - "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_minimal"
+      - "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_global"
+      - "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_database"
+      - "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_messaging"
+      - "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_augment"
+      - "{{ node_templates_directory }}/{{ service_name }}/{{ service_name }}.conf_augment"
+    config_dest: "{{ node_config_directory }}/{{ service_name }}/nova.conf"
+  when: inventory_hostname in groups['nova-conductor']
+
+- include: ../../config.yml
+  vars:
+    service_name: "nova-consoleauth"
+    config_source:
+      - "roles/{{ project_name }}/templates/nova.conf.j2"
+      - "/etc/kolla/config/global.conf"
+      - "/etc/kolla/config/database.conf"
+      - "/etc/kolla/config/messaging.conf"
+      - "/etc/kolla/config/{{ project_name }}.conf"
+      - "/etc/kolla/config/{{ project_name }}/{{ service_name }}.conf"
+    config_template_dest:
+      - "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_minimal"
+      - "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_global"
+      - "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_database"
+      - "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_messaging"
+      - "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_augment"
+      - "{{ node_templates_directory }}/{{ service_name }}/{{ service_name }}.conf_augment"
+    config_dest: "{{ node_config_directory }}/{{ service_name }}/nova.conf"
+  when: inventory_hostname in groups['nova-consoleauth']
+
+- include: ../../config.yml
+  vars:
+    service_name: "nova-scheduler"
+    config_source:
+      - "roles/{{ project_name }}/templates/nova.conf.j2"
+      - "/etc/kolla/config/global.conf"
+      - "/etc/kolla/config/database.conf"
+      - "/etc/kolla/config/messaging.conf"
+      - "/etc/kolla/config/{{ project_name }}.conf"
+      - "/etc/kolla/config/{{ project_name }}/{{ service_name }}.conf"
+    config_template_dest:
+      - "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_minimal"
+      - "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_global"
+      - "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_database"
+      - "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_messaging"
+      - "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_augment"
+      - "{{ node_templates_directory }}/{{ service_name }}/{{ service_name }}.conf_augment"
+    config_dest: "{{ node_config_directory }}/{{ service_name }}/nova.conf"
+  when: inventory_hostname in groups['nova-scheduler']
+
+- include: ../../config.yml
+  vars:
+    service_name: "nova-compute"
+    config_source:
+      - "roles/{{ project_name }}/templates/nova.conf.j2"
+      - "/etc/kolla/config/global.conf"
+      - "/etc/kolla/config/database.conf"
+      - "/etc/kolla/config/messaging.conf"
+      - "/etc/kolla/config/{{ project_name }}.conf"
+      - "/etc/kolla/config/{{ project_name }}/{{ service_name }}.conf"
+    config_template_dest:
+      - "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_minimal"
+      - "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_global"
+      - "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_database"
+      - "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_messaging"
+      - "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_augment"
+      - "{{ node_templates_directory }}/{{ service_name }}/{{ service_name }}.conf_augment"
+    config_dest: "{{ node_config_directory }}/{{ service_name }}/nova.conf"
+  when: inventory_hostname in groups['compute']
+
+- include: ../../config.yml
+  vars:
+    service_name: "nova-novncproxy"
+    config_source:
+      - "roles/{{ project_name }}/templates/nova.conf.j2"
+      - "/etc/kolla/config/global.conf"
+      - "/etc/kolla/config/database.conf"
+      - "/etc/kolla/config/messaging.conf"
+      - "/etc/kolla/config/{{ project_name }}.conf"
+      - "/etc/kolla/config/{{ project_name }}/{{ service_name }}.conf"
+    config_template_dest:
+      - "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_minimal"
+      - "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_global"
+      - "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_database"
+      - "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_messaging"
+      - "{{ node_templates_directory }}/{{ service_name }}/{{ project_name }}.conf_augment"
+      - "{{ node_templates_directory }}/{{ service_name }}/{{ service_name }}.conf_augment"
+    config_dest: "{{ node_config_directory }}/{{ service_name }}/nova.conf"
+  when: inventory_hostname in groups['nova-novncproxy']
diff --git a/ansible/roles/nova/tasks/main.yml b/ansible/roles/nova/tasks/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..5c48120b7c9e6ee00027462c3f23aa25c6b05dd7
--- /dev/null
+++ b/ansible/roles/nova/tasks/main.yml
@@ -0,0 +1,8 @@
+---
+- include: register.yml
+
+- include: config.yml
+
+- include: bootstrap.yml
+
+- include: start.yml
diff --git a/ansible/roles/nova/tasks/register.yml b/ansible/roles/nova/tasks/register.yml
new file mode 100644
index 0000000000000000000000000000000000000000..5ca3d12354baffe1c880b59fa55412d3dc65b574
--- /dev/null
+++ b/ansible/roles/nova/tasks/register.yml
@@ -0,0 +1,21 @@
+---
+- name: Creating the Nova service and endpoint
+  kolla_keystone_service:
+    service_name: "nova"
+    service_type: "compute"
+    description: "Openstack Compute"
+    endpoint_region: "{{ openstack_region_name }}"
+    admin_url: "http://{{ kolla_internal_address }}:{{ nova_api_port }}/v2/%(tenant_id)s"
+    internal_url: "http://{{ kolla_internal_address }}:{{ nova_api_port }}/v2/%(tenant_id)s"
+    public_url: "http://{{ kolla_external_address }}:{{ nova_api_port }}/v2/%(tenant_id)s"
+    auth: "{{ openstack_auth_v2 }}"
+    region_name: "{{ openstack_region_name }}"
+
+- name: Creating the Nova project, user, and role
+  kolla_keystone_user:
+    project: "service"
+    user: "nova"
+    password: "{{ nova_keystone_password }}"
+    role: "admin"
+    auth: "{{ openstack_auth_v2 }}"
+    region_name: "{{ openstack_region_name }}"
diff --git a/ansible/roles/nova/tasks/start.yml b/ansible/roles/nova/tasks/start.yml
new file mode 100644
index 0000000000000000000000000000000000000000..18b2f0e8cfa9eef8491182090c63aee786b67982
--- /dev/null
+++ b/ansible/roles/nova/tasks/start.yml
@@ -0,0 +1,76 @@
+---
+- include: ../../start.yml
+  vars:
+    container_environment:
+      KOLLA_CONFIG_STRATEGY: "{{ config_strategy }}"
+    container_image: "{{ docker_nova_libvirt_image_full }}"
+    container_name: "nova_libvirt"
+    container_privileged: "True"
+    container_volumes:
+      - "/run:/run"
+      - "/lib/modules:/lib/modules:ro"
+  when: inventory_hostname in groups['compute']
+
+- include: ../../start.yml
+  vars:
+    container_environment:
+      KOLLA_CONFIG_STRATEGY: "{{ config_strategy }}"
+    container_image: "{{ docker_nova_api_image_full }}"
+    container_name: "nova_api"
+    container_privileged: "True"
+    container_volumes:
+      - "{{ node_config_directory }}/nova-api/:/opt/kolla/nova-api/:ro"
+      - "/lib/modules:/lib/modules:ro"
+  when: inventory_hostname in groups['nova-api']
+
+- include: ../../start.yml
+  vars:
+    container_environment:
+      KOLLA_CONFIG_STRATEGY: "{{ config_strategy }}"
+    container_image: "{{ docker_nova_conductor_image_full }}"
+    container_name: "nova_conductor"
+    container_volumes:
+      - "{{ node_config_directory }}/nova-conductor/:/opt/kolla/nova-conductor/:ro"
+  when: inventory_hostname in groups['nova-conductor']
+
+- include: ../../start.yml
+  vars:
+    container_environment:
+      KOLLA_CONFIG_STRATEGY: "{{ config_strategy }}"
+    container_image: "{{ docker_nova_consoleauth_image_full }}"
+    container_name: "nova_consoleauth"
+    container_volumes:
+      - "{{ node_config_directory }}/nova-consoleauth/:/opt/kolla/nova-consoleauth/:ro"
+  when: inventory_hostname in groups['nova-consoleauth']
+
+- include: ../../start.yml
+  vars:
+    container_environment:
+      KOLLA_CONFIG_STRATEGY: "{{ config_strategy }}"
+    container_image: "{{ docker_nova_novncproxy_image_full }}"
+    container_name: "nova_novncproxy"
+    container_volumes:
+      - "{{ node_config_directory }}/nova-novncproxy/:/opt/kolla/nova-novncproxy/:ro"
+  when: inventory_hostname in groups['nova-novncproxy']
+
+- include: ../../start.yml
+  vars:
+    container_environment:
+      KOLLA_CONFIG_STRATEGY: "{{ config_strategy }}"
+    container_image: "{{ docker_nova_scheduler_image_full }}"
+    container_name: "nova_scheduler"
+    container_volumes:
+      - "{{ node_config_directory }}/nova-scheduler/:/opt/kolla/nova-scheduler/:ro"
+  when: inventory_hostname in groups['nova-scheduler']
+
+- include: ../../start.yml
+  vars:
+    container_environment:
+      KOLLA_CONFIG_STRATEGY: "{{ config_strategy }}"
+    container_image: "{{ docker_nova_compute_image_full }}"
+    container_name: "nova_compute"
+    container_volumes:
+      - "{{ node_config_directory }}/nova-compute/:/opt/kolla/nova-compute/:ro"
+      - "/run:/run"
+      - "/lib/modules:/lib/modules:ro"
+  when: inventory_hostname in groups['compute']
diff --git a/ansible/roles/nova/templates/nova.conf.j2 b/ansible/roles/nova/templates/nova.conf.j2
new file mode 100644
index 0000000000000000000000000000000000000000..b44168837ea232f47c37835bac12d538dfc89a50
--- /dev/null
+++ b/ansible/roles/nova/templates/nova.conf.j2
@@ -0,0 +1,69 @@
+[DEFAULT]
+verbose = true
+debug = true
+
+state_path = /var/lib/nova
+lock_path = /var/lock/nova
+api_paste_config = /etc/nova/api-paste.ini
+
+osapi_compute_listen = {{ hostvars[inventory_hostname]['ansible_' + api_interface]['ipv4']['address'] }}
+ec2_listen = {{ hostvars[inventory_hostname]['ansible_' + api_interface]['ipv4']['address'] }}
+
+notification_driver = nova.openstack.common.notifier.rpc_notifier
+
+virt_type = kvm
+security_group_api = neutron
+network_api_class = nova.network.neutronv2.api.API
+firewall_driver = nova.virt.firewall.NoopFirewallDriver
+linuxnet_interface_driver = nova.network.linux_net.LinuxOVSInterfaceDriver
+
+compute_driver = libvirt.LibvirtDriver
+allow_resize_to_same_host = true
+
+vnc_enabled = true
+my_ip = {{ hostvars[inventory_hostname]['ansible_' + api_interface]['ipv4']['address'] }}
+vncserver_listen = {{ hostvars[inventory_hostname]['ansible_' + api_interface]['ipv4']['address'] }}
+vncserver_proxyclient_address = {{ hostvars[inventory_hostname]['ansible_' + api_interface]['ipv4']['address'] }}
+novncproxy_base_url = http://{{ kolla_internal_address }}:6080/vnc_auto.html
+
+[oslo_messaging_rabbit]
+rabbit_host = {{ kolla_internal_address }}
+rabbit_userid = {{ rabbitmq_user }}
+rabbit_password = {{ rabbitmq_password }}
+rabbit_ha_queues = true
+
+[oslo_concurrency]
+lock_path = /var/lib/nova/tmp
+
+[glance]
+host = {{ kolla_internal_address }}
+
+[cinder]
+catalog_info = volume:cinder:internalURL
+
+[neutron]
+url = http://{{ kolla_internal_address }}:{{ neutron_server_port }}
+auth_strategy = keystone
+admin_auth_url = http://{{ kolla_internal_address }}:{{ keystone_admin_port }}/v2.0
+admin_tenant_name = service
+admin_username = neutron
+admin_password = {{ neutron_keystone_password }}
+metadata_proxy_shared_secret = {{ metadata_secret }}
+service_metadata_proxy = true
+
+[database]
+connection = mysql://{{ nova_database_user }}:{{ nova_database_password }}@{{ nova_database_address }}/{{ nova_database_name }}
+
+[keystone_authtoken]
+auth_uri = http://{{ kolla_internal_address }}:{{ keystone_public_port }}
+auth_url = http://{{ kolla_internal_address }}:{{ keystone_admin_port }}
+auth_plugin = password
+project_domain_id = default
+user_domain_id = default
+project_name = service
+username = nova
+password = {{ nova_keystone_password }}
+
+[libvirt]
+connection_type = libivrt
+inject_partition = -2
diff --git a/ansible/site.yml b/ansible/site.yml
index 4ba9f955120f09c589b66ddb3a3da0ce85490748..db3d31a823607c5e3188c48ce7a3f7de3ef1de9f 100644
--- a/ansible/site.yml
+++ b/ansible/site.yml
@@ -18,3 +18,8 @@
   roles:
     - glance
   tags: glance
+
+- hosts: nova
+  roles:
+    - nova
+  tags: nova
diff --git a/docker/common/nova-controller/nova-api/start.sh b/docker/common/nova-controller/nova-api/start.sh
index 0737ba0b766550282470043cb6f578ddda641255..0d7ffca9b5abe74c9e0858f6197d63498392ac37 100755
--- a/docker/common/nova-controller/nova-api/start.sh
+++ b/docker/common/nova-controller/nova-api/start.sh
@@ -10,4 +10,11 @@ source /opt/kolla/kolla-common.sh
 # Config-internal script exec out of this function, it does not return here.
 set_configs
 
+# Bootstrap and exit if KOLLA_BOOTSTRAP variable is set. This catches all cases
+# of the KOLLA_BOOTSTRAP variable being set, including empty.
+if [[ "${!KOLLA_BOOTSTRAP[@]}" ]]; then
+    su -s /bin/sh -c "nova-manage db sync" nova
+    exit 0
+fi
+
 exec $CMD $ARGS
diff --git a/docker/common/nova-controller/nova-conductor/start.sh b/docker/common/nova-controller/nova-conductor/start.sh
index e3a322719709b2d0cb02caaf78733dd2beddd21e..4a0074d3954d74be5dddbb7a3201e746f0dfeb28 100755
--- a/docker/common/nova-controller/nova-conductor/start.sh
+++ b/docker/common/nova-controller/nova-conductor/start.sh
@@ -10,11 +10,4 @@ source /opt/kolla/kolla-common.sh
 # Config-internal script exec out of this function, it does not return here.
 set_configs
 
-# Bootstrap and exit if KOLLA_BOOTSTRAP variable is set. This catches all cases
-# of the KOLLA_BOOTSTRAP variable being set, including empty.
-if [[ "${!KOLLA_BOOTSTRAP[@]}" ]]; then
-    su -s /bin/sh -c "nova-manage db sync" nova
-    exit 0
-fi
-
 exec $CMD $ARGS
diff --git a/etc/kolla/config/nova.conf b/etc/kolla/config/nova.conf
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/etc/kolla/config/nova/nova-api.conf b/etc/kolla/config/nova/nova-api.conf
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/etc/kolla/config/nova/nova-compute.conf b/etc/kolla/config/nova/nova-compute.conf
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/etc/kolla/config/nova/nova-conductor.conf b/etc/kolla/config/nova/nova-conductor.conf
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/etc/kolla/config/nova/nova-consoleauth.conf b/etc/kolla/config/nova/nova-consoleauth.conf
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/etc/kolla/config/nova/nova-novncproxy.conf b/etc/kolla/config/nova/nova-novncproxy.conf
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/etc/kolla/config/nova/nova-scheduler.conf b/etc/kolla/config/nova/nova-scheduler.conf
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/etc/kolla/defaults.yml b/etc/kolla/defaults.yml
index 3eda3739790a2f3c5f35f579bc93ececfddc8bf0..e2ab12d11127eb38b8d380d305089ef708af10e6 100644
--- a/etc/kolla/defaults.yml
+++ b/etc/kolla/defaults.yml
@@ -18,3 +18,17 @@ node_templates_directory: "/usr/share/kolla/templates"
 
 # The directory to store the config files on the destination node
 node_config_directory: "/opt/kolla/config"
+
+# All services have ports that need to be referenced on a global scale between
+# the different services. This prevents setting the ports in the defaults for
+# each role.
+
+keystone_public_port: "5000"
+keystone_admin_port: "35357"
+
+glance_api_port: "9292"
+glance_registry_port: "9191"
+
+nova_api_port: "8774"
+
+neutron_server_port: "9696"
diff --git a/etc/kolla/globals.yml b/etc/kolla/globals.yml
index e90380990d8ba136c67e3402e5922336f94d7faa..63bf15f5f423d9f502c072c5d0129299f34f8b98 100644
--- a/etc/kolla/globals.yml
+++ b/etc/kolla/globals.yml
@@ -69,8 +69,6 @@ openstack_logging_verbose: "True"
 openstack_logging_debug: "False"
 
 openstack_region_name: "RegionOne"
-keystone_public_port: "5000"
-keystone_admin_port: "35357"
 
 openstack_auth:
     auth_url: "http://{{ kolla_internal_address }}:{{ keystone_admin_port }}"
diff --git a/etc/kolla/passwords.yml b/etc/kolla/passwords.yml
index 6089b283a07a20326005cc0de6e5e7c6214253a7..754f112a69049ede091b38dbbeba3b9218a26fe9 100644
--- a/etc/kolla/passwords.yml
+++ b/etc/kolla/passwords.yml
@@ -25,6 +25,13 @@ keystone_database_password: "password"
 glance_database_password: "password"
 glance_keystone_password: "password"
 
+nova_database_password: "password"
+nova_keystone_password: "password"
+
+neutron_database_password: "password"
+neutron_keystone_password: "password"
+
+metadata_secret: "password"
 
 ####################
 # RabbitMQ options