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 provisioning network endpoint. E.g.
50 'ci-overcloud.ctlplane.tripleo.org'.
55 Control the IP allocation for the ControlVirtualIP port. E.g.
56 [{'ip_address':'1.2.3.4'}]
61 Additional hiera configuration to inject into the cluster.
63 {%- for role in roles %}
64 {{role.name}}ExtraConfig:
67 Role specific additional hiera configuration to inject into the cluster.
70 controllerExtraConfig:
73 DEPRECATED use ControllerExtraConfig instead
75 NovaComputeExtraConfig:
78 DEPRECATED use ComputeExtraConfig instead
80 InternalApiVirtualFixedIPs:
83 Control the IP allocation for the InternalApiVirtualInterface port. E.g.
84 [{'ip_address':'1.2.3.4'}]
86 NeutronControlPlaneID:
89 description: Neutron ID or name for ctlplane network.
90 NeutronPublicInterface:
92 description: Which interface to add to the NeutronPhysicalBridge.
94 PublicVirtualFixedIPs:
97 Control the IP allocation for the PublicVirtualInterface port. E.g.
98 [{'ip_address':'1.2.3.4'}]
103 description: Salt for the rabbit cookie, change this to force the randomly generated rabbit cookie to change.
104 StorageVirtualFixedIPs:
107 Control the IP allocation for the StorageVirtualInterface port. E.g.
108 [{'ip_address':'1.2.3.4'}]
110 StorageMgmtVirtualFixedIPs:
113 Control the IP allocation for the StorageMgmgVirtualInterface port. E.g.
114 [{'ip_address':'1.2.3.4'}]
116 RedisVirtualFixedIPs:
119 Control the IP allocation for the virtual IP used by Redis. E.g.
120 [{'ip_address':'1.2.3.4'}]
123 default: 'localdomain'
126 The DNS domain used for the hosts. This must match the
127 overcloud_domain_name configured on the undercloud.
131 Extra properties or metadata passed to Nova for the created nodes in
132 the overcloud. It's accessible via the Nova metadata API.
135 # Compute-specific params
136 # FIXME(shardy) handle these deprecated names as they don't match compute.yaml
137 HypervisorNeutronPhysicalBridge:
140 An OVS bridge to create on each hypervisor. This defaults to br-ex the
141 same as the control plane nodes, as we have a uniform configuration of
142 the openvswitch agent. Typically should not need to be changed.
144 HypervisorNeutronPublicInterface:
146 description: What interface to add to the HypervisorNeutronPhysicalBridge.
151 description: Maxiumum batch size for creating nodes
154 # Jinja loop for Role in role_data.yaml
155 {% for role in roles %}
156 # Parameters generated for {{role.name}} Role
157 {{role.name}}Services:
158 description: A list of service resources (configured in the Heat
159 resource_registry) which represent nested stacks
160 for each service that should get installed on the {{role.name}} role.
161 type: comma_delimited_list
164 description: Number of {{role.name}} nodes to deploy
166 default: {{role.CountDefault|default(0)}}
168 {{role.name}}HostnameFormat:
171 Format for {{role.name}} node hostnames
172 Note %index% is translated into the index of the node, e.g 0/1/2 etc
173 and %stackname% is replaced with the stack name e.g overcloud
174 {% if role.HostnameFormatDefault %}
175 default: "{{role.HostnameFormatDefault}}"
177 default: "%stackname%-{{role.name.lower()}}-%index%"
179 {{role.name}}RemovalPolicies:
183 List of resources to be removed from {{role.name}} ResourceGroup when
184 doing an update which requires removal of specific resources.
185 Example format ComputeRemovalPolicies: [{'resource_list': ['0']}]
187 {% if role.name != 'Compute' %}
188 {{role.name}}SchedulerHints:
190 NovaComputeSchedulerHints:
193 description: Optional scheduler hints to pass to nova
196 {{role.name}}Parameters:
198 description: Optional Role Specific parameters to be provided to service
202 # Identifiers to trigger tasks on nodes
207 Setting to a previously unused value during stack-update will trigger
208 package update on all nodes
213 Setting this to a unique value will re-run any deployment tasks which
214 perform configuration on a Heat stack-update.
219 Set to true to append per network Vips to /etc/hosts on each node.
221 DeploymentServerBlacklist:
223 type: comma_delimited_list
225 List of server hostnames to blacklist from any triggered deployments.
229 description: Do not use deprecated params, they will be removed.
231 - controllerExtraConfig
232 - NovaComputeExtraConfig
235 add_vips_to_etc_hosts: {equals : [{get_param: AddVipsToEtcHosts}, True]}
240 type: OS::Heat::Value
249 IP: {get_attr: [VipMap, net_ip_map, external]}
250 HOST: {get_param: CloudName}
254 IP: {get_attr: [VipMap, net_ip_map, ctlplane]}
255 HOST: {get_param: CloudNameCtlplane}
259 IP: {get_attr: [VipMap, net_ip_map, internal_api]}
260 HOST: {get_param: CloudNameInternal}
264 IP: {get_attr: [VipMap, net_ip_map, storage]}
265 HOST: {get_param: CloudNameStorage}
269 IP: {get_attr: [VipMap, net_ip_map, storage_mgmt]}
270 HOST: {get_param: CloudNameStorageManagement}
272 HeatAuthEncryptionKey:
273 type: OS::TripleO::RandomString
276 type: OS::TripleO::RandomString
281 type: OS::TripleO::RandomString
286 type: OS::Heat::Value
292 - {get_attr: [Networks, net_cidr_map]}
293 - ctlplane: {get_attr: [ControlVirtualIP, subnets, 0, cidr]}
295 ctlplane: {get_param: NeutronControlPlaneID}
297 disabled: {get_attr: [ControlVirtualIP, subnets, 0, cidr]}
300 type: OS::TripleO::ServiceNetMap
303 type: OS::TripleO::EndpointMap
306 external: {get_param: CloudName}
307 internal_api: {get_param: CloudNameInternal}
308 storage: {get_param: CloudNameStorage}
309 storage_mgmt: {get_param: CloudNameStorageManagement}
310 ctlplane: {get_param: CloudNameCtlplane}
311 NetIpMap: {get_attr: [VipMap, net_ip_map]}
312 ServiceNetMap: {get_attr: [ServiceNetMap, service_net_map]}
315 type: OS::Heat::Value
318 value: {get_attr: [EndpointMap, endpoint_map]}
321 type: OS::TripleO::Ssh::KnownHostsConfig
326 {% for role in roles %}
327 - {get_attr: [{{role.name}}, known_hosts_entry]}
330 # Jinja loop for Role in roles_data.yaml
331 {% for role in roles %}
332 # Resources generated for {{role.name}} Role
333 {{role.name}}ServiceChain:
334 type: OS::TripleO::Services
337 get_param: {{role.name}}Services
338 ServiceNetMap: {get_attr: [ServiceNetMap, service_net_map]}
340 net_cidr_map: {get_attr: [NetCidrMapValue, value]}
341 EndpointMap: {get_attr: [EndpointMap, endpoint_map]}
342 DefaultPasswords: {get_attr: [DefaultPasswords, passwords]}
343 RoleName: {{role.name}}
344 RoleParameters: {get_param: {{role.name}}Parameters}
346 # Lookup of role_data via heat outputs is slow, so workaround this by caching
347 # the value in an OS::Heat::Value resource
348 {{role.name}}ServiceChainRoleData:
349 type: OS::Heat::Value
352 value: {get_attr: [{{role.name}}ServiceChain, role_data]}
354 {{role.name}}ServiceConfigSettings:
355 type: OS::Heat::Value
360 - get_attr: [{{role.name}}ServiceChainRoleData, value, config_settings]
362 - get_attr: [{{r.name}}ServiceChainRoleData, value, global_config_settings]
364 # This next step combines two yaql passes:
365 # - The inner one does a deep merge on the service_config_settings for all roles
366 # - The outer one filters the map based on the services enabled for the role
367 # then merges the result into one map.
369 expression: let(root => $) -> $.data.map.items().where($[0] in coalesce($root.data.services, [])).select($[1]).reduce($1.mergeWith($2), {})
373 expression: $.data.where($ != null).reduce($1.mergeWith($2), {})
376 - get_attr: [{{r.name}}ServiceChainRoleData, value, service_config_settings]
378 services: {get_attr: [{{role.name}}ServiceNames, value]}
380 {{role.name}}MergedConfigSettings:
381 type: OS::Heat::Value
386 global_config_settings: {}
387 service_config_settings: {}
388 merged_config_settings:
390 - get_attr: [{{role.name}}ServiceConfigSettings, value]
391 - get_param: ExtraConfig
392 {%- if role.name == 'Controller' %}
394 - get_param: controllerExtraConfig
395 - get_param: {{role.name}}ExtraConfig
396 {%- elif role.name == 'Compute' %}
398 - get_param: NovaComputeExtraConfig
399 - get_param: {{role.name}}ExtraConfig
401 - get_param: {{role.name}}ExtraConfig
404 # Filter any null/None service_names which may be present due to mapping
405 # of services to OS::Heat::None
406 {{role.name}}ServiceNames:
407 type: OS::Heat::Value
408 depends_on: {{role.name}}ServiceChain
410 type: comma_delimited_list
413 expression: coalesce($.data, []).where($ != null)
414 data: {get_attr: [{{role.name}}ServiceChainRoleData, value, service_names]}
416 {{role.name}}HostsDeployment:
417 type: OS::Heat::StructuredDeployments
419 name: {{role.name}}HostsDeployment
420 config: {get_attr: [hostsConfig, config_id]}
421 servers: {get_attr: [{{role.name}}Servers, value]}
423 {{role.name}}SshKnownHostsDeployment:
424 type: OS::Heat::StructuredDeployments
426 name: {{role.name}}SshKnownHostsDeployment
427 config: {get_resource: SshKnownHostsConfig}
428 servers: {get_attr: [{{role.name}}Servers, value]}
430 {{role.name}}AllNodesDeployment:
431 type: OS::TripleO::AllNodesDeployment
433 {% for role_inner in roles %}
434 - {{role_inner.name}}HostsDeployment
437 name: {{role.name}}AllNodesDeployment
438 config: {get_attr: [allNodesConfig, config_id]}
439 servers: {get_attr: [{{role.name}}Servers, value]}
441 # Note we have to use yaql to look up the first hostname/ip in the
442 # list because heat path based attributes operate on the attribute
443 # inside the ResourceGroup, not the exposed list ref discussion in
444 # https://bugs.launchpad.net/heat/+bug/1640488
445 # The coalesce is needed because $.data is None during heat validation
448 expression: coalesce($.data, []).first(null)
449 data: {get_attr: [{{role.name}}, hostname]}
452 expression: coalesce($.data, []).first(null)
453 data: {get_attr: [{{role.name}}, ip_address]}
455 {{role.name}}AllNodesValidationDeployment:
456 type: OS::Heat::StructuredDeployments
457 depends_on: {{role.name}}AllNodesDeployment
459 name: {{role.name}}AllNodesValidationDeployment
460 config: {get_resource: AllNodesValidationConfig}
461 servers: {get_attr: [{{role.name}}Servers, value]}
463 {{role.name}}IpListMap:
464 type: OS::TripleO::Network::Ports::NetIpListMap
466 ControlPlaneIpList: {get_attr: [{{role.name}}, ip_address]}
467 ExternalIpList: {get_attr: [{{role.name}}, external_ip_address]}
468 InternalApiIpList: {get_attr: [{{role.name}}, internal_api_ip_address]}
469 StorageIpList: {get_attr: [{{role.name}}, storage_ip_address]}
470 StorageMgmtIpList: {get_attr: [{{role.name}}, storage_mgmt_ip_address]}
471 TenantIpList: {get_attr: [{{role.name}}, tenant_ip_address]}
472 ManagementIpList: {get_attr: [{{role.name}}, management_ip_address]}
473 EnabledServices: {get_attr: [{{role.name}}ServiceNames, value]}
474 ServiceNetMap: {get_attr: [ServiceNetMap, service_net_map_lower]}
475 ServiceHostnameList: {get_attr: [{{role.name}}, hostname]}
476 NetworkHostnameMap: {get_attr: [{{role.name}}NetworkHostnameMap, value]}
478 {{role.name}}NetworkHostnameMap:
479 type: OS::Heat::Value
483 # Note (shardy) this somewhat complex yaql may be replaced
484 # with a map_deep_merge function in ocata. It merges the
485 # list of maps, but appends to colliding lists so we can
486 # create a map of lists for all nodes for each network
488 expression: dict($.data.where($ != null).flatten().selectMany($.items()).groupBy($[0], $[1], [$[0], $[1].flatten()]))
490 - {get_attr: [{{role.name}}, hostname_map]}
493 type: OS::Heat::ResourceGroup
497 max_batch_size: {get_param: NodeCreateBatchSize}
499 count: {get_param: {{role.name}}Count}
500 removal_policies: {get_param: {{role.name}}RemovalPolicies}
502 type: OS::TripleO::{{role.name}}
504 CloudDomain: {get_param: CloudDomain}
505 ServiceNetMap: {get_attr: [ServiceNetMap, service_net_map]}
506 EndpointMap: {get_attr: [EndpointMap, endpoint_map]}
509 template: {get_param: {{role.name}}HostnameFormat}
511 '%stackname%': {get_param: 'OS::stack_name'}
513 {% if role.name != 'Compute' %}
514 {{role.name}}SchedulerHints: {get_param: {{role.name}}SchedulerHints}
516 NovaComputeSchedulerHints: {get_param: NovaComputeSchedulerHints}
518 ServiceConfigSettings: {get_attr: [{{role.name}}ServiceConfigSettings, value]}
519 ServiceNames: {get_attr: [{{role.name}}ServiceNames, value]}
520 MonitoringSubscriptions: {get_attr: [{{role.name}}ServiceChainRoleData, value, monitoring_subscriptions]}
521 ServiceMetadataSettings: {get_attr: [{{role.name}}ServiceChainRoleData, value, service_metadata_settings]}
522 DeploymentServerBlacklistDict: {get_attr: [DeploymentServerBlacklistDict, value]}
523 RoleParameters: {get_param: {{role.name}}Parameters}
526 {% for role in roles %}
527 {{role.name}}Servers:
528 type: OS::Heat::Value
529 depends_on: {{role.name}}
534 expression: let(servers=>switch(isDict($.data.servers) => $.data.servers, true => {})) -> $servers.deleteAll($servers.keys().where($servers[$] = null))
536 servers: {get_attr: [{{role.name}}, attributes, nova_server_resource]}
539 # This is a different format to *Servers, as it creates a map of lists
540 # whereas *Servers creates a map of maps with keys of the nested resource names
542 type: OS::Heat::Value
546 {% for role in roles %}
547 {{role.name}}: {get_attr: [{{role.name}}, nova_server_resource]}
551 expression: coalesce($.data, []).first(null)
552 data: {get_attr: [{{primary_role_name}}, nova_server_resource]}
554 # This resource just creates a dict out of the DeploymentServerBlacklist,
555 # which is a list. The dict is used in the role templates to set a condition
556 # on whether to create the deployment resources. We can't use the list
557 # directly because there is no way to ask Heat if a list contains a specific
559 DeploymentServerBlacklistDict:
560 type: OS::Heat::Value
569 hostname: {get_param: DeploymentServerBlacklist}
572 type: OS::TripleO::Hosts::SoftwareConfig
578 - add_vips_to_etc_hosts
579 - {get_attr: [VipHosts, value]}
582 {% for role in roles %}
585 - {get_attr: [{{role.name}}, hosts_entry]}
589 type: OS::TripleO::AllNodes::SoftwareConfig
591 cloud_name_external: {get_param: CloudName}
592 cloud_name_internal_api: {get_param: CloudNameInternal}
593 cloud_name_storage: {get_param: CloudNameStorage}
594 cloud_name_storage_mgmt: {get_param: CloudNameStorageManagement}
595 cloud_name_ctlplane: {get_param: CloudNameCtlplane}
599 {% for role in roles %}
600 - {get_attr: [{{role.name}}ServiceNames, value]}
605 $.data.groups.flatten()
608 {% for role in roles %}
609 - {get_attr: [{{role.name}}ServiceChainRoleData, value, logging_groups]}
614 $.data.sources.flatten()
617 {% for role in roles %}
618 - {get_attr: [{{role.name}}ServiceChainRoleData, value, logging_sources]}
620 controller_ips: {get_attr: [{{primary_role_name}}, ip_address]}
621 controller_names: {get_attr: [{{primary_role_name}}, hostname]}
623 # Note (shardy) this somewhat complex yaql may be replaced
624 # with a map_deep_merge function in ocata. It merges the
625 # list of maps, but appends to colliding lists when a service
626 # is deployed on more than one role
628 expression: dict($.data.l.where($ != null).selectMany($.items()).groupBy($[0], $[1], [$[0], $[1].flatten()]))
631 {% for role in roles %}
632 - {get_attr: [{{role.name}}IpListMap, service_ips]}
636 expression: dict($.data.l.where($ != null).selectMany($.items()).groupBy($[0], $[1], [$[0], $[1].flatten()]))
639 {% for role in roles %}
640 - {get_attr: [{{role.name}}IpListMap, service_hostnames]}
642 short_service_node_names:
644 expression: dict($.data.l.where($ != null).selectMany($.items()).groupBy($[0], $[1], [$[0], $[1].flatten()]))
647 {% for role in roles %}
648 - {get_attr: [{{role.name}}IpListMap, short_service_hostnames]}
650 short_service_bootstrap_node:
652 expression: dict($.data.l.where($ != null).selectMany($.items()).groupBy($[0], $[1], [$[0], $[1].flatten().first()]))
655 {% for role in roles %}
656 - {get_attr: [{{role.name}}IpListMap, short_service_bootstrap_hostnames]}
658 NetVipMap: {get_attr: [VipMap, net_ip_map]}
659 RedisVirtualIP: {get_attr: [RedisVirtualIP, ip_address]}
660 ServiceNetMap: {get_attr: [ServiceNetMap, service_net_map_lower]}
661 DeployIdentifier: {get_param: DeployIdentifier}
662 UpdateIdentifier: {get_param: UpdateIdentifier}
665 type: OS::TripleO::RandomString
670 type: OS::TripleO::RandomString
673 salt: {get_param: RabbitCookieSalt}
676 type: OS::TripleO::DefaultPasswords
678 DefaultMysqlRootPassword: {get_attr: [MysqlRootPassword, value]}
679 DefaultRabbitCookie: {get_attr: [RabbitCookie, value]}
680 DefaultHeatAuthEncryptionKey: {get_attr: [HeatAuthEncryptionKey, value]}
681 DefaultPcsdPassword: {get_attr: [PcsdPassword, value]}
682 DefaultHorizonSecret: {get_attr: [HorizonSecret, value]}
684 # creates the network architecture
686 type: OS::TripleO::Network
689 type: OS::TripleO::Network::Ports::ControlPlaneVipPort
692 name: control_virtual_ip
693 network: {get_param: NeutronControlPlaneID}
694 fixed_ips: {get_param: ControlFixedIPs}
695 replacement_policy: AUTO
699 type: OS::TripleO::Network::Ports::RedisVipPort
701 ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
702 ControlPlaneNetwork: {get_param: NeutronControlPlaneID}
703 PortName: redis_virtual_ip
704 NetworkName: {get_attr: [ServiceNetMap, service_net_map, RedisNetwork]}
706 FixedIPs: {get_param: RedisVirtualFixedIPs}
708 # The public VIP is on the External net, falls back to ctlplane
711 type: OS::TripleO::Network::Ports::ExternalVipPort
713 ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
714 ControlPlaneNetwork: {get_param: NeutronControlPlaneID}
715 PortName: public_virtual_ip
716 FixedIPs: {get_param: PublicVirtualFixedIPs}
718 InternalApiVirtualIP:
720 type: OS::TripleO::Network::Ports::InternalApiVipPort
722 ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
723 PortName: internal_api_virtual_ip
724 FixedIPs: {get_param: InternalApiVirtualFixedIPs}
728 type: OS::TripleO::Network::Ports::StorageVipPort
730 ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
731 PortName: storage_virtual_ip
732 FixedIPs: {get_param: StorageVirtualFixedIPs}
734 StorageMgmtVirtualIP:
736 type: OS::TripleO::Network::Ports::StorageMgmtVipPort
738 ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
739 PortName: storage_management_virtual_ip
740 FixedIPs: {get_param: StorageMgmtVirtualFixedIPs}
743 type: OS::TripleO::Network::Ports::NetVipMap
745 ControlPlaneIp: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
746 ExternalIp: {get_attr: [PublicVirtualIP, ip_address]}
747 ExternalIpUri: {get_attr: [PublicVirtualIP, ip_address_uri]}
748 InternalApiIp: {get_attr: [InternalApiVirtualIP, ip_address]}
749 InternalApiIpUri: {get_attr: [InternalApiVirtualIP, ip_address_uri]}
750 StorageIp: {get_attr: [StorageVirtualIP, ip_address]}
751 StorageIpUri: {get_attr: [StorageVirtualIP, ip_address_uri]}
752 StorageMgmtIp: {get_attr: [StorageMgmtVirtualIP, ip_address]}
753 StorageMgmtIpUri: {get_attr: [StorageMgmtVirtualIP, ip_address_uri]}
754 # No tenant or management VIP required
755 # Because of nested get_attr functions in the KeystoneAdminVip output, we
756 # can't determine which attributes of VipMap are used until after
757 # ServiceNetMap's attribute values are available.
758 depends_on: ServiceNetMap
760 # All Nodes Validations
761 AllNodesValidationConfig:
762 type: OS::TripleO::AllNodes::Validation
768 expression: coalesce($.data, []).first(null)
769 data: {get_attr: [{{primary_role_name}}, external_ip_address]}
771 expression: coalesce($.data, []).first(null)
772 data: {get_attr: [{{primary_role_name}}, internal_api_ip_address]}
774 expression: coalesce($.data, []).first(null)
775 data: {get_attr: [{{primary_role_name}}, storage_ip_address]}
777 expression: coalesce($.data, []).first(null)
778 data: {get_attr: [{{primary_role_name}}, storage_mgmt_ip_address]}
780 expression: coalesce($.data, []).first(null)
781 data: {get_attr: [{{primary_role_name}}, tenant_ip_address]}
783 expression: coalesce($.data, []).first(null)
784 data: {get_attr: [{{primary_role_name}}, management_ip_address]}
787 type: OS::TripleO::Tasks::UpdateWorkflow
789 {% for role in roles %}
790 - {{role.name}}AllNodesDeployment
794 {% for role in roles %}
795 {{role.name}}: {get_attr: [{{role.name}}Servers, value]}
798 deploy_identifier: {get_param: DeployIdentifier}
799 update_identifier: {get_param: UpdateIdentifier}
801 # Optional ExtraConfig for all nodes - all roles are passed in here, but
802 # the nested template may configure each role differently (or not at all)
804 type: OS::TripleO::AllNodesExtraConfig
807 {% for role in roles %}
808 - {{role.name}}AllNodesValidationDeployment
812 {% for role in roles %}
813 {{role.name}}: {get_attr: [{{role.name}}Servers, value]}
816 # Post deployment steps for all roles
818 type: OS::TripleO::PostDeploySteps
820 - AllNodesExtraConfig
821 {% for role in roles %}
822 - {{role.name}}AllNodesDeployment
826 {% for role in roles %}
827 {{role.name}}: {get_attr: [{{role.name}}Servers, value]}
829 stack_name: {get_param: 'OS::stack_name'}
830 EndpointMap: {get_attr: [EndpointMap, endpoint_map]}
831 ctlplane_service_ips:
832 # Note (shardy) this somewhat complex yaql may be replaced
833 # with a map_deep_merge function in ocata. It merges the
834 # list of maps, but appends to colliding lists when a service
835 # is deployed on more than one role
837 expression: dict($.data.l.where($ != null).selectMany($.items()).groupBy($[0], $[1], [$[0], $[1].flatten()]))
840 {% for role in roles %}
841 - {get_attr: [{{role.name}}IpListMap, ctlplane_service_ips]}
844 {% for role in roles %}
847 - {get_attr: [{{role.name}}ServiceChainRoleData, value]}
848 - {get_attr: [{{role.name}}MergedConfigSettings, value]}
851 ServerOsCollectConfigData:
852 type: OS::Heat::Value
856 {% for role in roles %}
857 {{role.name}}: {get_attr: [{{role.name}}, attributes, os_collect_config]}
860 DeployedServerEnvironment:
861 type: OS::TripleO::DeployedServerEnvironment
864 {% for role in roles %}
865 {{role.name}}DeployedServerCount: {get_param: {{role.name}}Count}
869 - {get_attr: [VipMap, net_ip_map]}
870 - redis: {get_attr: [RedisVirtualIP, ip_address]}
871 DeployedServerPortMap:
874 {% for role in roles %}
875 - {get_attr: [{{role.name}}, deployed_server_port_map]}
877 DeployedServerDeploymentSwiftDataMap:
880 {% for role in roles %}
881 - {get_attr: [{{role.name}}, deployed_server_deployment_swift_data_map]}
888 - {get_attr: [ServerOsCollectConfigData, value, {{primary_role_name}}, '0', request, metadata_url]}
894 description: Asserts that the keystone endpoints have been provisioned.
897 description: URL for the Overcloud Keystone service
898 value: {get_attr: [EndpointMapData, value, KeystonePublic, uri]}
900 description: Keystone Admin VIP endpoint
901 # Note that these nested get_attr functions require a dependency
902 # relationship between VipMap and ServiceNetMap, since we can't determine
903 # which attributes of VipMap are used until after ServiceNetMap's attribute
904 # values are available. If this is ever reworked to not use nested
905 # get_attr, that dependency can be removed.
906 value: {get_attr: [VipMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, KeystoneAdminApiNetwork]}]}
909 Mapping of the resources with the needed info for their endpoints.
910 This includes the protocol used, the IP, port and also a full
911 representation of the URI.
912 value: {get_attr: [EndpointMapData, value]}
915 The content that should be appended to your /etc/hosts if you want to get
916 hostname-based access to the deployed nodes (useful for testing without
921 - - {get_attr: [hostsConfig, hosts_entries]}
922 - - {get_attr: [VipHosts, value]}
924 description: The services enabled on each role
926 {% for role in roles %}
927 {{role.name}}: {get_attr: [{{role.name}}ServiceNames, value]}
930 description: The configuration data associated with each role
932 {% for role in roles %}
935 - {get_attr: [{{role.name}}ServiceChainRoleData, value]}
936 - {get_attr: [{{role.name}}MergedConfigSettings, value]}
939 description: Mapping of each network to a list of IPs for each role
941 {% for role in roles %}
942 {{role.name}}: {get_attr: [{{role.name}}IpListMap, net_ip_map]}
945 description: Mapping of each network to a list of hostnames for each role
947 {% for role in roles %}
948 {{role.name}}: {get_attr: [{{role.name}}NetworkHostnameMap, value]}
950 ServerOsCollectConfigData:
951 description: The os-collect-config configuration associated with each server resource
952 value: {get_attr: [ServerOsCollectConfigData, value]}
954 description: Mapping of each network to VIP addresses. Also includes the Redis VIP.
957 - {get_attr: [VipMap, net_ip_map]}
958 - redis: {get_attr: [RedisVirtualIP, ip_address]}
960 description: Mapping of each role to a list of nova server IDs and the bootstrap ID
961 value: {get_attr: [ServerIdMap, value]}
962 DeployedServerEnvironment:
964 Environment data that can be used as input into the services stack when
966 value: {get_attr: [DeployedServerEnvironment, deployed_server_environment]}