Merge "Update CloudDomain description"
[apex-tripleo-heat-templates.git] / puppet / controller-role.yaml
1 heat_template_version: pike
2
3 description: >
4   OpenStack controller node configured by Puppet.
5
6 parameters:
7   controllerExtraConfig:
8     default: {}
9     description: |
10       Deprecated. Use ControllerExtraConfig via parameter_defaults instead.
11     type: json
12   ControllerExtraConfig:
13     default: {}
14     description: |
15       Controller specific hiera configuration data to inject into the cluster.
16     type: json
17   ControllerIPs:
18     default: {}
19     description: >
20       A network mapped list of IPs to assign to Controllers in the following form:
21       {
22         "internal_api": ["a.b.c.d", "e.f.g.h"],
23         ...
24       }
25     type: json
26   Debug:
27     default: ''
28     description: Set to True to enable debugging on all services.
29     type: string
30   EnableLoadBalancer:
31     default: true
32     description: Whether to deploy a LoadBalancer on the Controller
33     type: boolean
34   ExtraConfig:
35     default: {}
36     description: |
37       Additional hieradata to inject into the cluster, note that
38       ControllerExtraConfig takes precedence over ExtraConfig.
39     type: json
40   OvercloudControlFlavor:
41     description: Flavor for control nodes to request when deploying.
42     default: baremetal
43     type: string
44     constraints:
45       - custom_constraint: nova.flavor
46   controllerImage:
47     type: string
48     default: overcloud-full
49     constraints:
50       - custom_constraint: glance.image
51   ImageUpdatePolicy:
52     default: 'REBUILD_PRESERVE_EPHEMERAL'
53     description: What policy to use when reconstructing instances. REBUILD for rebuilds, REBUILD_PRESERVE_EPHEMERAL to preserve /mnt.
54     type: string
55   KeyName:
56     default: default
57     description: Name of an existing Nova key pair to enable SSH access to the instances
58     type: string
59     constraints:
60       - custom_constraint: nova.keypair
61   NeutronPublicInterface:
62     default: nic1
63     description: What interface to bridge onto br-ex for network nodes.
64     type: string
65   ServiceNetMap:
66     default: {}
67     description: Mapping of service_name -> network name. Typically set
68                  via parameter_defaults in the resource registry.
69     type: json
70   EndpointMap:
71     default: {}
72     description: Mapping of service endpoint -> protocol. Typically set
73                  via parameter_defaults in the resource registry.
74     type: json
75   UpdateIdentifier:
76     default: ''
77     type: string
78     description: >
79       Setting to a previously unused value during stack-update will trigger
80       package update on all nodes
81   Hostname:
82     type: string
83     default: '' # Defaults to Heat created hostname
84   HostnameMap:
85     type: json
86     default: {}
87     description: Optional mapping to override hostnames
88   NetworkDeploymentActions:
89     type: comma_delimited_list
90     description: >
91       Heat action when to apply network configuration changes
92     default: ['CREATE']
93   NodeIndex:
94     type: number
95     default: 0
96   SoftwareConfigTransport:
97     default: POLL_SERVER_CFN
98     description: |
99       How the server should receive the metadata required for software configuration.
100     type: string
101     constraints:
102     - allowed_values: [POLL_SERVER_CFN, POLL_SERVER_HEAT, POLL_TEMP_URL, ZAQAR_MESSAGE]
103   CloudDomain:
104     default: 'localdomain'
105     type: string
106     description: >
107       The DNS domain used for the hosts. This must match the
108       overcloud_domain_name configured on the undercloud.
109   ControllerServerMetadata:
110     default: {}
111     description: >
112       Extra properties or metadata passed to Nova for the created nodes in
113       the overcloud. It's accessible via the Nova metadata API. This option is
114       role-specific and is merged with the values given to the ServerMetadata
115       parameter.
116     type: json
117   ServerMetadata:
118     default: {}
119     description: >
120       Extra properties or metadata passed to Nova for the created nodes in
121       the overcloud. It's accessible via the Nova metadata API. This applies to
122       all roles and is merged with a role-specific metadata parameter.
123     type: json
124   ControllerSchedulerHints:
125     type: json
126     description: Optional scheduler hints to pass to nova
127     default: {}
128   ServiceConfigSettings:
129     type: json
130     default: {}
131   ServiceNames:
132     type: comma_delimited_list
133     default: []
134   MonitoringSubscriptions:
135     type: comma_delimited_list
136     default: []
137   ServiceMetadataSettings:
138     type: json
139     default: {}
140   ConfigCommand:
141     type: string
142     description: Command which will be run whenever configuration data changes
143     default: os-refresh-config --timeout 14400
144   ConfigCollectSplay:
145     type: number
146     default: 30
147     description: |
148       Maximum amount of time to possibly to delay configuation collection
149       polling. Defaults to 30 seconds. Set to 0 to disable it which will cause
150       the configuration collection to occur as soon as the collection process
151       starts.  This setting is used to prevent the configuration collection
152       processes from polling all at the exact same time.
153   UpgradeInitCommand:
154     type: string
155     description: |
156       Command or script snippet to run on all overcloud nodes to
157       initialize the upgrade process. E.g. a repository switch.
158     default: ''
159   UpgradeInitCommonCommand:
160     type: string
161     description: |
162       Common commands required by the upgrades process. This should not
163       normally be modified by the operator and is set and unset in the
164       major-upgrade-composable-steps.yaml and major-upgrade-converge.yaml
165       environment files.
166     default: ''
167   DeploymentServerBlacklistDict:
168     default: {}
169     type: json
170     description: >
171       Map of server hostnames to blacklist from any triggered
172       deployments. If the value is 1, the server will be blacklisted. This
173       parameter is generated from the parent template.
174   RoleParameters:
175     type: json
176     description: Role Specific Parameters
177     default: {}
178
179 parameter_groups:
180 - label: deprecated
181   description: Do not use deprecated params, they will be removed.
182   parameters:
183   - controllerExtraConfig
184
185 conditions:
186   server_not_blacklisted:
187     not:
188       equals:
189         - {get_param: [DeploymentServerBlacklistDict, {get_param: Hostname}]}
190         - 1
191
192
193 resources:
194
195   Controller:
196     type: OS::TripleO::ControllerServer
197     metadata:
198       os-collect-config:
199         command: {get_param: ConfigCommand}
200         splay: {get_param: ConfigCollectSplay}
201     properties:
202       image: {get_param: controllerImage}
203       image_update_policy: {get_param: ImageUpdatePolicy}
204       flavor: {get_param: OvercloudControlFlavor}
205       key_name: {get_param: KeyName}
206       networks:
207         - network: ctlplane
208       user_data_format: SOFTWARE_CONFIG
209       user_data: {get_resource: UserData}
210       name:
211         str_replace:
212             template: {get_param: Hostname}
213             params: {get_param: HostnameMap}
214       software_config_transport: {get_param: SoftwareConfigTransport}
215       metadata:
216         map_merge:
217           - {get_param: ServerMetadata}
218           - {get_param: ControllerServerMetadata}
219           - {get_param: ServiceMetadataSettings}
220       scheduler_hints: {get_param: ControllerSchedulerHints}
221
222   # Combine the NodeAdminUserData and NodeUserData mime archives
223   UserData:
224     type: OS::Heat::MultipartMime
225     properties:
226       parts:
227       - config: {get_resource: NodeAdminUserData}
228         type: multipart
229       - config: {get_resource: NodeUserData}
230         type: multipart
231       - config: {get_resource: RoleUserData}
232         type: multipart
233
234   # Creates the "heat-admin" user if configured via the environment
235   # Should return a OS::Heat::MultipartMime reference via OS::stack_id
236   NodeAdminUserData:
237     type: OS::TripleO::NodeAdminUserData
238
239   # For optional operator additional userdata
240   # Should return a OS::Heat::MultipartMime reference via OS::stack_id
241   NodeUserData:
242     type: OS::TripleO::NodeUserData
243
244   # For optional operator role-specific userdata
245   # Should return a OS::Heat::MultipartMime reference via OS::stack_id
246   RoleUserData:
247     type: OS::TripleO::Controller::NodeUserData
248
249   ExternalPort:
250     type: OS::TripleO::Controller::Ports::ExternalPort
251     properties:
252       IPPool: {get_param: ControllerIPs}
253       NodeIndex: {get_param: NodeIndex}
254       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
255
256   InternalApiPort:
257     type: OS::TripleO::Controller::Ports::InternalApiPort
258     properties:
259       IPPool: {get_param: ControllerIPs}
260       NodeIndex: {get_param: NodeIndex}
261       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
262
263   StoragePort:
264     type: OS::TripleO::Controller::Ports::StoragePort
265     properties:
266       IPPool: {get_param: ControllerIPs}
267       NodeIndex: {get_param: NodeIndex}
268       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
269
270   StorageMgmtPort:
271     type: OS::TripleO::Controller::Ports::StorageMgmtPort
272     properties:
273       IPPool: {get_param: ControllerIPs}
274       NodeIndex: {get_param: NodeIndex}
275       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
276
277   TenantPort:
278     type: OS::TripleO::Controller::Ports::TenantPort
279     properties:
280       IPPool: {get_param: ControllerIPs}
281       NodeIndex: {get_param: NodeIndex}
282       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
283
284   ManagementPort:
285     type: OS::TripleO::Controller::Ports::ManagementPort
286     properties:
287       IPPool: {get_param: ControllerIPs}
288       NodeIndex: {get_param: NodeIndex}
289       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
290
291   NetIpMap:
292     type: OS::TripleO::Network::Ports::NetIpMap
293     properties:
294       ControlPlaneIp: {get_attr: [Controller, networks, ctlplane, 0]}
295       ExternalIp: {get_attr: [ExternalPort, ip_address]}
296       ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
297       ExternalIpUri: {get_attr: [ExternalPort, ip_address_uri]}
298       InternalApiIp: {get_attr: [InternalApiPort, ip_address]}
299       InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
300       InternalApiIpUri: {get_attr: [InternalApiPort, ip_address_uri]}
301       StorageIp: {get_attr: [StoragePort, ip_address]}
302       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
303       StorageIpUri: {get_attr: [StoragePort, ip_address_uri]}
304       StorageMgmtIp: {get_attr: [StorageMgmtPort, ip_address]}
305       StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
306       StorageMgmtIpUri: {get_attr: [StorageMgmtPort, ip_address_uri]}
307       TenantIp: {get_attr: [TenantPort, ip_address]}
308       TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
309       TenantIpUri: {get_attr: [TenantPort, ip_address_uri]}
310       ManagementIp: {get_attr: [ManagementPort, ip_address]}
311       ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}
312       ManagementIpUri: {get_attr: [ManagementPort, ip_address_uri]}
313
314   NetHostMap:
315     type: OS::Heat::Value
316     properties:
317       type: json
318       value:
319         external:
320           fqdn:
321             list_join:
322             - '.'
323             - - {get_attr: [Controller, name]}
324               - external
325               - {get_param: CloudDomain}
326           short:
327             list_join:
328             - '.'
329             - - {get_attr: [Controller, name]}
330               - external
331         internal_api:
332           fqdn:
333             list_join:
334             - '.'
335             - - {get_attr: [Controller, name]}
336               - internalapi
337               - {get_param: CloudDomain}
338           short:
339             list_join:
340             - '.'
341             - - {get_attr: [Controller, name]}
342               - internalapi
343         storage:
344           fqdn:
345             list_join:
346             - '.'
347             - - {get_attr: [Controller, name]}
348               - storage
349               - {get_param: CloudDomain}
350           short:
351             list_join:
352             - '.'
353             - - {get_attr: [Controller, name]}
354               - storage
355         storage_mgmt:
356           fqdn:
357             list_join:
358             - '.'
359             - - {get_attr: [Controller, name]}
360               - storagemgmt
361               - {get_param: CloudDomain}
362           short:
363             list_join:
364             - '.'
365             - - {get_attr: [Controller, name]}
366               - storagemgmt
367         tenant:
368           fqdn:
369             list_join:
370             - '.'
371             - - {get_attr: [Controller, name]}
372               - tenant
373               - {get_param: CloudDomain}
374           short:
375             list_join:
376             - '.'
377             - - {get_attr: [Controller, name]}
378               - tenant
379         management:
380           fqdn:
381             list_join:
382             - '.'
383             - - {get_attr: [Controller, name]}
384               - management
385               - {get_param: CloudDomain}
386           short:
387             list_join:
388             - '.'
389             - - {get_attr: [Controller, name]}
390               - management
391         ctlplane:
392           fqdn:
393             list_join:
394             - '.'
395             - - {get_attr: [Controller, name]}
396               - ctlplane
397               - {get_param: CloudDomain}
398           short:
399             list_join:
400             - '.'
401             - - {get_attr: [Controller, name]}
402               - ctlplane
403
404   PreNetworkConfig:
405     type: OS::TripleO::Controller::PreNetworkConfig
406     properties:
407       server: {get_resource: Controller}
408       RoleParameters: {get_param: RoleParameters}
409
410   NetworkConfig:
411     type: OS::TripleO::Controller::Net::SoftwareConfig
412     properties:
413       ControlPlaneIp: {get_attr: [Controller, networks, ctlplane, 0]}
414       ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
415       InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
416       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
417       StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
418       TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
419       ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}
420
421   NetworkDeployment:
422     type: OS::TripleO::SoftwareDeployment
423     depends_on: PreNetworkConfig
424     properties:
425       name: NetworkDeployment
426       config: {get_resource: NetworkConfig}
427       server: {get_resource: Controller}
428       actions:
429         if:
430           - server_not_blacklisted
431           - {get_param: NetworkDeploymentActions}
432           - []
433       input_values:
434         bridge_name: br-ex
435         interface_name: {get_param: NeutronPublicInterface}
436
437   # Resource for site-specific injection of root certificate
438   NodeTLSCAData:
439     depends_on: NetworkDeployment
440     type: OS::TripleO::NodeTLSCAData
441     properties:
442       server: {get_resource: Controller}
443
444   # Resource for site-specific passing of private keys/certificates
445   NodeTLSData:
446     depends_on: NodeTLSCAData
447     type: OS::TripleO::NodeTLSData
448     properties:
449       server: {get_resource: Controller}
450       NodeIndex: {get_param: NodeIndex}
451
452   ControllerUpgradeInitConfig:
453     type: OS::Heat::SoftwareConfig
454     properties:
455       group: script
456       config:
457         list_join:
458         - ''
459         - - "#!/bin/bash\n\n"
460           - "if [[ -f /etc/resolv.conf.save ]] ; then rm /etc/resolv.conf.save; fi\n\n"
461           - get_param: UpgradeInitCommand
462           - get_param: UpgradeInitCommonCommand
463
464   # Note we may be able to make this conditional on UpgradeInitCommandNotEmpty
465   # but https://bugs.launchpad.net/heat/+bug/1649900 needs fixing first
466   ControllerUpgradeInitDeployment:
467     type: OS::Heat::SoftwareDeployment
468     depends_on: NetworkDeployment
469     properties:
470       name: ControllerUpgradeInitDeployment
471       actions:
472         if:
473           - server_not_blacklisted
474           - ['CREATE', 'UPDATE']
475           - []
476       server: {get_resource: Controller}
477       config: {get_resource: ControllerUpgradeInitConfig}
478
479   ControllerDeployment:
480     type: OS::TripleO::SoftwareDeployment
481     depends_on: ControllerUpgradeInitDeployment
482     properties:
483       name: ControllerDeployment
484       actions:
485         if:
486           - server_not_blacklisted
487           - ['CREATE', 'UPDATE']
488           - []
489       config: {get_resource: ControllerConfig}
490       server: {get_resource: Controller}
491       input_values:
492         bootstack_nodeid: {get_attr: [Controller, name]}
493         enable_load_balancer: {get_param: EnableLoadBalancer}
494         enable_package_upgrade: {get_attr: [UpdateDeployment, update_managed_packages]}
495
496   # Map heat metadata into hiera datafiles
497   ControllerConfig:
498     type: OS::Heat::StructuredConfig
499     properties:
500       group: hiera
501       config:
502         hierarchy:
503           - '"%{::uuid}"'
504           - heat_config_%{::deploy_config_name}
505           - config_step
506           - controller_extraconfig
507           - extraconfig
508           - service_configs
509           - service_names
510           - controller
511           - bootstrap_node # provided by BootstrapNodeConfig
512           - all_nodes # provided by allNodesConfig
513           - vip_data # provided by allNodesConfig
514           - '"%{::osfamily}"'
515           - neutron_bigswitch_data # Optionally provided by ControllerExtraConfigPre
516           - neutron_cisco_data # Optionally provided by ControllerExtraConfigPre
517           - cisco_n1kv_data # Optionally provided by ControllerExtraConfigPre
518           - midonet_data #Optionally provided by AllNodesExtraConfig
519           - cisco_aci_data # Optionally provided by ControllerExtraConfigPre
520         merge_behavior: deeper
521         datafiles:
522           service_names:
523             service_names: {get_param: ServiceNames}
524             sensu::subscriptions: {get_param: MonitoringSubscriptions}
525           service_configs:
526             map_replace:
527               - {get_param: ServiceConfigSettings}
528               - values: {get_attr: [NetIpMap, net_ip_map]}
529           controller_extraconfig:
530             map_merge:
531               - {get_param: controllerExtraConfig}
532               - {get_param: ControllerExtraConfig}
533           extraconfig: {get_param: ExtraConfig}
534           controller:
535             # data supplied directly to this deployment configuration, etc
536             bootstack_nodeid: {get_input: bootstack_nodeid}
537             # Pacemaker
538             enable_load_balancer: {get_input: enable_load_balancer}
539
540             # Misc
541             tripleo::haproxy::service_certificate: {get_attr: [NodeTLSData, deployed_ssl_certificate_path]}
542             tripleo::packages::enable_upgrade: {get_input: enable_package_upgrade}
543             fqdn_internal_api: {get_attr: [NetHostMap, value, internal_api, fqdn]}
544             fqdn_storage: {get_attr: [NetHostMap, value, storage, fqdn]}
545             fqdn_storage_mgmt: {get_attr: [NetHostMap, value, storage_mgmt, fqdn]}
546             fqdn_tenant: {get_attr: [NetHostMap, value, tenant, fqdn]}
547             fqdn_management: {get_attr: [NetHostMap, value, management, fqdn]}
548             fqdn_ctlplane: {get_attr: [NetHostMap, value, ctlplane, fqdn]}
549             fqdn_external: {get_attr: [NetHostMap, value, external, fqdn]}
550
551   # Hook for site-specific additional pre-deployment config, e.g extra hieradata
552   ControllerExtraConfigPre:
553     depends_on: ControllerDeployment
554     type: OS::TripleO::ControllerExtraConfigPre
555     properties:
556         server: {get_resource: Controller}
557
558   # Hook for site-specific additional pre-deployment config,
559   # applying to all nodes, e.g node registration/unregistration
560   NodeExtraConfig:
561     depends_on: [ControllerExtraConfigPre, NodeTLSData]
562     type: OS::TripleO::NodeExtraConfig
563     properties:
564         server: {get_resource: Controller}
565
566   UpdateConfig:
567     type: OS::TripleO::Tasks::PackageUpdate
568
569   UpdateDeployment:
570     type: OS::Heat::SoftwareDeployment
571     depends_on: NetworkDeployment
572     properties:
573       name: UpdateDeployment
574       actions:
575         if:
576           - server_not_blacklisted
577           - ['CREATE', 'UPDATE']
578           - []
579       config: {get_resource: UpdateConfig}
580       server: {get_resource: Controller}
581       input_values:
582         update_identifier:
583           get_param: UpdateIdentifier
584
585   SshHostPubKey:
586     type: OS::TripleO::Ssh::HostPubKey
587     depends_on: ControllerDeployment
588     properties:
589         server: {get_resource: Controller}
590
591 outputs:
592   ip_address:
593     description: IP address of the server in the ctlplane network
594     value: {get_attr: [Controller, networks, ctlplane, 0]}
595   external_ip_address:
596     description: IP address of the server in the external network
597     value: {get_attr: [ExternalPort, ip_address]}
598   internal_api_ip_address:
599     description: IP address of the server in the internal_api network
600     value: {get_attr: [InternalApiPort, ip_address]}
601   storage_ip_address:
602     description: IP address of the server in the storage network
603     value: {get_attr: [StoragePort, ip_address]}
604   storage_mgmt_ip_address:
605     description: IP address of the server in the storage_mgmt network
606     value: {get_attr: [StorageMgmtPort, ip_address]}
607   tenant_ip_address:
608     description: IP address of the server in the tenant network
609     value: {get_attr: [TenantPort, ip_address]}
610   management_ip_address:
611     description: IP address of the server in the management network
612     value: {get_attr: [ManagementPort, ip_address]}
613   hostname:
614     description: Hostname of the server
615     value: {get_attr: [Controller, name]}
616   hostname_map:
617     description: Mapping of network names to hostnames
618     value:
619       external: {get_attr: [NetHostMap, value, external, fqdn]}
620       internal_api: {get_attr: [NetHostMap, value, internal_api, fqdn]}
621       storage: {get_attr: [NetHostMap, value, storage, fqdn]}
622       storage_mgmt: {get_attr: [NetHostMap, value, storage_mgmt, fqdn]}
623       tenant: {get_attr: [NetHostMap, value, tenant, fqdn]}
624       management: {get_attr: [NetHostMap, value, management, fqdn]}
625       ctlplane: {get_attr: [NetHostMap, value, ctlplane, fqdn]}
626   hosts_entry:
627     description: >
628       Server's IP address and hostname in the /etc/hosts format
629     value:
630       str_replace:
631         template: |
632           PRIMARYIP PRIMARYHOST.DOMAIN PRIMARYHOST
633           EXTERNALIP EXTERNALHOST.DOMAIN EXTERNALHOST
634           INTERNAL_APIIP INTERNAL_APIHOST.DOMAIN INTERNAL_APIHOST
635           STORAGEIP STORAGEHOST.DOMAIN STORAGEHOST
636           STORAGE_MGMTIP STORAGE_MGMTHOST.DOMAIN STORAGE_MGMTHOST
637           TENANTIP TENANTHOST.DOMAIN TENANTHOST
638           MANAGEMENTIP MANAGEMENTHOST.DOMAIN MANAGEMENTHOST
639           CTLPLANEIP CTLPLANEHOST.DOMAIN CTLPLANEHOST
640         params:
641           PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, ControllerHostnameResolveNetwork]}]}
642           DOMAIN: {get_param: CloudDomain}
643           PRIMARYHOST: {get_attr: [Controller, name]}
644           EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
645           EXTERNALHOST: {get_attr: [NetHostMap, value, external, short]}
646           INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
647           INTERNAL_APIHOST: {get_attr: [NetHostMap, value, internal_api, short]}
648           STORAGEIP: {get_attr: [StoragePort, ip_address]}
649           STORAGEHOST: {get_attr: [NetHostMap, value, storage, short]}
650           STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
651           STORAGE_MGMTHOST: {get_attr: [NetHostMap, value, storage_mgmt, short]}
652           TENANTIP: {get_attr: [TenantPort, ip_address]}
653           TENANTHOST: {get_attr: [NetHostMap, value, tenant, short]}
654           MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
655           MANAGEMENTHOST: {get_attr: [NetHostMap, value, management, short]}
656           CTLPLANEIP: {get_attr: [Controller, networks, ctlplane, 0]}
657           CTLPLANEHOST: {get_attr: [NetHostMap, value, ctlplane, short]}
658   known_hosts_entry:
659     description: Entry for ssh known hosts
660     value:
661       str_replace:
662         template: "PRIMARYIP,PRIMARYHOST.DOMAIN,PRIMARYHOST,\
663 EXTERNALIP,EXTERNALHOST.DOMAIN,EXTERNALHOST,\
664 INTERNAL_APIIP,INTERNAL_APIHOST.DOMAIN,INTERNAL_APIHOST,\
665 STORAGEIP,STORAGEHOST.DOMAIN,STORAGEHOST,\
666 STORAGE_MGMTIP,STORAGE_MGMTHOST.DOMAIN,STORAGE_MGMTHOST,\
667 TENANTIP,TENANTHOST.DOMAIN,TENANTHOST,\
668 MANAGEMENTIP,MANAGEMENTHOST.DOMAIN,MANAGEMENTHOST,\
669 CTLPLANEIP,CTLPLANEHOST.DOMAIN,CTLPLANEHOST HOSTSSHPUBKEY"
670         params:
671           PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, ControllerHostnameResolveNetwork]}]}
672           DOMAIN: {get_param: CloudDomain}
673           PRIMARYHOST: {get_attr: [Controller, name]}
674           EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
675           EXTERNALHOST: {get_attr: [NetHostMap, value, external, short]}
676           INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
677           INTERNAL_APIHOST: {get_attr: [NetHostMap, value, internal_api, short]}
678           STORAGEIP: {get_attr: [StoragePort, ip_address]}
679           STORAGEHOST: {get_attr: [NetHostMap, value, storage, short]}
680           STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
681           STORAGE_MGMTHOST: {get_attr: [NetHostMap, value, storage_mgmt, short]}
682           TENANTIP: {get_attr: [TenantPort, ip_address]}
683           TENANTHOST: {get_attr: [NetHostMap, value, tenant, short]}
684           MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
685           MANAGEMENTHOST: {get_attr: [NetHostMap, value, management, short]}
686           CTLPLANEIP: {get_attr: [Controller, networks, ctlplane, 0]}
687           CTLPLANEHOST: {get_attr: [NetHostMap, value, ctlplane, short]}
688           HOSTSSHPUBKEY: {get_attr: [SshHostPubKey, ecdsa]}
689   nova_server_resource:
690     description: Heat resource handle for the Nova compute server
691     value:
692       {get_resource: Controller}
693     condition: server_not_blacklisted
694   tls_key_modulus_md5:
695     description: MD5 checksum of the TLS Key Modulus
696     value: {get_attr: [NodeTLSData, key_modulus_md5]}
697   tls_cert_modulus_md5:
698     description: MD5 checksum of the TLS Certificate Modulus
699     value: {get_attr: [NodeTLSData, cert_modulus_md5]}