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