diff --git a/ansible/group_vars/all.yml b/ansible/group_vars/all.yml
index 69c412914e..a55eed2260 100644
--- a/ansible/group_vars/all.yml
+++ b/ansible/group_vars/all.yml
@@ -84,6 +84,7 @@ nova_api_port: "8774"
 nova_api_ec2_port: "8773"
 nova_metadata_port: "8775"
 nova_novncproxy_port: "6080"
+nova_spicehtml5proxy_port: "6082"
 
 neutron_server_port: "9696"
 
@@ -113,6 +114,9 @@ openstack_logging_debug: "False"
 
 openstack_region_name: "RegionOne"
 
+# Valid options are [ novnc, spice ]
+nova_console: "novnc"
+
 # Openstack authentication string. You should only need to override these if you
 # are changing the admin tenant/project or user.
 openstack_auth:
diff --git a/ansible/roles/nova/templates/nova.conf.j2 b/ansible/roles/nova/templates/nova.conf.j2
index 397166bd14..847728cad9 100644
--- a/ansible/roles/nova/templates/nova.conf.j2
+++ b/ansible/roles/nova/templates/nova.conf.j2
@@ -38,15 +38,28 @@ memcached_servers = {% for host in groups['memcached'] %}{{ hostvars[host]['ansi
 # Though my_ip is not used directly, lots of other variables use $my_ip
 my_ip = {{ hostvars[inventory_hostname]['ansible_' + api_interface]['ipv4']['address'] }}
 
+{% if nova_console == 'novnc' %}
+[vnc]
 vncserver_listen = {{ hostvars[inventory_hostname]['ansible_' + api_interface]['ipv4']['address'] }}
 vncserver_proxyclient_address = {{ hostvars[inventory_hostname]['ansible_' + api_interface]['ipv4']['address'] }}
-
-novncproxy_host = {{ hostvars[inventory_hostname]['ansible_' + api_interface]['ipv4']['address'] }}
-novncproxy_port = {{ nova_novncproxy_port }}
-
 {% if inventory_hostname in groups['compute'] %}
 novncproxy_base_url = http://{{ kolla_internal_address }}:{{ nova_novncproxy_port }}/vnc_auto.html
 {% endif %}
+novncproxy_host = {{ hostvars[inventory_hostname]['ansible_' + api_interface]['ipv4']['address'] }}
+novncproxy_port = {{ nova_novncproxy_port }}
+{% elif nova_console == 'spice' %}
+[vnc]
+# We have to turn off vnc to use spice
+enabled = false
+[spice]
+server_listen = {{ hostvars[inventory_hostname]['ansible_' + api_interface]['ipv4']['address'] }}
+server_proxyclient_address = {{ hostvars[inventory_hostname]['ansible_' + api_interface]['ipv4']['address'] }}
+{% if inventory_hostname in groups['compute'] %}
+html5proxy_base_url = http://{{ kolla_internal_address }}:{{ nova_spicehtml5proxy_port }}/spice_auto.html
+{% endif %}
+html5proxy_host = {{ hostvars[inventory_hostname]['ansible_' + api_interface]['ipv4']['address'] }}
+html5proxy_port = {{ nova_html5proxy_port }}
+{% endif %}
 
 {% if enable_ironic | bool %}
 compute_driver = nova.virt.ironic.IronicDriver
diff --git a/etc/kolla/globals.yml b/etc/kolla/globals.yml
index cdb7c1711b..507b969868 100644
--- a/etc/kolla/globals.yml
+++ b/etc/kolla/globals.yml
@@ -81,6 +81,9 @@ neutron_external_interface: "eth1"
 #openstack_logging_verbose: "True"
 #openstack_logging_debug: "False"
 
+# Valid options are [ novnc, spice ]
+#nova_console: "novnc"
+
 # OpenStack services can be enabled or disabled with these options
 #enable_cinder: "yes"
 #enable_heat: "no"