1 {%- set primary_role = [roles[0]] -%}
2 {%- for role in roles -%}
3 {%- if 'primary' in role.tags and 'controller' in role.tags -%}
4 {%- set _ = primary_role.pop() -%}
5 {%- set _ = primary_role.append(role) -%}
8 {%- set primary_role_name = primary_role[0].name -%}
9 # primary role is: {{primary_role_name}}
10 heat_template_version: pike
13 Deploy an OpenStack environment, consisting of several node types (roles),
14 Controller, Compute, BlockStorage, SwiftStorage and CephStorage. The Storage
15 roles enable independent scaling of the storage components, but the minimal
16 deployment is one Controller and one Compute node.
19 # TODO(shadower): we should probably use the parameter groups to put
23 # Common parameters (not specific to a role)
25 default: overcloud.localdomain
26 description: The DNS name of this cloud. E.g. ci-overcloud.tripleo.org
29 default: overcloud.internalapi.localdomain
31 The DNS name of this cloud's internal API endpoint. E.g.
32 'ci-overcloud.internalapi.tripleo.org'.
35 default: overcloud.storage.localdomain
37 The DNS name of this cloud's storage endpoint. E.g.
38 'ci-overcloud.storage.tripleo.org'.
40 CloudNameStorageManagement:
41 default: overcloud.storagemgmt.localdomain
43 The DNS name of this cloud's storage management endpoint. E.g.
44 'ci-overcloud.storagemgmt.tripleo.org'.
47 default: overcloud.ctlplane.localdomain
49 The DNS name of this cloud's storage management endpoint. E.g.
50 'ci-overcloud.management.tripleo.org'.
55 Control the IP allocation for the ControlVirtualIP port. E.g.
56 [{'ip_address':'1.2.3.4'}]
58 InternalApiVirtualFixedIPs:
61 Control the IP allocation for the InternalApiVirtualInterface port. E.g.
62 [{'ip_address':'1.2.3.4'}]
64 NeutronControlPlaneID:
67 description: Neutron ID or name for ctlplane network.
68 NeutronPublicInterface:
70 description: What interface to bridge onto br-ex for network nodes.
72 PublicVirtualFixedIPs:
75 Control the IP allocation for the PublicVirtualInterface port. E.g.
76 [{'ip_address':'1.2.3.4'}]
81 description: Salt for the rabbit cookie, change this to force the randomly generated rabbit cookie to change.
82 StorageVirtualFixedIPs:
85 Control the IP allocation for the StorageVirtualInterface port. E.g.
86 [{'ip_address':'1.2.3.4'}]
88 StorageMgmtVirtualFixedIPs:
91 Control the IP allocation for the StorageMgmgVirtualInterface port. E.g.
92 [{'ip_address':'1.2.3.4'}]
97 Control the IP allocation for the virtual IP used by Redis. E.g.
98 [{'ip_address':'1.2.3.4'}]
101 default: 'localdomain'
104 The DNS domain used for the hosts. This must match the
105 overcloud_domain_name configured on the undercloud.
109 Extra properties or metadata passed to Nova for the created nodes in
110 the overcloud. It's accessible via the Nova metadata API.
113 # Compute-specific params
114 # FIXME(shardy) handle these deprecated names as they don't match compute.yaml
115 HypervisorNeutronPhysicalBridge:
118 An OVS bridge to create on each hypervisor. This defaults to br-ex the
119 same as the control plane nodes, as we have a uniform configuration of
120 the openvswitch agent. Typically should not need to be changed.
122 HypervisorNeutronPublicInterface:
124 description: What interface to add to the HypervisorNeutronPhysicalBridge.
129 description: Maxiumum batch size for creating nodes
132 # Jinja loop for Role in role_data.yaml
133 {% for role in roles %}
134 # Parameters generated for {{role.name}} Role
135 {{role.name}}Services:
136 description: A list of service resources (configured in the Heat
137 resource_registry) which represent nested stacks
138 for each service that should get installed on the {{role.name}} role.
139 type: comma_delimited_list
142 description: Number of {{role.name}} nodes to deploy
144 default: {{role.CountDefault|default(0)}}
146 {{role.name}}HostnameFormat:
149 Format for {{role.name}} node hostnames
150 Note %index% is translated into the index of the node, e.g 0/1/2 etc
151 and %stackname% is replaced with the stack name e.g overcloud
152 {% if role.HostnameFormatDefault %}
153 default: "{{role.HostnameFormatDefault}}"
155 default: "%stackname%-{{role.name.lower()}}-%index%"
158 {{role.name}}RemovalPolicies:
162 List of resources to be removed from {{role.name}} ResourceGroup when
163 doing an update which requires removal of specific resources.
164 Example format ComputeRemovalPolicies: [{'resource_list': ['0']}]
166 {% if role.name != 'Compute' %}
167 {{role.name}}SchedulerHints:
169 NovaComputeSchedulerHints:
172 description: Optional scheduler hints to pass to nova
175 {{role.name}}Parameters:
177 description: Optional Role Specific parameters to be provided to service
181 # Identifiers to trigger tasks on nodes
186 Setting to a previously unused value during stack-update will trigger
187 package update on all nodes
192 Setting this to a unique value will re-run any deployment tasks which
193 perform configuration on a Heat stack-update.
198 Set to true to append per network Vips to /etc/hosts on each node.
200 DeploymentServerBlacklist:
202 type: comma_delimited_list
204 List of server hostnames to blacklist from any triggered deployments.
207 add_vips_to_etc_hosts: {equals : [{get_param: AddVipsToEtcHosts}, True]}
212 type: OS::Heat::Value
221 IP: {get_attr: [VipMap, net_ip_map, external]}
222 HOST: {get_param: CloudName}
226 IP: {get_attr: [VipMap, net_ip_map, ctlplane]}
227 HOST: {get_param: CloudNameCtlplane}
231 IP: {get_attr: [VipMap, net_ip_map, internal_api]}
232 HOST: {get_param: CloudNameInternal}
236 IP: {get_attr: [VipMap, net_ip_map, storage]}
237 HOST: {get_param: CloudNameStorage}
241 IP: {get_attr: [VipMap, net_ip_map, storage_mgmt]}
242 HOST: {get_param: CloudNameStorageManagement}
244 HeatAuthEncryptionKey:
245 type: OS::TripleO::RandomString
248 type: OS::TripleO::RandomString
253 type: OS::TripleO::RandomString
258 type: OS::Heat::Value
264 - {get_attr: [Networks, net_cidr_map]}
265 - ctlplane: {get_attr: [ControlVirtualIP, subnets, 0, cidr]}
267 ctlplane: {get_param: NeutronControlPlaneID}
269 disabled: {get_attr: [ControlVirtualIP, subnets, 0, cidr]}
272 type: OS::TripleO::ServiceNetMap
275 type: OS::TripleO::EndpointMap
278 external: {get_param: CloudName}
279 internal_api: {get_param: CloudNameInternal}
280 storage: {get_param: CloudNameStorage}
281 storage_mgmt: {get_param: CloudNameStorageManagement}
282 ctlplane: {get_param: CloudNameCtlplane}
283 NetIpMap: {get_attr: [VipMap, net_ip_map]}
284 ServiceNetMap: {get_attr: [ServiceNetMap, service_net_map]}
287 type: OS::Heat::Value
290 value: {get_attr: [EndpointMap, endpoint_map]}
293 type: OS::TripleO::Ssh::KnownHostsConfig
298 {% for role in roles %}
299 - {get_attr: [{{role.name}}, known_hosts_entry]}
302 # Jinja loop for Role in roles_data.yaml
303 {% for role in roles %}
304 # Resources generated for {{role.name}} Role
305 {{role.name}}ServiceChain:
306 type: OS::TripleO::Services
309 get_param: {{role.name}}Services
310 ServiceNetMap: {get_attr: [ServiceNetMap, service_net_map]}
312 net_cidr_map: {get_attr: [NetCidrMapValue, value]}
313 EndpointMap: {get_attr: [EndpointMap, endpoint_map]}
314 DefaultPasswords: {get_attr: [DefaultPasswords, passwords]}
315 RoleName: {{role.name}}
316 RoleParameters: {get_param: {{role.name}}Parameters}
318 # Lookup of role_data via heat outputs is slow, so workaround this by caching
319 # the value in an OS::Heat::Value resource
320 {{role.name}}ServiceChainRoleData:
321 type: OS::Heat::Value
324 value: {get_attr: [{{role.name}}ServiceChain, role_data]}
326 # Filter any null/None service_names which may be present due to mapping
327 # of services to OS::Heat::None
328 {{role.name}}ServiceNames:
329 type: OS::Heat::Value
330 depends_on: {{role.name}}ServiceChain
332 type: comma_delimited_list
335 expression: coalesce($.data, []).where($ != null)
336 data: {get_attr: [{{role.name}}ServiceChainRoleData, value, service_names]}
338 {{role.name}}HostsDeployment:
339 type: OS::Heat::StructuredDeployments
341 name: {{role.name}}HostsDeployment
342 config: {get_attr: [hostsConfig, config_id]}
343 servers: {get_attr: [{{role.name}}Servers, value]}
345 {{role.name}}SshKnownHostsDeployment:
346 type: OS::Heat::StructuredDeployments
348 name: {{role.name}}SshKnownHostsDeployment
349 config: {get_resource: SshKnownHostsConfig}
350 servers: {get_attr: [{{role.name}}Servers, value]}
352 {{role.name}}AllNodesDeployment:
353 type: OS::TripleO::AllNodesDeployment
355 {% for role_inner in roles %}
356 - {{role_inner.name}}HostsDeployment
359 name: {{role.name}}AllNodesDeployment
360 config: {get_attr: [allNodesConfig, config_id]}
361 servers: {get_attr: [{{role.name}}Servers, value]}
363 # Note we have to use yaql to look up the first hostname/ip in the
364 # list because heat path based attributes operate on the attribute
365 # inside the ResourceGroup, not the exposed list ref discussion in
366 # https://bugs.launchpad.net/heat/+bug/1640488
367 # The coalesce is needed because $.data is None during heat validation
370 expression: coalesce($.data, []).first(null)
371 data: {get_attr: [{{role.name}}, hostname]}
374 expression: coalesce($.data, []).first(null)
375 data: {get_attr: [{{role.name}}, ip_address]}
377 {{role.name}}AllNodesValidationDeployment:
378 type: OS::Heat::StructuredDeployments
379 depends_on: {{role.name}}AllNodesDeployment
381 name: {{role.name}}AllNodesValidationDeployment
382 config: {get_resource: AllNodesValidationConfig}
383 servers: {get_attr: [{{role.name}}Servers, value]}
385 {{role.name}}IpListMap:
386 type: OS::TripleO::Network::Ports::NetIpListMap
388 ControlPlaneIpList: {get_attr: [{{role.name}}, ip_address]}
389 ExternalIpList: {get_attr: [{{role.name}}, external_ip_address]}
390 InternalApiIpList: {get_attr: [{{role.name}}, internal_api_ip_address]}
391 StorageIpList: {get_attr: [{{role.name}}, storage_ip_address]}
392 StorageMgmtIpList: {get_attr: [{{role.name}}, storage_mgmt_ip_address]}
393 TenantIpList: {get_attr: [{{role.name}}, tenant_ip_address]}
394 ManagementIpList: {get_attr: [{{role.name}}, management_ip_address]}
395 EnabledServices: {get_attr: [{{role.name}}ServiceNames, value]}
396 ServiceNetMap: {get_attr: [ServiceNetMap, service_net_map_lower]}
397 ServiceHostnameList: {get_attr: [{{role.name}}, hostname]}
398 NetworkHostnameMap: {get_attr: [{{role.name}}NetworkHostnameMap, value]}
400 {{role.name}}NetworkHostnameMap:
401 type: OS::Heat::Value
405 # Note (shardy) this somewhat complex yaql may be replaced
406 # with a map_deep_merge function in ocata. It merges the
407 # list of maps, but appends to colliding lists so we can
408 # create a map of lists for all nodes for each network
410 expression: dict($.data.where($ != null).flatten().selectMany($.items()).groupBy($[0], $[1], [$[0], $[1].flatten()]))
412 - {get_attr: [{{role.name}}, hostname_map]}
415 type: OS::Heat::ResourceGroup
419 max_batch_size: {get_param: NodeCreateBatchSize}
421 count: {get_param: {{role.name}}Count}
422 removal_policies: {get_param: {{role.name}}RemovalPolicies}
424 type: OS::TripleO::{{role.name}}
426 CloudDomain: {get_param: CloudDomain}
427 ServiceNetMap: {get_attr: [ServiceNetMap, service_net_map]}
428 EndpointMap: {get_attr: [EndpointMap, endpoint_map]}
431 template: {get_param: {{role.name}}HostnameFormat}
433 '%stackname%': {get_param: 'OS::stack_name'}
435 {% if role.name != 'Compute' %}
436 {{role.name}}SchedulerHints: {get_param: {{role.name}}SchedulerHints}
438 NovaComputeSchedulerHints: {get_param: NovaComputeSchedulerHints}
440 ServiceConfigSettings:
442 - get_attr: [{{role.name}}ServiceChainRoleData, value, config_settings]
444 - get_attr: [{{r.name}}ServiceChain, role_data, global_config_settings]
446 # This next step combines two yaql passes:
447 # - The inner one does a deep merge on the service_config_settings for all roles
448 # - The outer one filters the map based on the services enabled for the role
449 # then merges the result into one map.
451 expression: let(root => $) -> $.data.map.items().where($[0] in coalesce($root.data.services, [])).select($[1]).reduce($1.mergeWith($2), {})
455 expression: $.data.where($ != null).reduce($1.mergeWith($2), {})
458 - get_attr: [{{r.name}}ServiceChain, role_data, service_config_settings]
460 services: {get_attr: [{{role.name}}ServiceNames, value]}
461 ServiceNames: {get_attr: [{{role.name}}ServiceNames, value]}
462 MonitoringSubscriptions: {get_attr: [{{role.name}}ServiceChainRoleData, value, monitoring_subscriptions]}
463 ServiceMetadataSettings: {get_attr: [{{role.name}}ServiceChainRoleData, value, service_metadata_settings]}
464 DeploymentServerBlacklistDict: {get_attr: [DeploymentServerBlacklistDict, value]}
465 RoleParameters: {get_param: {{role.name}}Parameters}
468 {% for role in roles %}
469 {{role.name}}Servers:
470 type: OS::Heat::Value
471 depends_on: {{role.name}}
476 expression: let(servers=>switch(isDict($.data.servers) => $.data.servers, true => {})) -> $servers.deleteAll($servers.keys().where($servers[$] = null))
478 servers: {get_attr: [{{role.name}}, attributes, nova_server_resource]}
481 # This is a different format to *Servers, as it creates a map of lists
482 # whereas *Servers creates a map of maps with keys of the nested resource names
484 type: OS::Heat::Value
488 {% for role in roles %}
489 {{role.name}}: {get_attr: [{{role.name}}, nova_server_resource]}
493 expression: coalesce($.data, []).first(null)
494 data: {get_attr: [{{primary_role_name}}, nova_server_resource]}
496 # This resource just creates a dict out of the DeploymentServerBlacklist,
497 # which is a list. The dict is used in the role templates to set a condition
498 # on whether to create the deployment resources. We can't use the list
499 # directly because there is no way to ask Heat if a list contains a specific
501 DeploymentServerBlacklistDict:
502 type: OS::Heat::Value
511 hostname: {get_param: DeploymentServerBlacklist}
514 type: OS::TripleO::Hosts::SoftwareConfig
520 - add_vips_to_etc_hosts
521 - {get_attr: [VipHosts, value]}
524 {% for role in roles %}
527 - {get_attr: [{{role.name}}, hosts_entry]}
531 type: OS::TripleO::AllNodes::SoftwareConfig
533 cloud_name_external: {get_param: CloudName}
534 cloud_name_internal_api: {get_param: CloudNameInternal}
535 cloud_name_storage: {get_param: CloudNameStorage}
536 cloud_name_storage_mgmt: {get_param: CloudNameStorageManagement}
537 cloud_name_ctlplane: {get_param: CloudNameCtlplane}
541 {% for role in roles %}
542 - {get_attr: [{{role.name}}ServiceNames, value]}
547 $.data.groups.flatten()
550 {% for role in roles %}
551 - {get_attr: [{{role.name}}ServiceChainRoleData, value, logging_groups]}
556 $.data.sources.flatten()
559 {% for role in roles %}
560 - {get_attr: [{{role.name}}ServiceChainRoleData, value, logging_sources]}
562 controller_ips: {get_attr: [{{primary_role_name}}, ip_address]}
563 controller_names: {get_attr: [{{primary_role_name}}, hostname]}
565 # Note (shardy) this somewhat complex yaql may be replaced
566 # with a map_deep_merge function in ocata. It merges the
567 # list of maps, but appends to colliding lists when a service
568 # is deployed on more than one role
570 expression: dict($.data.l.where($ != null).selectMany($.items()).groupBy($[0], $[1], [$[0], $[1].flatten()]))
573 {% for role in roles %}
574 - {get_attr: [{{role.name}}IpListMap, service_ips]}
578 expression: dict($.data.l.where($ != null).selectMany($.items()).groupBy($[0], $[1], [$[0], $[1].flatten()]))
581 {% for role in roles %}
582 - {get_attr: [{{role.name}}IpListMap, service_hostnames]}
584 short_service_node_names:
586 expression: dict($.data.l.where($ != null).selectMany($.items()).groupBy($[0], $[1], [$[0], $[1].flatten()]))
589 {% for role in roles %}
590 - {get_attr: [{{role.name}}IpListMap, short_service_hostnames]}
592 short_service_bootstrap_node:
594 expression: dict($.data.l.where($ != null).selectMany($.items()).groupBy($[0], $[1], [$[0], $[1].flatten().first()]))
597 {% for role in roles %}
598 - {get_attr: [{{role.name}}IpListMap, short_service_bootstrap_hostnames]}
600 NetVipMap: {get_attr: [VipMap, net_ip_map]}
601 RedisVirtualIP: {get_attr: [RedisVirtualIP, ip_address]}
602 ServiceNetMap: {get_attr: [ServiceNetMap, service_net_map_lower]}
603 DeployIdentifier: {get_param: DeployIdentifier}
604 UpdateIdentifier: {get_param: UpdateIdentifier}
607 type: OS::TripleO::RandomString
612 type: OS::TripleO::RandomString
615 salt: {get_param: RabbitCookieSalt}
618 type: OS::TripleO::DefaultPasswords
620 DefaultMysqlRootPassword: {get_attr: [MysqlRootPassword, value]}
621 DefaultRabbitCookie: {get_attr: [RabbitCookie, value]}
622 DefaultHeatAuthEncryptionKey: {get_attr: [HeatAuthEncryptionKey, value]}
623 DefaultPcsdPassword: {get_attr: [PcsdPassword, value]}
624 DefaultHorizonSecret: {get_attr: [HorizonSecret, value]}
626 # creates the network architecture
628 type: OS::TripleO::Network
631 type: OS::TripleO::Network::Ports::ControlPlaneVipPort
634 name: control_virtual_ip
635 network: {get_param: NeutronControlPlaneID}
636 fixed_ips: {get_param: ControlFixedIPs}
637 replacement_policy: AUTO
641 type: OS::TripleO::Network::Ports::RedisVipPort
643 ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
644 ControlPlaneNetwork: {get_param: NeutronControlPlaneID}
645 PortName: redis_virtual_ip
646 NetworkName: {get_attr: [ServiceNetMap, service_net_map, RedisNetwork]}
648 FixedIPs: {get_param: RedisVirtualFixedIPs}
650 # The public VIP is on the External net, falls back to ctlplane
653 type: OS::TripleO::Network::Ports::ExternalVipPort
655 ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
656 ControlPlaneNetwork: {get_param: NeutronControlPlaneID}
657 PortName: public_virtual_ip
658 FixedIPs: {get_param: PublicVirtualFixedIPs}
660 InternalApiVirtualIP:
662 type: OS::TripleO::Network::Ports::InternalApiVipPort
664 ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
665 PortName: internal_api_virtual_ip
666 FixedIPs: {get_param: InternalApiVirtualFixedIPs}
670 type: OS::TripleO::Network::Ports::StorageVipPort
672 ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
673 PortName: storage_virtual_ip
674 FixedIPs: {get_param: StorageVirtualFixedIPs}
676 StorageMgmtVirtualIP:
678 type: OS::TripleO::Network::Ports::StorageMgmtVipPort
680 ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
681 PortName: storage_management_virtual_ip
682 FixedIPs: {get_param: StorageMgmtVirtualFixedIPs}
685 type: OS::TripleO::Network::Ports::NetVipMap
687 ControlPlaneIp: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
688 ExternalIp: {get_attr: [PublicVirtualIP, ip_address]}
689 ExternalIpUri: {get_attr: [PublicVirtualIP, ip_address_uri]}
690 InternalApiIp: {get_attr: [InternalApiVirtualIP, ip_address]}
691 InternalApiIpUri: {get_attr: [InternalApiVirtualIP, ip_address_uri]}
692 StorageIp: {get_attr: [StorageVirtualIP, ip_address]}
693 StorageIpUri: {get_attr: [StorageVirtualIP, ip_address_uri]}
694 StorageMgmtIp: {get_attr: [StorageMgmtVirtualIP, ip_address]}
695 StorageMgmtIpUri: {get_attr: [StorageMgmtVirtualIP, ip_address_uri]}
696 # No tenant or management VIP required
697 # Because of nested get_attr functions in the KeystoneAdminVip output, we
698 # can't determine which attributes of VipMap are used until after
699 # ServiceNetMap's attribute values are available.
700 depends_on: ServiceNetMap
702 # All Nodes Validations
703 AllNodesValidationConfig:
704 type: OS::TripleO::AllNodes::Validation
710 expression: coalesce($.data, []).first(null)
711 data: {get_attr: [{{primary_role_name}}, external_ip_address]}
713 expression: coalesce($.data, []).first(null)
714 data: {get_attr: [{{primary_role_name}}, internal_api_ip_address]}
716 expression: coalesce($.data, []).first(null)
717 data: {get_attr: [{{primary_role_name}}, storage_ip_address]}
719 expression: coalesce($.data, []).first(null)
720 data: {get_attr: [{{primary_role_name}}, storage_mgmt_ip_address]}
722 expression: coalesce($.data, []).first(null)
723 data: {get_attr: [{{primary_role_name}}, tenant_ip_address]}
725 expression: coalesce($.data, []).first(null)
726 data: {get_attr: [{{primary_role_name}}, management_ip_address]}
729 type: OS::TripleO::Tasks::UpdateWorkflow
731 {% for role in roles %}
732 - {{role.name}}AllNodesDeployment
736 {% for role in roles %}
737 {{role.name}}: {get_attr: [{{role.name}}Servers, value]}
740 deploy_identifier: {get_param: DeployIdentifier}
741 update_identifier: {get_param: UpdateIdentifier}
743 # Optional ExtraConfig for all nodes - all roles are passed in here, but
744 # the nested template may configure each role differently (or not at all)
746 type: OS::TripleO::AllNodesExtraConfig
749 {% for role in roles %}
750 - {{role.name}}AllNodesValidationDeployment
754 {% for role in roles %}
755 {{role.name}}: {get_attr: [{{role.name}}Servers, value]}
758 # Post deployment steps for all roles
760 type: OS::TripleO::PostDeploySteps
762 - AllNodesExtraConfig
763 {% for role in roles %}
764 - {{role.name}}AllNodesDeployment
768 {% for role in roles %}
769 {{role.name}}: {get_attr: [{{role.name}}Servers, value]}
771 stack_name: {get_param: 'OS::stack_name'}
772 EndpointMap: {get_attr: [EndpointMap, endpoint_map]}
773 ctlplane_service_ips:
774 # Note (shardy) this somewhat complex yaql may be replaced
775 # with a map_deep_merge function in ocata. It merges the
776 # list of maps, but appends to colliding lists when a service
777 # is deployed on more than one role
779 expression: dict($.data.l.where($ != null).selectMany($.items()).groupBy($[0], $[1], [$[0], $[1].flatten()]))
782 {% for role in roles %}
783 - {get_attr: [{{role.name}}IpListMap, ctlplane_service_ips]}
786 {% for role in roles %}
787 {{role.name}}: {get_attr: [{{role.name}}ServiceChainRoleData, value]}
790 ServerOsCollectConfigData:
791 type: OS::Heat::Value
795 {% for role in roles %}
796 {{role.name}}: {get_attr: [{{role.name}}, attributes, os_collect_config]}
799 DeployedServerEnvironment:
800 type: OS::TripleO::DeployedServerEnvironment
803 {% for role in roles %}
804 {{role.name}}DeployedServerCount: {get_param: {{role.name}}Count}
808 - {get_attr: [VipMap, net_ip_map]}
809 - redis: {get_attr: [RedisVirtualIP, ip_address]}
810 DeployedServerPortMap:
813 {% for role in roles %}
814 - {get_attr: [{{role.name}}, deployed_server_port_map]}
816 DeployedServerDeploymentSwiftDataMap:
819 {% for role in roles %}
820 - {get_attr: [{{role.name}}, deployed_server_deployment_swift_data_map]}
827 - {get_attr: [ServerOsCollectConfigData, value, {{primary_role_name}}, '0', request, metadata_url]}
833 description: Asserts that the keystone endpoints have been provisioned.
836 description: URL for the Overcloud Keystone service
837 value: {get_attr: [EndpointMapData, value, KeystonePublic, uri]}
839 description: Keystone Admin VIP endpoint
840 # Note that these nested get_attr functions require a dependency
841 # relationship between VipMap and ServiceNetMap, since we can't determine
842 # which attributes of VipMap are used until after ServiceNetMap's attribute
843 # values are available. If this is ever reworked to not use nested
844 # get_attr, that dependency can be removed.
845 value: {get_attr: [VipMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, KeystoneAdminApiNetwork]}]}
848 Mapping of the resources with the needed info for their endpoints.
849 This includes the protocol used, the IP, port and also a full
850 representation of the URI.
851 value: {get_attr: [EndpointMapData, value]}
854 The content that should be appended to your /etc/hosts if you want to get
855 hostname-based access to the deployed nodes (useful for testing without
860 - - {get_attr: [hostsConfig, hosts_entries]}
861 - - {get_attr: [VipHosts, value]}
863 description: The services enabled on each role
865 {% for role in roles %}
866 {{role.name}}: {get_attr: [{{role.name}}ServiceNames, value]}
869 description: The configuration data associated with each role
871 {% for role in roles %}
872 {{role.name}}: {get_attr: [{{role.name}}ServiceChainRoleData, value]}
875 description: Mapping of each network to a list of IPs for each role
877 {% for role in roles %}
878 {{role.name}}: {get_attr: [{{role.name}}IpListMap, net_ip_map]}
881 description: Mapping of each network to a list of hostnames for each role
883 {% for role in roles %}
884 {{role.name}}: {get_attr: [{{role.name}}NetworkHostnameMap, value]}
886 ServerOsCollectConfigData:
887 description: The os-collect-config configuration associated with each server resource
888 value: {get_attr: [ServerOsCollectConfigData, value]}
890 description: Mapping of each network to VIP addresses. Also includes the Redis VIP.
893 - {get_attr: [VipMap, net_ip_map]}
894 - redis: {get_attr: [RedisVirtualIP, ip_address]}
896 description: Mapping of each role to a list of nova server IDs and the bootstrap ID
897 value: {get_attr: [ServerIdMap, value]}
898 DeployedServerEnvironment:
900 Environment data that can be used as input into the services stack when
902 value: {get_attr: [DeployedServerEnvironment, deployed_server_environment]}