Expose public_interface_tag support.
[apex-tripleo-heat-templates.git] / overcloud-source.yaml
1 description: Nova API,Keystone,Heat Engine and API,Glance,Neutron,Dedicated MySQL
2   server,Dedicated RabbitMQ Server,Group of Nova Computes
3 heat_template_version: 2013-05-23
4 parameters:
5   AdminPassword:
6     default: unset
7     description: The password for the keystone admin account, used for monitoring, querying neutron etc.
8     type: string
9     hidden: true
10   AdminToken:
11     default: unset
12     description: The keystone auth secret.
13     type: string
14     hidden: true
15   CinderPassword:
16     default: unset
17     description: The password for the cinder service account, used by cinder-api.
18     type: string
19     hidden: true
20   CinderISCSIHelper:
21     default: tgtadm
22     description: The iSCSI helper to use with cinder.
23     type: string
24   CinderLVMLoopDeviceSize:
25     default: 5000
26     description: The size of the loopback file used by the cinder LVM driver.
27     type: number
28   ExtraConfig:
29     default: {}
30     description: |
31       Additional configuration to inject into the cluster. The JSON should have
32       the following structure:
33         {"FILEKEY":
34           {"config":
35             [{"section": "SECTIONNAME",
36               "values":
37                 [{"option": "OPTIONNAME",
38                   "value": "VALUENAME"
39                  }
40                 ]
41              }
42             ]
43           }
44         }
45       For instance:
46         {"nova":
47           {"config":
48             [{"section": "default",
49               "values":
50                 [{"option": "compute_manager",
51                   "value": "ironic.nova.compute.manager.ClusterComputeManager"
52                  }
53                 ]
54              },
55              {"section": "cells",
56               "values":
57                 [{"option": "driver",
58                   "value": "nova.cells.rpc_driver.CellsRPCDriver"
59                  }
60                 ]
61              }
62             ]
63           }
64         }
65     type: json
66   OvercloudControlFlavor:
67     default: baremetal
68     description: Flavor for control nodes to request when deploying.
69     type: string
70   OvercloudComputeFlavor:
71     default: baremetal
72     description: Flavor for compute nodes to request when deploying.
73     type: string
74   GlancePort:
75     default: 9292
76     description: Glance port.
77     type: string
78   GlanceProtocol:
79     default: http
80     description: Protocol to use when connecting to glance, set to https for SSL.
81     type: string
82   GlancePassword:
83     default: unset
84     description: The password for the glance service account, used by the glance services.
85     type: string
86     hidden: true
87   GlanceNotifierStrategy:
88     description: Strategy to use for Glance notification queue
89     type: string
90     default: noop
91   GlanceLogFile:
92     description: The filepath of the file to use for logging messages from Glance.
93     type: string
94     default: ''
95   HeatPassword:
96     default: unset
97     description: The password for the Heat service account, used by the Heat services.
98     type: string
99     hidden: true
100   ImageUpdatePolicy:
101     default: 'REBUILD_PRESERVE_EPHEMERAL'
102     description: What policy to use when reconstructing instances. REBUILD for rebuilds, REBUILD_PRESERVE_EPHEMERAL to preserve /mnt.
103     type: string
104   KeyName:
105     default: default
106     description: Name of an existing EC2 KeyPair to enable SSH access to the instances
107     type: string
108   NeutronBridgeMappings:
109     description: The OVS logical->physical bridge mappings to use.
110     type: string
111     default: ''
112   NeutronPassword:
113     default: unset
114     description: The password for the neutron service account, used by neutron agents.
115     type: string
116     hidden: true
117   CeilometerComputeAgent:
118     description: Indicates whether the Compute agent is present and expects nova-compute to be configured accordingly
119     type: string
120     default: ''
121     constraints:
122     - allowed_values: ['', Present]
123   CeilometerMeteringSecret:
124     default: unset
125     description: Secret shared by the ceilometer services.
126     type: string
127     hidden: true
128   CeilometerPassword:
129     default: unset
130     description: The password for the ceilometer service account.
131     type: string
132     hidden: true
133   SnmpdReadonlyUserName:
134     default: ro_snmp_user
135     description: The user name for SNMPd with readonly rights running on all Overcloud nodes
136     type: string
137   SnmpdReadonlyUserPassword:
138     default: unset
139     description: The user password for SNMPd with readonly rights running on all Overcloud nodes
140     type: string
141     hidden: true
142   CloudName:
143     default: ''
144     description: The DNS name of this cloud. E.g. ci-overcloud.tripleo.org
145     type: string
146   NovaComputeDriver:
147     default: libvirt.LibvirtDriver
148     type: string
149   NovaComputeLibvirtType:
150     default: ''
151     type: string
152   NovaImage:
153     type: string
154     default: overcloud-compute
155   NovaPassword:
156     default: unset
157     description: The password for the nova service account, used by nova-api.
158     type: string
159     hidden: true
160   NeutronFlatNetworks:
161     type: string
162     default: ''
163     description: If set, flat networks to configure in neutron plugins.
164   HypervisorNeutronPhysicalBridge:
165     default: ''
166     description: An OVS bridge to create on each hypervisor.
167     type: string
168   HypervisorNeutronPublicInterface:
169     default: ''
170     description: What interface to add to the HypervisorNeutronPhysicalBridge.
171     type: string
172   NeutronPublicInterface:
173     default: eth0
174     description: What interface to bridge onto br-ex for network nodes.
175     type: string
176   NeutronPublicInterfaceDefaultRoute:
177     default: ''
178     description: A custom default route for the NeutronPublicInterface.
179     type: string
180   NeutronPublicInterfaceIP:
181     default: ''
182     description: A custom IP address to put onto the NeutronPublicInterface.
183     type: string
184   NeutronPublicInterfaceTag:
185     default: ''
186     description: |
187       VLAN tag for creating a public VLAN. The tag will be used to
188       create an access port on the exterior bridge for each control plane node,
189       and that port will be given the IP address returned by neutron from the
190       public network. Set CONTROLEXTRA=overcloud-vlan-port.yaml when compiling
191       overcloud.yaml to include the deployment of VLAN ports to the control
192       plane.
193     type: string
194   NeutronPublicInterfaceRawDevice:
195     default: ''
196     description: If set, the public interface is a vlan with this device as the raw device.
197     type: string
198   NeutronControlPlaneID:
199     default: ''
200     type: string
201     description: Neutron ID for ctlplane network.
202   NeutronDnsmasqOptions:
203     default: 'dhcp-option-force=26,1400'
204     description: Dnsmasq options for neutron-dhcp-agent. The default value here forces MTU to be set to 1400 to account for the gre tunnel overhead.
205     type: string
206   controllerImage:
207     type: string
208     default: overcloud-control
209   NtpServer:
210     type: string
211     default: ''
212   RabbitUserName:
213     default: guest
214     description: The username for RabbitMQ
215     type: string
216   RabbitPassword:
217     default: guest
218     description: The password for RabbitMQ
219     type: string
220     hidden: true
221   RabbitCookieSalt:
222     type: string
223     default: unset
224     description: Salt for the rabbit cookie, change this to force the randomly generated rabbit cookie to change.
225   HeatStackDomainAdminPassword:
226     description: Password for heat_domain_admin user.
227     type: string
228     default: ''
229     hidden: true
230   LiveUpdateUserName:
231     type: string
232     description: The live-update username for the undercloud Glance API.
233     default: ''
234   LiveUpdateTenantName:
235     type: string
236     description: The live-update tenant name for the undercloud Glance API.
237     default: ''
238   LiveUpdateHost:
239     type: string
240     description: The IP address for the undercloud Glance API.
241     default: ''
242   LiveUpdatePassword:
243     type: string
244     default: ''
245     description: The live-update password for the undercloud Glance API.
246     hidden: true
247   LiveUpdateComputeImage:
248     type: string
249     description: The image ID for live-updates to the overcloud compute nodes.
250     default: ''
251   MysqlInnodbBufferPoolSize:
252     description: >
253         Specifies the size of the buffer pool in megabytes. Setting to
254         zero should be interpreted as "no value" and will defer to the
255         lower level default.
256     type: number
257     default: 0
258   ControlVirtualInterface:
259     default: 'br-ex'
260     description: Interface where virtual ip will be assigned.
261     type: string
262   ControlFixedIPs:
263     default: []
264     description: Should be used for arbitrary ips.
265     type: json
266   PublicVirtualFixedIPs:
267     default: []
268     description: |
269         Control the IP allocation for the PublicVirtualInterface port. E.g.
270         [{'ip_address':'1.2.3.4'}]
271     type: json
272   PublicVirtualInterface:
273     default: 'br-ex'
274     description: >
275         Specifies the interface where the public-facing virtual ip will be assigned.
276         This should be int_public when a VLAN is being used.
277     type: string
278   PublicVirtualNetwork:
279     default: 'ctlplane'
280     type: string
281     description: >
282         Neutron network to allocate public virtual IP port on.
283   KeystoneCACertificate:
284     default: ''
285     description: Keystone self-signed certificate authority certificate.
286     type: string
287   KeystoneSigningCertificate:
288     default: ''
289     description: Keystone certificate for verifying token validity.
290     type: string
291   KeystoneSigningKey:
292     default: ''
293     description: Keystone key for signing tokens.
294     type: string
295     hidden: true
296 resources:
297   ControlVirtualIP:
298     type: OS::Neutron::Port
299     properties:
300       name: control_virtual_ip
301       network_id: {get_param: NeutronControlPlaneID}
302       fixed_ips:
303         get_param: ControlFixedIPs
304   MysqlClusterUniquePart:
305     type: OS::Heat::RandomString
306     properties:
307       length: 10
308   PublicVirtualIP:
309     type: OS::Neutron::Port
310     properties:
311       name: public_virtual_ip
312       network: {get_param: PublicVirtualNetwork}
313       fixed_ips:
314         get_param: PublicVirtualFixedIPs
315   RabbitCookie:
316     type: OS::Heat::RandomString
317     properties:
318       length: 20
319       salt:
320         get_param: RabbitCookieSalt
321   NovaCompute0Deploy:
322     type: FileInclude
323     Path: nova-compute-instance.yaml
324     SubKey: resources.NovaCompute0Deploy
325     parameters:
326         NovaApiHost: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
327         KeystoneHost: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
328         NeutronHost: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
329         GlanceHost: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
330         RabbitHost: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
331         NovaDSN:
332           Fn::Join:
333             - ''
334             - - mysql://nova:unset@
335               - &compute_database_host {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
336               - /nova
337         CeilometerDSN:
338           Fn::Join:
339             - ''
340             - - mysql://ceilometer:unset@
341               - *compute_database_host
342               - /ceilometer
343         NeutronDSN:
344           Fn::Join:
345             - ''
346             - - mysql://neutron:unset@
347               - *compute_database_host
348               - /ovs_neutron
349         NeutronNetworkType: "gre"
350         NeutronEnableTunnelling: "True"
351         NeutronFlatNetworks:
352             get_param: NeutronFlatNetworks
353         NeutronNetworkVLANRanges: ""
354         NeutronPhysicalBridge:
355             get_param: HypervisorNeutronPhysicalBridge
356         NeutronPublicInterface:
357             get_param: HypervisorNeutronPublicInterface
358         NeutronBridgeMappings:
359             get_param: NeutronBridgeMappings
360   NovaCompute0AllNodes:
361     type: FileInclude
362     Path: nova-compute-instance.yaml
363     SubKey: resources.NovaCompute0AllNodesDeploy
364     parameters:
365         AllNodesConfig: {get_resource: allNodesConfig}
366   NovaCompute0Passthrough:
367     type: FileInclude
368     Path: nova-compute-instance.yaml
369     SubKey: resources.NovaCompute0Passthrough
370     parameters:
371         passthrough_config: {get_param: ExtraConfig}
372   NovaCompute0:
373     type: FileInclude
374     Path: nova-compute-instance.yaml
375     SubKey: resources.NovaCompute0
376   controllerConfig:
377     type: OS::Heat::StructuredConfig
378     properties:
379       group: os-apply-config
380       config:
381         admin-password:
382           get_param: AdminPassword
383         admin-token:
384           get_param: AdminToken
385         bootstack:
386           public_interface_ip:
387             get_param: NeutronPublicInterfaceIP
388         bootstrap_host:
389           bootstrap_nodeid:
390             Fn::Select:
391             - 0
392             - Fn::Select:
393               - 0
394               - Merge::Map:
395                   controller0:
396                   - Fn::Select:
397                     - name
398                     - get_attr:
399                       - controller0
400                       - show
401           nodeid: {get_input: bootstack_nodeid}
402         database:
403           host: &database_host
404             {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
405         cinder:
406           db:
407             Fn::Join:
408               - ''
409               - - mysql://cinder:unset@
410                 - *database_host
411                 - /cinder
412           volume_size_mb:
413             get_param: CinderLVMLoopDeviceSize
414           service-password:
415             get_param: CinderPassword
416           iscsi-helper:
417             get_param: CinderISCSIHelper
418         controller-address:
419           get_input: controller_host
420         corosync:
421           bindnetaddr: {get_input: controller_host}
422           mcastport: 5577
423           nodes:
424             Merge::Map:
425               controller0:
426                 ip: {get_attr: [controller0, networks, ctlplane, 0]}
427         pacemaker:
428           stonith_enabled : false
429           recheck_interval : 5
430           quorum_policy : ignore
431         db-password: unset
432         glance:
433           registry:
434             host: {get_input: controller_virtual_ip}
435           backend: swift
436           db:
437             Fn::Join:
438               - ''
439               - - mysql://glance:unset@
440                 - *database_host
441                 - /glance
442           host:
443             get_input: controller_virtual_ip
444           port:
445             get_param: GlancePort
446           protocol:
447             get_param: GlanceProtocol
448           service-password:
449             get_param: GlancePassword
450           swift-store-user: service:glance
451           swift-store-key:
452             get_param: GlancePassword
453           notifier-strategy:
454             get_param: GlanceNotifierStrategy
455           log-file:
456             get_param: GlanceLogFile
457         heat:
458           admin_password:
459             get_param: HeatPassword
460           admin_tenant_name: service
461           admin_user: heat
462           auth_encryption_key: unset___________
463           db:
464             Fn::Join:
465               - ''
466               - - mysql://heat:unset@
467                 - *database_host
468                 - /heat
469           stack_domain_admin_password: {get_param: HeatStackDomainAdminPassword}
470           watch_server_url: {get_input: heat.watch_server_url}
471           metadata_server_url: {get_input: heat.metadata_server_url}
472           waitcondition_server_url: {get_input: heat.waitcondition_server_url}
473         horizon:
474           caches:
475             memcached:
476               nodes:
477                 Merge::Map:
478                   controller0:
479                     {get_attr: [controller0, show, name]}
480         keystone:
481           db:
482             Fn::Join:
483               - ''
484               - - mysql://keystone:unset@
485                 - *database_host
486                 - /keystone
487           host:
488             get_input: controller_virtual_ip
489           ca_certificate: {get_param: KeystoneCACertificate}
490           signing_key: {get_param: KeystoneSigningKey}
491           signing_certificate: {get_param: KeystoneSigningCertificate}
492         mysql:
493           innodb_buffer_pool_size: {get_param: MysqlInnodbBufferPoolSize}
494           local_bind: true
495           nodes:
496             Merge::Map:
497               controller0:
498                 ip: {get_attr: [controller0, networks, ctlplane, 0]}
499           cluster_name:
500             Fn::Join:
501               - '-'
502               - - 'tripleo'
503                 - {get_resource: MysqlClusterUniquePart}
504         neutron:
505           flat-networks: {get_param: NeutronFlatNetworks}
506           host: {get_input: controller_virtual_ip}
507           metadata_proxy_shared_secret: unset
508           ovs:
509             enable_tunneling: 'True'
510             local_ip:
511               get_input: controller_host
512             bridge_mappings: {get_param: NeutronBridgeMappings}
513             public_interface:
514               get_param: NeutronPublicInterface
515             public_interface_raw_device:
516               get_param: NeutronPublicInterfaceRawDevice
517             public_interface_route:
518               get_param: NeutronPublicInterfaceDefaultRoute
519             public_interface_tag:
520               get_param: NeutronPublicInterfaceTag
521             physical_bridge: br-ex
522             tenant_network_type: gre
523           ovs_db:
524             Fn::Join:
525               - ''
526               - - mysql://neutron:unset@
527                 - *database_host
528                 - /ovs_neutron?charset=utf8
529           service-password:
530             get_param: NeutronPassword
531           dnsmasq-options:
532             get_param: NeutronDnsmasqOptions
533         ceilometer:
534           db:
535             Fn::Join:
536               - ''
537               - - mysql://ceilometer:unset@
538                 - *database_host
539                 - /ceilometer
540           metering_secret: {get_param: CeilometerMeteringSecret}
541           service-password:
542             get_param: CeilometerPassword
543         snmpd:
544           export_MIB: UCD-SNMP-MIB
545           readonly_user_name:
546             get_param: SnmpdReadonlyUserName
547           readonly_user_password:
548             get_param: SnmpdReadonlyUserPassword
549         nova:
550           compute_driver: libvirt.LibvirtDriver
551           db:
552             Fn::Join:
553               - ''
554               - - mysql://nova:unset@
555                 - *database_host
556                 - /nova
557           default_floating_pool:
558             ext-net
559           host: {get_input: controller_virtual_ip}
560           metadata-proxy: true
561           service-password:
562             get_param: NovaPassword
563         rabbit:
564           host: {get_input: controller_virtual_ip}
565           username:
566             get_param: RabbitUserName
567           password:
568             get_param: RabbitPassword
569           cookie:
570             get_attr:
571             - RabbitCookie
572             - value
573         ntp:
574           servers:
575               - {server: {get_param: NtpServer}, fudge: "stratum 0"}
576         virtual_interfaces:
577           instances:
578             - vrrp_instance_name: VI_CONTROL
579               virtual_router_id: 51
580               keepalive_interface:
581                 get_param: ControlVirtualInterface
582               priority: 101
583               virtual_ips:
584               - ip: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
585                 interface:
586                   get_param: ControlVirtualInterface
587             - vrrp_instance_name: VI_PUBLIC
588               virtual_router_id: 52
589               keepalive_interface:
590                 get_param: PublicVirtualInterface
591               priority: 101
592               virtual_ips:
593               - ip: {get_attr: [PublicVirtualIP, fixed_ips, 0, ip_address]}
594                 interface:
595                   get_param: PublicVirtualInterface
596           vrrp_sync_groups:
597             - name: VG1
598               members:
599                 - VI_CONTROL
600                 - VI_PUBLIC
601         keepalived:
602           keepalive_interface:
603             get_param: PublicVirtualInterface
604           priority: 101
605         virtual_ips:
606             -
607               ip: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
608               interface:
609                 get_param: ControlVirtualInterface
610             -
611               ip: {get_attr: [PublicVirtualIP, fixed_ips, 0, ip_address]}
612               interface:
613                 get_param: PublicVirtualInterface
614         haproxy:
615           nodes:
616             Merge::Map:
617               controller0:
618                 ip: {get_attr: [controller0, networks, ctlplane, 0]}
619                 name: {get_attr: [controller0, show, name]}
620           net_binds:
621             - ip: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
622           services:
623             - name: keystone_admin
624               port: 35357
625               net_binds: &public_binds
626                 - ip: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
627                 - ip: {get_attr: [PublicVirtualIP, fixed_ips, 0, ip_address]}
628             - name: keystone_public
629               port: 5000
630               net_binds: *public_binds
631             - name: horizon
632               port: 80
633               net_binds: *public_binds
634             - name: neutron
635               port: 9696
636               net_binds: *public_binds
637             - name: cinder
638               port: 8776
639               net_binds: *public_binds
640             - name: glance_api
641               port: 9292
642               net_binds: *public_binds
643             - name: glance_registry
644               port: 9191
645               net_binds: *public_binds
646             - name: heat_api
647               port: 8004
648               net_binds: *public_binds
649             - name: heat_cloudwatch
650               port: 8003
651               net_binds: *public_binds
652             - name: heat_cfn
653               port: 8000
654               net_binds: *public_binds
655             - name: mysql
656               port: 3306
657               extra_server_params:
658                 - backup
659             - name: nova_ec2
660               port: 8773
661             - name: nova_osapi
662               port: 8774
663               net_binds: *public_binds
664             - name: nova_metadata
665               port: 8775
666               net_binds: *public_binds
667             - name: ceilometer
668               port: 8777
669               net_binds: *public_binds
670             - name: swift_proxy_server
671               port: 8080
672               net_binds: *public_binds
673             - name: rabbitmq
674               port: 5672
675               options:
676                 - timeout client 0
677                 - timeout server 0
678   controllerPassthrough:
679     type: OS::Heat::StructuredConfig
680     properties:
681       group: os-apply-config
682       config: {get_input: passthrough_config}
683   controller0:
684     type: OS::Nova::Server
685     properties:
686       image:
687         get_param: controllerImage
688       image_update_policy:
689         get_param: ImageUpdatePolicy
690       flavor:
691         get_param: OvercloudControlFlavor
692       key_name:
693         get_param: KeyName
694       networks:
695         - network: ctlplane
696       user_data_format: SOFTWARE_CONFIG
697   controller0AllNodes:
698     depends_on: [controller0Deployment,controller0SSLDeployment,controller0Swift,controller0Passthrough]
699     type: OS::Heat::StructuredDeployment
700     properties:
701       config: {get_resource: allNodesConfig}
702       server: {get_resource: controller0}
703   controller0Deployment:
704     type: OS::Heat::StructuredDeployment
705     properties:
706       signal_transport: NO_SIGNAL
707       config: {get_resource: controllerConfig}
708       server: {get_resource: controller0}
709       input_values:
710         bootstack_nodeid: {get_attr: [controller0, show, name]}
711         controller_host: {get_attr: [controller0, networks, ctlplane, 0]}
712         controller_virtual_ip:
713           {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
714         heat.watch_server_url:
715           Fn::Join:
716             - ''
717             - - 'http://'
718               - {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
719               - ':8003'
720         heat.metadata_server_url:
721           Fn::Join:
722             - ''
723             - - 'http://'
724               - {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
725               - ':8000'
726         heat.waitcondition_server_url:
727           Fn::Join:
728             - ''
729             - - 'http://'
730               - {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
731               - ':8000/v1/waitcondition'
732   allNodesConfig:
733     type: OS::Heat::StructuredConfig
734     properties:
735       config:
736         completion-signal: {get_input: deploy_signal_id}
737         hosts:
738           Fn::Join:
739           - "\n"
740           - - Fn::Join:
741               - "\n"
742               - Merge::Map:
743                   NovaCompute0:
744                     Fn::Join:
745                     - ' '
746                     - - {get_attr: [NovaCompute0, networks, ctlplane, 0]}
747                       - {get_attr: [NovaCompute0, show, name]}
748                       - Fn::Join:
749                         - '.'
750                         - - {get_attr: [NovaCompute0, show, name]}
751                           - 'novalocal'
752             - Fn::Join:
753               - "\n"
754               - Merge::Map:
755                   BlockStorage0:
756                     Fn::Join:
757                     - ' '
758                     - - {get_attr: [BlockStorage0, networks, ctlplane, 0]}
759                       - {get_attr: [BlockStorage0, show, name]}
760                       - Fn::Join:
761                         - '.'
762                         - - {get_attr: [BlockStorage0, show, name]}
763                           - 'novalocal'
764             - Fn::Join:
765               - "\n"
766               - Merge::Map:
767                   SwiftStorage0:
768                     Fn::Join:
769                     - ' '
770                     - - {get_attr: [SwiftStorage0, networks, ctlplane, 0]}
771                       - {get_attr: [SwiftStorage0, show, name]}
772                       - Fn::Join:
773                         - '.'
774                         - - {get_attr: [SwiftStorage0, show, name]}
775                           - 'novalocal'
776             - Fn::Join:
777               - "\n"
778               - Merge::Map:
779                   controller0:
780                     Fn::Join:
781                     - ' '
782                     - - {get_attr: [controller0, networks, ctlplane, 0]}
783                       - {get_attr: [controller0, show, name]}
784                       - Fn::Join:
785                         - '.'
786                         - - {get_attr: [controller0, show, name]}
787                           - 'novalocal'
788                       - {get_param: CloudName}
789         rabbit:
790           nodes:
791             Fn::Join:
792               - ','
793               - Merge::Map:
794                   controller0:
795                     {get_attr: [controller0, show, name]}
796   controller0SSLDeployment:
797     type: OS::Heat::StructuredDeployment
798     properties:
799       config: {get_resource: SSLConfig}
800       server: {get_resource: controller0}
801       signal_transport: NO_SIGNAL
802       input_values:
803         controller_host: {get_attr: [controller0, networks, ctlplane, 0]}
804         ssl_certificate: {get_param: SSLCertificate}
805         ssl_key: {get_param: SSLKey}
806         ssl_ca_certificate: {get_param: SSLCACertificate}
807   controller0Passthrough:
808     type: OS::Heat::StructuredDeployment
809     properties:
810       config: {get_resource: controllerPassthrough}
811       server: {get_resource: controller0}
812       signal_transport: NO_SIGNAL
813       input_values:
814         passthrough_config: {get_param: ExtraConfig}
815 outputs:
816   KeystoneURL:
817     description: URL for the Overcloud Keystone service
818     value:
819       Fn::Join:
820       - ''
821       - - http://
822         - {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
823         - :5000/v2.0/