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::TripleO::ServiceNetMap
261 type: OS::TripleO::EndpointMap
264 external: {get_param: CloudName}
265 internal_api: {get_param: CloudNameInternal}
266 storage: {get_param: CloudNameStorage}
267 storage_mgmt: {get_param: CloudNameStorageManagement}
268 ctlplane: {get_param: CloudNameCtlplane}
269 NetIpMap: {get_attr: [VipMap, net_ip_map]}
270 ServiceNetMap: {get_attr: [ServiceNetMap, service_net_map]}
273 type: OS::Heat::Value
276 value: {get_attr: [EndpointMap, endpoint_map]}
279 type: OS::TripleO::Ssh::KnownHostsConfig
284 {% for role in roles %}
285 - {get_attr: [{{role.name}}, known_hosts_entry]}
288 # Jinja loop for Role in roles_data.yaml
289 {% for role in roles %}
290 # Resources generated for {{role.name}} Role
291 {{role.name}}ServiceChain:
292 type: OS::TripleO::Services
295 get_param: {{role.name}}Services
296 ServiceNetMap: {get_attr: [ServiceNetMap, service_net_map]}
297 EndpointMap: {get_attr: [EndpointMap, endpoint_map]}
298 DefaultPasswords: {get_attr: [DefaultPasswords, passwords]}
299 RoleName: {{role.name}}
300 RoleParameters: {get_param: {{role.name}}Parameters}
302 # Lookup of role_data via heat outputs is slow, so workaround this by caching
303 # the value in an OS::Heat::Value resource
304 {{role.name}}ServiceChainRoleData:
305 type: OS::Heat::Value
308 value: {get_attr: [{{role.name}}ServiceChain, role_data]}
310 # Filter any null/None service_names which may be present due to mapping
311 # of services to OS::Heat::None
312 {{role.name}}ServiceNames:
313 type: OS::Heat::Value
314 depends_on: {{role.name}}ServiceChain
316 type: comma_delimited_list
319 expression: coalesce($.data, []).where($ != null)
320 data: {get_attr: [{{role.name}}ServiceChainRoleData, value, service_names]}
322 {{role.name}}HostsDeployment:
323 type: OS::Heat::StructuredDeployments
325 name: {{role.name}}HostsDeployment
326 config: {get_attr: [hostsConfig, config_id]}
327 servers: {get_attr: [{{role.name}}Servers, value]}
329 {{role.name}}SshKnownHostsDeployment:
330 type: OS::Heat::StructuredDeployments
332 name: {{role.name}}SshKnownHostsDeployment
333 config: {get_resource: SshKnownHostsConfig}
334 servers: {get_attr: [{{role.name}}Servers, value]}
336 {{role.name}}AllNodesDeployment:
337 type: OS::TripleO::AllNodesDeployment
339 {% for role_inner in roles %}
340 - {{role_inner.name}}HostsDeployment
343 name: {{role.name}}AllNodesDeployment
344 config: {get_attr: [allNodesConfig, config_id]}
345 servers: {get_attr: [{{role.name}}Servers, value]}
347 # Note we have to use yaql to look up the first hostname/ip in the
348 # list because heat path based attributes operate on the attribute
349 # inside the ResourceGroup, not the exposed list ref discussion in
350 # https://bugs.launchpad.net/heat/+bug/1640488
351 # The coalesce is needed because $.data is None during heat validation
354 expression: coalesce($.data, []).first(null)
355 data: {get_attr: [{{role.name}}, hostname]}
358 expression: coalesce($.data, []).first(null)
359 data: {get_attr: [{{role.name}}, ip_address]}
361 {{role.name}}AllNodesValidationDeployment:
362 type: OS::Heat::StructuredDeployments
363 depends_on: {{role.name}}AllNodesDeployment
365 name: {{role.name}}AllNodesValidationDeployment
366 config: {get_resource: AllNodesValidationConfig}
367 servers: {get_attr: [{{role.name}}Servers, value]}
369 {{role.name}}IpListMap:
370 type: OS::TripleO::Network::Ports::NetIpListMap
372 ControlPlaneIpList: {get_attr: [{{role.name}}, ip_address]}
373 ExternalIpList: {get_attr: [{{role.name}}, external_ip_address]}
374 InternalApiIpList: {get_attr: [{{role.name}}, internal_api_ip_address]}
375 StorageIpList: {get_attr: [{{role.name}}, storage_ip_address]}
376 StorageMgmtIpList: {get_attr: [{{role.name}}, storage_mgmt_ip_address]}
377 TenantIpList: {get_attr: [{{role.name}}, tenant_ip_address]}
378 ManagementIpList: {get_attr: [{{role.name}}, management_ip_address]}
379 EnabledServices: {get_attr: [{{role.name}}ServiceNames, value]}
380 ServiceNetMap: {get_attr: [ServiceNetMap, service_net_map_lower]}
381 ServiceHostnameList: {get_attr: [{{role.name}}, hostname]}
382 NetworkHostnameMap: {get_attr: [{{role.name}}NetworkHostnameMap, value]}
384 {{role.name}}NetworkHostnameMap:
385 type: OS::Heat::Value
389 # Note (shardy) this somewhat complex yaql may be replaced
390 # with a map_deep_merge function in ocata. It merges the
391 # list of maps, but appends to colliding lists so we can
392 # create a map of lists for all nodes for each network
394 expression: dict($.data.where($ != null).flatten().selectMany($.items()).groupBy($[0], $[1], [$[0], $[1].flatten()]))
396 - {get_attr: [{{role.name}}, hostname_map]}
399 type: OS::Heat::ResourceGroup
403 max_batch_size: {get_param: NodeCreateBatchSize}
405 count: {get_param: {{role.name}}Count}
406 removal_policies: {get_param: {{role.name}}RemovalPolicies}
408 type: OS::TripleO::{{role.name}}
410 CloudDomain: {get_param: CloudDomain}
411 ServiceNetMap: {get_attr: [ServiceNetMap, service_net_map]}
412 EndpointMap: {get_attr: [EndpointMap, endpoint_map]}
415 template: {get_param: {{role.name}}HostnameFormat}
417 '%stackname%': {get_param: 'OS::stack_name'}
419 {% if role.name != 'Compute' %}
420 {{role.name}}SchedulerHints: {get_param: {{role.name}}SchedulerHints}
422 NovaComputeSchedulerHints: {get_param: NovaComputeSchedulerHints}
424 ServiceConfigSettings:
426 - get_attr: [{{role.name}}ServiceChainRoleData, value, config_settings]
428 - get_attr: [{{r.name}}ServiceChain, role_data, global_config_settings]
430 # This next step combines two yaql passes:
431 # - The inner one does a deep merge on the service_config_settings for all roles
432 # - The outer one filters the map based on the services enabled for the role
433 # then merges the result into one map.
435 expression: let(root => $) -> $.data.map.items().where($[0] in coalesce($root.data.services, [])).select($[1]).reduce($1.mergeWith($2), {})
439 expression: $.data.where($ != null).reduce($1.mergeWith($2), {})
442 - get_attr: [{{r.name}}ServiceChain, role_data, service_config_settings]
444 services: {get_attr: [{{role.name}}ServiceNames, value]}
445 ServiceNames: {get_attr: [{{role.name}}ServiceNames, value]}
446 MonitoringSubscriptions: {get_attr: [{{role.name}}ServiceChainRoleData, value, monitoring_subscriptions]}
447 ServiceMetadataSettings: {get_attr: [{{role.name}}ServiceChainRoleData, value, service_metadata_settings]}
448 DeploymentServerBlacklistDict: {get_attr: [DeploymentServerBlacklistDict, value]}
449 RoleParameters: {get_param: {{role.name}}Parameters}
452 {% for role in roles %}
453 {{role.name}}Servers:
454 type: OS::Heat::Value
455 depends_on: {{role.name}}
460 expression: let(servers=>switch(isDict($.data.servers) => $.data.servers, true => {})) -> $servers.deleteAll($servers.keys().where($servers[$] = null))
462 servers: {get_attr: [{{role.name}}, attributes, nova_server_resource]}
465 # This is a different format to *Servers, as it creates a map of lists
466 # whereas *Servers creates a map of maps with keys of the nested resource names
468 type: OS::Heat::Value
472 {% for role in roles %}
473 {{role.name}}: {get_attr: [{{role.name}}, nova_server_resource]}
477 expression: coalesce($.data, []).first(null)
478 data: {get_attr: [{{primary_role_name}}, nova_server_resource]}
480 # This resource just creates a dict out of the DeploymentServerBlacklist,
481 # which is a list. The dict is used in the role templates to set a condition
482 # on whether to create the deployment resources. We can't use the list
483 # directly because there is no way to ask Heat if a list contains a specific
485 DeploymentServerBlacklistDict:
486 type: OS::Heat::Value
495 hostname: {get_param: DeploymentServerBlacklist}
498 type: OS::TripleO::Hosts::SoftwareConfig
504 - add_vips_to_etc_hosts
505 - {get_attr: [VipHosts, value]}
508 {% for role in roles %}
511 - {get_attr: [{{role.name}}, hosts_entry]}
515 type: OS::TripleO::AllNodes::SoftwareConfig
517 cloud_name_external: {get_param: CloudName}
518 cloud_name_internal_api: {get_param: CloudNameInternal}
519 cloud_name_storage: {get_param: CloudNameStorage}
520 cloud_name_storage_mgmt: {get_param: CloudNameStorageManagement}
521 cloud_name_ctlplane: {get_param: CloudNameCtlplane}
525 {% for role in roles %}
526 - {get_attr: [{{role.name}}ServiceNames, value]}
531 $.data.groups.flatten()
534 {% for role in roles %}
535 - {get_attr: [{{role.name}}ServiceChainRoleData, value, logging_groups]}
540 $.data.sources.flatten()
543 {% for role in roles %}
544 - {get_attr: [{{role.name}}ServiceChainRoleData, value, logging_sources]}
546 controller_ips: {get_attr: [{{primary_role_name}}, ip_address]}
547 controller_names: {get_attr: [{{primary_role_name}}, hostname]}
549 # Note (shardy) this somewhat complex yaql may be replaced
550 # with a map_deep_merge function in ocata. It merges the
551 # list of maps, but appends to colliding lists when a service
552 # is deployed on more than one role
554 expression: dict($.data.l.where($ != null).selectMany($.items()).groupBy($[0], $[1], [$[0], $[1].flatten()]))
557 {% for role in roles %}
558 - {get_attr: [{{role.name}}IpListMap, service_ips]}
562 expression: dict($.data.l.where($ != null).selectMany($.items()).groupBy($[0], $[1], [$[0], $[1].flatten()]))
565 {% for role in roles %}
566 - {get_attr: [{{role.name}}IpListMap, service_hostnames]}
568 short_service_node_names:
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, short_service_hostnames]}
576 short_service_bootstrap_node:
578 expression: dict($.data.l.where($ != null).selectMany($.items()).groupBy($[0], $[1], [$[0], $[1].flatten().first()]))
581 {% for role in roles %}
582 - {get_attr: [{{role.name}}IpListMap, short_service_bootstrap_hostnames]}
584 # FIXME(shardy): These require further work to move into service_ips
585 memcache_node_ips: {get_attr: [{{primary_role_name}}IpListMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, MemcachedNetwork]}]}
586 NetVipMap: {get_attr: [VipMap, net_ip_map]}
587 RedisVirtualIP: {get_attr: [RedisVirtualIP, ip_address]}
588 ServiceNetMap: {get_attr: [ServiceNetMap, service_net_map_lower]}
589 DeployIdentifier: {get_param: DeployIdentifier}
590 UpdateIdentifier: {get_param: UpdateIdentifier}
593 type: OS::TripleO::RandomString
598 type: OS::TripleO::RandomString
601 salt: {get_param: RabbitCookieSalt}
604 type: OS::TripleO::DefaultPasswords
606 DefaultMysqlRootPassword: {get_attr: [MysqlRootPassword, value]}
607 DefaultRabbitCookie: {get_attr: [RabbitCookie, value]}
608 DefaultHeatAuthEncryptionKey: {get_attr: [HeatAuthEncryptionKey, value]}
609 DefaultPcsdPassword: {get_attr: [PcsdPassword, value]}
610 DefaultHorizonSecret: {get_attr: [HorizonSecret, value]}
612 # creates the network architecture
614 type: OS::TripleO::Network
617 type: OS::TripleO::Network::Ports::ControlPlaneVipPort
620 name: control_virtual_ip
621 network: {get_param: NeutronControlPlaneID}
622 fixed_ips: {get_param: ControlFixedIPs}
623 replacement_policy: AUTO
627 type: OS::TripleO::Network::Ports::RedisVipPort
629 ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
630 ControlPlaneNetwork: {get_param: NeutronControlPlaneID}
631 PortName: redis_virtual_ip
632 NetworkName: {get_attr: [ServiceNetMap, service_net_map, RedisNetwork]}
634 FixedIPs: {get_param: RedisVirtualFixedIPs}
636 # The public VIP is on the External net, falls back to ctlplane
639 type: OS::TripleO::Network::Ports::ExternalVipPort
641 ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
642 ControlPlaneNetwork: {get_param: NeutronControlPlaneID}
643 PortName: public_virtual_ip
644 FixedIPs: {get_param: PublicVirtualFixedIPs}
646 InternalApiVirtualIP:
648 type: OS::TripleO::Network::Ports::InternalApiVipPort
650 ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
651 PortName: internal_api_virtual_ip
652 FixedIPs: {get_param: InternalApiVirtualFixedIPs}
656 type: OS::TripleO::Network::Ports::StorageVipPort
658 ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
659 PortName: storage_virtual_ip
660 FixedIPs: {get_param: StorageVirtualFixedIPs}
662 StorageMgmtVirtualIP:
664 type: OS::TripleO::Network::Ports::StorageMgmtVipPort
666 ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
667 PortName: storage_management_virtual_ip
668 FixedIPs: {get_param: StorageMgmtVirtualFixedIPs}
671 type: OS::TripleO::Network::Ports::NetVipMap
673 ControlPlaneIp: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
674 ExternalIp: {get_attr: [PublicVirtualIP, ip_address]}
675 ExternalIpUri: {get_attr: [PublicVirtualIP, ip_address_uri]}
676 InternalApiIp: {get_attr: [InternalApiVirtualIP, ip_address]}
677 InternalApiIpUri: {get_attr: [InternalApiVirtualIP, ip_address_uri]}
678 StorageIp: {get_attr: [StorageVirtualIP, ip_address]}
679 StorageIpUri: {get_attr: [StorageVirtualIP, ip_address_uri]}
680 StorageMgmtIp: {get_attr: [StorageMgmtVirtualIP, ip_address]}
681 StorageMgmtIpUri: {get_attr: [StorageMgmtVirtualIP, ip_address_uri]}
682 # No tenant or management VIP required
684 # All Nodes Validations
685 AllNodesValidationConfig:
686 type: OS::TripleO::AllNodes::Validation
692 expression: coalesce($.data, []).first(null)
693 data: {get_attr: [{{primary_role_name}}, external_ip_address]}
695 expression: coalesce($.data, []).first(null)
696 data: {get_attr: [{{primary_role_name}}, internal_api_ip_address]}
698 expression: coalesce($.data, []).first(null)
699 data: {get_attr: [{{primary_role_name}}, storage_ip_address]}
701 expression: coalesce($.data, []).first(null)
702 data: {get_attr: [{{primary_role_name}}, storage_mgmt_ip_address]}
704 expression: coalesce($.data, []).first(null)
705 data: {get_attr: [{{primary_role_name}}, tenant_ip_address]}
707 expression: coalesce($.data, []).first(null)
708 data: {get_attr: [{{primary_role_name}}, management_ip_address]}
711 type: OS::TripleO::Tasks::UpdateWorkflow
713 {% for role in roles %}
714 - {{role.name}}AllNodesDeployment
718 {% for role in roles %}
719 {{role.name}}: {get_attr: [{{role.name}}Servers, value]}
722 deploy_identifier: {get_param: DeployIdentifier}
723 update_identifier: {get_param: UpdateIdentifier}
725 # Optional ExtraConfig for all nodes - all roles are passed in here, but
726 # the nested template may configure each role differently (or not at all)
728 type: OS::TripleO::AllNodesExtraConfig
731 {% for role in roles %}
732 - {{role.name}}AllNodesValidationDeployment
736 {% for role in roles %}
737 {{role.name}}: {get_attr: [{{role.name}}Servers, value]}
740 # Post deployment steps for all roles
742 type: OS::TripleO::PostDeploySteps
744 - AllNodesExtraConfig
745 {% for role in roles %}
746 - {{role.name}}AllNodesDeployment
750 {% for role in roles %}
751 {{role.name}}: {get_attr: [{{role.name}}Servers, value]}
753 stack_name: {get_param: 'OS::stack_name'}
754 EndpointMap: {get_attr: [EndpointMap, endpoint_map]}
755 ctlplane_service_ips:
756 # Note (shardy) this somewhat complex yaql may be replaced
757 # with a map_deep_merge function in ocata. It merges the
758 # list of maps, but appends to colliding lists when a service
759 # is deployed on more than one role
761 expression: dict($.data.l.where($ != null).selectMany($.items()).groupBy($[0], $[1], [$[0], $[1].flatten()]))
764 {% for role in roles %}
765 - {get_attr: [{{role.name}}IpListMap, ctlplane_service_ips]}
768 {% for role in roles %}
769 {{role.name}}: {get_attr: [{{role.name}}ServiceChainRoleData, value]}
772 ServerOsCollectConfigData:
773 type: OS::Heat::Value
777 {% for role in roles %}
778 {{role.name}}: {get_attr: [{{role.name}}, attributes, os_collect_config]}
783 description: Asserts that the keystone endpoints have been provisioned.
786 description: URL for the Overcloud Keystone service
787 value: {get_attr: [EndpointMapData, value, KeystonePublic, uri]}
789 description: Keystone Admin VIP endpoint
790 value: {get_attr: [VipMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, KeystoneAdminApiNetwork]}]}
793 Mapping of the resources with the needed info for their endpoints.
794 This includes the protocol used, the IP, port and also a full
795 representation of the URI.
796 value: {get_attr: [EndpointMapData, value]}
799 The content that should be appended to your /etc/hosts if you want to get
800 hostname-based access to the deployed nodes (useful for testing without
805 - - {get_attr: [hostsConfig, hosts_entries]}
806 - - {get_attr: [VipHosts, value]}
808 description: The services enabled on each role
810 {% for role in roles %}
811 {{role.name}}: {get_attr: [{{role.name}}ServiceNames, value]}
814 description: The configuration data associated with each role
816 {% for role in roles %}
817 {{role.name}}: {get_attr: [{{role.name}}ServiceChainRoleData, value]}
820 description: Mapping of each network to a list of IPs for each role
822 {% for role in roles %}
823 {{role.name}}: {get_attr: [{{role.name}}IpListMap, net_ip_map]}
826 description: Mapping of each network to a list of hostnames for each role
828 {% for role in roles %}
829 {{role.name}}: {get_attr: [{{role.name}}NetworkHostnameMap, value]}
831 ServerOsCollectConfigData:
832 description: The os-collect-config configuration associated with each server resource
834 {% for role in roles %}
835 {{role.name}}: {get_attr: [{{role.name}}, attributes, os_collect_config]}
838 description: Mapping of each network to VIP addresses. Also includes the Redis VIP.
841 - {get_attr: [VipMap, net_ip_map]}
842 - redis: {get_attr: [RedisVirtualIP, ip_address]}
844 description: Mapping of each role to a list of nova server IDs and the bootstrap ID
845 value: {get_attr: [ServerIdMap, value]}