Switch to heat_template_version: 2013-05-23
[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   NeutronPublicInterfaceRawDevice:
185     default: ''
186     description: If set, the public interface is a vlan with this device as the raw device.
187     type: string
188   NeutronControlPlaneID:
189     default: ''
190     type: string
191     description: Neutron ID for ctlplane network.
192   NeutronDnsmasqOptions:
193     default: 'dhcp-option-force=26,1400'
194     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.
195     type: string
196   controllerImage:
197     type: string
198     default: overcloud-control
199   NtpServer:
200     type: string
201     default: ''
202   RabbitUserName:
203     default: guest
204     description: The username for RabbitMQ
205     type: string
206   RabbitPassword:
207     default: guest
208     description: The password for RabbitMQ
209     type: string
210     hidden: true
211   RabbitCookieSalt:
212     type: string
213     default: unset
214     description: Salt for the rabbit cookie, change this to force the randomly generated rabbit cookie to change.
215   HeatStackDomainAdminPassword:
216     description: Password for heat_domain_admin user.
217     type: string
218     default: ''
219     hidden: true
220   LiveUpdateUserName:
221     type: string
222     description: The live-update username for the undercloud Glance API.
223     default: ''
224   LiveUpdateTenantName:
225     type: string
226     description: The live-update tenant name for the undercloud Glance API.
227     default: ''
228   LiveUpdateHost:
229     type: string
230     description: The IP address for the undercloud Glance API.
231     default: ''
232   LiveUpdatePassword:
233     type: string
234     default: ''
235     description: The live-update password for the undercloud Glance API.
236     hidden: true
237   LiveUpdateComputeImage:
238     type: string
239     description: The image ID for live-updates to the overcloud compute nodes.
240     default: ''
241   MysqlInnodbBufferPoolSize:
242     description: >
243         Specifies the size of the buffer pool in megabytes. Setting to
244         zero should be interpreted as "no value" and will defer to the
245         lower level default.
246     type: number
247     default: 0
248   ControlVirtualInterface:
249     default: 'br-ex'
250     description: Interface where virtual ip will be assigned.
251     type: string
252   ControlFixedIPs:
253     default: []
254     description: Should be used for arbitrary ips.
255     type: json
256   PublicVirtualFixedIPs:
257     default: []
258     description: |
259         Control the IP allocation for the PublicVirtualInterface port. E.g.
260         [{'ip_address':'1.2.3.4'}]
261     type: json
262   PublicVirtualInterface:
263     default: 'br-ex'
264     description: >
265         Specifies the interface where the public-facing virtual ip will be assigned.
266         This should be int_public when a VLAN is being used.
267     type: string
268   PublicVirtualNetwork:
269     default: 'ctlplane'
270     type: string
271     description: >
272         Neutron network to allocate public virtual IP port on.
273   KeystoneCACertificate:
274     default: ''
275     description: Keystone self-signed certificate authority certificate.
276     type: string
277   KeystoneSigningCertificate:
278     default: ''
279     description: Keystone certificate for verifying token validity.
280     type: string
281   KeystoneSigningKey:
282     default: ''
283     description: Keystone key for signing tokens.
284     type: string
285     hidden: true
286 resources:
287   ControlVirtualIP:
288     type: OS::Neutron::Port
289     properties:
290       name: control_virtual_ip
291       network_id: {get_param: NeutronControlPlaneID}
292       fixed_ips:
293         get_param: ControlFixedIPs
294   MysqlClusterUniquePart:
295     type: OS::Heat::RandomString
296     properties:
297       length: 10
298   PublicVirtualIP:
299     type: OS::Neutron::Port
300     properties:
301       name: public_virtual_ip
302       network: {get_param: PublicVirtualNetwork}
303       fixed_ips:
304         get_param: PublicVirtualFixedIPs
305   RabbitCookie:
306     type: OS::Heat::RandomString
307     properties:
308       length: 20
309       salt:
310         get_param: RabbitCookieSalt
311   NovaCompute0Deploy:
312     type: FileInclude
313     Path: nova-compute-instance.yaml
314     SubKey: resources.NovaCompute0Deploy
315     parameters:
316         NovaApiHost: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
317         KeystoneHost: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
318         NeutronHost: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
319         GlanceHost: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
320         RabbitHost: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
321         NovaDSN:
322           Fn::Join:
323             - ''
324             - - mysql://nova:unset@
325               - &compute_database_host {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
326               - /nova
327         CeilometerDSN:
328           Fn::Join:
329             - ''
330             - - mysql://ceilometer:unset@
331               - *compute_database_host
332               - /ceilometer
333         NeutronDSN:
334           Fn::Join:
335             - ''
336             - - mysql://neutron:unset@
337               - *compute_database_host
338               - /ovs_neutron
339         NeutronNetworkType: "gre"
340         NeutronEnableTunnelling: "True"
341         NeutronFlatNetworks:
342             get_param: NeutronFlatNetworks
343         NeutronNetworkVLANRanges: ""
344         NeutronPhysicalBridge:
345             get_param: HypervisorNeutronPhysicalBridge
346         NeutronPublicInterface:
347             get_param: HypervisorNeutronPublicInterface
348         NeutronBridgeMappings:
349             get_param: NeutronBridgeMappings
350   NovaCompute0AllNodes:
351     type: FileInclude
352     Path: nova-compute-instance.yaml
353     SubKey: resources.NovaCompute0AllNodesDeploy
354     parameters:
355         AllNodesConfig: {get_resource: allNodesConfig}
356   NovaCompute0Passthrough:
357     type: FileInclude
358     Path: nova-compute-instance.yaml
359     SubKey: resources.NovaCompute0Passthrough
360     parameters:
361         passthrough_config: {get_param: ExtraConfig}
362   NovaCompute0:
363     type: FileInclude
364     Path: nova-compute-instance.yaml
365     SubKey: resources.NovaCompute0
366   controllerConfig:
367     type: OS::Heat::StructuredConfig
368     properties:
369       group: os-apply-config
370       config:
371         admin-password:
372           get_param: AdminPassword
373         admin-token:
374           get_param: AdminToken
375         bootstack:
376           public_interface_ip:
377             get_param: NeutronPublicInterfaceIP
378         bootstrap_host:
379           bootstrap_nodeid:
380             Fn::Select:
381             - 0
382             - Fn::Select:
383               - 0
384               - Merge::Map:
385                   controller0:
386                   - Fn::Select:
387                     - name
388                     - get_attr:
389                       - controller0
390                       - show
391           nodeid: {get_input: bootstack_nodeid}
392         database:
393           host: &database_host
394             {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
395         cinder:
396           db:
397             Fn::Join:
398               - ''
399               - - mysql://cinder:unset@
400                 - *database_host
401                 - /cinder
402           volume_size_mb:
403             get_param: CinderLVMLoopDeviceSize
404           service-password:
405             get_param: CinderPassword
406           iscsi-helper:
407             get_param: CinderISCSIHelper
408         controller-address:
409           get_input: controller_host
410         corosync:
411           bindnetaddr: {get_input: controller_host}
412           mcastport: 5577
413           nodes:
414             Merge::Map:
415               controller0:
416                 ip: {get_attr: [controller0, networks, ctlplane, 0]}
417         pacemaker:
418           stonith_enabled : false
419           recheck_interval : 5
420           quorum_policy : ignore
421         db-password: unset
422         glance:
423           registry:
424             host: {get_input: controller_virtual_ip}
425           backend: swift
426           db:
427             Fn::Join:
428               - ''
429               - - mysql://glance:unset@
430                 - *database_host
431                 - /glance
432           host:
433             get_input: controller_virtual_ip
434           port:
435             get_param: GlancePort
436           protocol:
437             get_param: GlanceProtocol
438           service-password:
439             get_param: GlancePassword
440           swift-store-user: service:glance
441           swift-store-key:
442             get_param: GlancePassword
443           notifier-strategy:
444             get_param: GlanceNotifierStrategy
445           log-file:
446             get_param: GlanceLogFile
447         heat:
448           admin_password:
449             get_param: HeatPassword
450           admin_tenant_name: service
451           admin_user: heat
452           auth_encryption_key: unset___________
453           db:
454             Fn::Join:
455               - ''
456               - - mysql://heat:unset@
457                 - *database_host
458                 - /heat
459           stack_domain_admin_password: {get_param: HeatStackDomainAdminPassword}
460           watch_server_url: {get_input: heat.watch_server_url}
461           metadata_server_url: {get_input: heat.metadata_server_url}
462           waitcondition_server_url: {get_input: heat.waitcondition_server_url}
463         horizon:
464           caches:
465             memcached:
466               nodes:
467                 Merge::Map:
468                   controller0:
469                     {get_attr: [controller0, show, name]}
470         keystone:
471           db:
472             Fn::Join:
473               - ''
474               - - mysql://keystone:unset@
475                 - *database_host
476                 - /keystone
477           host:
478             get_input: controller_virtual_ip
479           ca_certificate: {get_param: KeystoneCACertificate}
480           signing_key: {get_param: KeystoneSigningKey}
481           signing_certificate: {get_param: KeystoneSigningCertificate}
482         mysql:
483           innodb_buffer_pool_size: {get_param: MysqlInnodbBufferPoolSize}
484           local_bind: true
485           nodes:
486             Merge::Map:
487               controller0:
488                 ip: {get_attr: [controller0, networks, ctlplane, 0]}
489           cluster_name:
490             Fn::Join:
491               - '-'
492               - - 'tripleo'
493                 - {get_resource: MysqlClusterUniquePart}
494         neutron:
495           flat-networks: {get_param: NeutronFlatNetworks}
496           host: {get_input: controller_virtual_ip}
497           metadata_proxy_shared_secret: unset
498           ovs:
499             enable_tunneling: 'True'
500             local_ip:
501               get_input: controller_host
502             bridge_mappings: {get_param: NeutronBridgeMappings}
503             public_interface:
504               get_param: NeutronPublicInterface
505             public_interface_raw_device:
506               get_param: NeutronPublicInterfaceRawDevice
507             public_interface_route:
508               get_param: NeutronPublicInterfaceDefaultRoute
509             physical_bridge: br-ex
510             tenant_network_type: gre
511           ovs_db:
512             Fn::Join:
513               - ''
514               - - mysql://neutron:unset@
515                 - *database_host
516                 - /ovs_neutron?charset=utf8
517           service-password:
518             get_param: NeutronPassword
519           dnsmasq-options:
520             get_param: NeutronDnsmasqOptions
521         ceilometer:
522           db:
523             Fn::Join:
524               - ''
525               - - mysql://ceilometer:unset@
526                 - *database_host
527                 - /ceilometer
528           metering_secret: {get_param: CeilometerMeteringSecret}
529           service-password:
530             get_param: CeilometerPassword
531         snmpd:
532           export_MIB: UCD-SNMP-MIB
533           readonly_user_name:
534             get_param: SnmpdReadonlyUserName
535           readonly_user_password:
536             get_param: SnmpdReadonlyUserPassword
537         nova:
538           compute_driver: libvirt.LibvirtDriver
539           db:
540             Fn::Join:
541               - ''
542               - - mysql://nova:unset@
543                 - *database_host
544                 - /nova
545           default_floating_pool:
546             ext-net
547           host: {get_input: controller_virtual_ip}
548           metadata-proxy: true
549           service-password:
550             get_param: NovaPassword
551         rabbit:
552           host: {get_input: controller_virtual_ip}
553           username:
554             get_param: RabbitUserName
555           password:
556             get_param: RabbitPassword
557           cookie:
558             get_attr:
559             - RabbitCookie
560             - value
561         ntp:
562           servers:
563               - {server: {get_param: NtpServer}, fudge: "stratum 0"}
564         virtual_interfaces:
565           instances:
566             - vrrp_instance_name: VI_CONTROL
567               virtual_router_id: 51
568               keepalive_interface:
569                 get_param: ControlVirtualInterface
570               priority: 101
571               virtual_ips:
572               - ip: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
573                 interface:
574                   get_param: ControlVirtualInterface
575             - vrrp_instance_name: VI_PUBLIC
576               virtual_router_id: 52
577               keepalive_interface:
578                 get_param: PublicVirtualInterface
579               priority: 101
580               virtual_ips:
581               - ip: {get_attr: [PublicVirtualIP, fixed_ips, 0, ip_address]}
582                 interface:
583                   get_param: PublicVirtualInterface
584           vrrp_sync_groups:
585             - name: VG1
586               members:
587                 - VI_CONTROL
588                 - VI_PUBLIC
589         keepalived:
590           keepalive_interface:
591             get_param: PublicVirtualInterface
592           priority: 101
593         virtual_ips:
594             -
595               ip: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
596               interface:
597                 get_param: ControlVirtualInterface
598             -
599               ip: {get_attr: [PublicVirtualIP, fixed_ips, 0, ip_address]}
600               interface:
601                 get_param: PublicVirtualInterface
602         haproxy:
603           nodes:
604             Merge::Map:
605               controller0:
606                 ip: {get_attr: [controller0, networks, ctlplane, 0]}
607                 name: {get_attr: [controller0, show, name]}
608           net_binds:
609             - ip: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
610           services:
611             - name: keystone_admin
612               port: 35357
613               net_binds: &public_binds
614                 - ip: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
615                 - ip: {get_attr: [PublicVirtualIP, fixed_ips, 0, ip_address]}
616             - name: keystone_public
617               port: 5000
618               net_binds: *public_binds
619             - name: horizon
620               port: 80
621               net_binds: *public_binds
622             - name: neutron
623               port: 9696
624               net_binds: *public_binds
625             - name: cinder
626               port: 8776
627               net_binds: *public_binds
628             - name: glance_api
629               port: 9292
630               net_binds: *public_binds
631             - name: glance_registry
632               port: 9191
633               net_binds: *public_binds
634             - name: heat_api
635               port: 8004
636               net_binds: *public_binds
637             - name: heat_cloudwatch
638               port: 8003
639               net_binds: *public_binds
640             - name: heat_cfn
641               port: 8000
642               net_binds: *public_binds
643             - name: mysql
644               port: 3306
645               extra_server_params:
646                 - backup
647             - name: nova_ec2
648               port: 8773
649             - name: nova_osapi
650               port: 8774
651               net_binds: *public_binds
652             - name: nova_metadata
653               port: 8775
654               net_binds: *public_binds
655             - name: ceilometer
656               port: 8777
657               net_binds: *public_binds
658             - name: swift_proxy_server
659               port: 8080
660               net_binds: *public_binds
661             - name: rabbitmq
662               port: 5672
663               options:
664                 - timeout client 0
665                 - timeout server 0
666   controllerPassthrough:
667     type: OS::Heat::StructuredConfig
668     properties:
669       group: os-apply-config
670       config: {get_input: passthrough_config}
671   controller0:
672     type: OS::Nova::Server
673     properties:
674       image:
675         get_param: controllerImage
676       image_update_policy:
677         get_param: ImageUpdatePolicy
678       flavor:
679         get_param: OvercloudControlFlavor
680       key_name:
681         get_param: KeyName
682       networks:
683         - network: ctlplane
684       user_data_format: SOFTWARE_CONFIG
685   controller0AllNodes:
686     depends_on: [controller0Deployment,controller0SSLDeployment,controller0Swift,controller0Passthrough]
687     type: OS::Heat::StructuredDeployment
688     properties:
689       config: {get_resource: allNodesConfig}
690       server: {get_resource: controller0}
691   controller0Deployment:
692     type: OS::Heat::StructuredDeployment
693     properties:
694       signal_transport: NO_SIGNAL
695       config: {get_resource: controllerConfig}
696       server: {get_resource: controller0}
697       input_values:
698         bootstack_nodeid: {get_attr: [controller0, show, name]}
699         controller_host: {get_attr: [controller0, networks, ctlplane, 0]}
700         controller_virtual_ip:
701           {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
702         heat.watch_server_url:
703           Fn::Join:
704             - ''
705             - - 'http://'
706               - {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
707               - ':8003'
708         heat.metadata_server_url:
709           Fn::Join:
710             - ''
711             - - 'http://'
712               - {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
713               - ':8000'
714         heat.waitcondition_server_url:
715           Fn::Join:
716             - ''
717             - - 'http://'
718               - {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
719               - ':8000/v1/waitcondition'
720   allNodesConfig:
721     type: OS::Heat::StructuredConfig
722     properties:
723       config:
724         completion-signal: {get_input: deploy_signal_id}
725         hosts:
726           Fn::Join:
727           - "\n"
728           - - Fn::Join:
729               - "\n"
730               - Merge::Map:
731                   NovaCompute0:
732                     Fn::Join:
733                     - ' '
734                     - - {get_attr: [NovaCompute0, networks, ctlplane, 0]}
735                       - {get_attr: [NovaCompute0, show, name]}
736                       - Fn::Join:
737                         - '.'
738                         - - {get_attr: [NovaCompute0, show, name]}
739                           - 'novalocal'
740             - Fn::Join:
741               - "\n"
742               - Merge::Map:
743                   controller0:
744                     Fn::Join:
745                     - ' '
746                     - - {get_attr: [controller0, networks, ctlplane, 0]}
747                       - {get_attr: [controller0, show, name]}
748                       - Fn::Join:
749                         - '.'
750                         - - {get_attr: [controller0, show, name]}
751                           - 'novalocal'
752                       - {get_param: CloudName}
753         rabbit:
754           nodes:
755             Fn::Join:
756               - ','
757               - Merge::Map:
758                   controller0:
759                     {get_attr: [controller0, show, name]}
760   controller0SSLDeployment:
761     type: OS::Heat::StructuredDeployment
762     properties:
763       config: {get_resource: SSLConfig}
764       server: {get_resource: controller0}
765       signal_transport: NO_SIGNAL
766       input_values:
767         controller_host: {get_attr: [controller0, networks, ctlplane, 0]}
768         ssl_certificate: {get_param: SSLCertificate}
769         ssl_key: {get_param: SSLKey}
770         ssl_ca_certificate: {get_param: SSLCACertificate}
771   controller0Passthrough:
772     type: OS::Heat::StructuredDeployment
773     properties:
774       config: {get_resource: controllerPassthrough}
775       server: {get_resource: controller0}
776       signal_transport: NO_SIGNAL
777       input_values:
778         passthrough_config: {get_param: ExtraConfig}
779 outputs:
780   KeystoneURL:
781     description: URL for the Overcloud Keystone service
782     value:
783       Fn::Join:
784       - ''
785       - - http://
786         - {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
787         - :5000/v2.0/