Enable DPDK on boot using PreNetworkConfig
[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       ServiceNames: {get_param: ServiceNames}
410
411   NetworkConfig:
412     type: OS::TripleO::Controller::Net::SoftwareConfig
413     properties:
414       ControlPlaneIp: {get_attr: [Controller, networks, ctlplane, 0]}
415       ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
416       InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
417       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
418       StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
419       TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
420       ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}
421
422   NetworkDeployment:
423     type: OS::TripleO::SoftwareDeployment
424     depends_on: PreNetworkConfig
425     properties:
426       name: NetworkDeployment
427       config: {get_resource: NetworkConfig}
428       server: {get_resource: Controller}
429       actions:
430         if:
431           - server_not_blacklisted
432           - {get_param: NetworkDeploymentActions}
433           - []
434       input_values:
435         bridge_name: br-ex
436         interface_name: {get_param: NeutronPublicInterface}
437
438   # Resource for site-specific injection of root certificate
439   NodeTLSCAData:
440     depends_on: NetworkDeployment
441     type: OS::TripleO::NodeTLSCAData
442     properties:
443       server: {get_resource: Controller}
444
445   # Resource for site-specific passing of private keys/certificates
446   NodeTLSData:
447     depends_on: NodeTLSCAData
448     type: OS::TripleO::NodeTLSData
449     properties:
450       server: {get_resource: Controller}
451       NodeIndex: {get_param: NodeIndex}
452
453   ControllerUpgradeInitConfig:
454     type: OS::Heat::SoftwareConfig
455     properties:
456       group: script
457       config:
458         list_join:
459         - ''
460         - - "#!/bin/bash\n\n"
461           - "if [[ -f /etc/resolv.conf.save ]] ; then rm /etc/resolv.conf.save; fi\n\n"
462           - get_param: UpgradeInitCommand
463           - get_param: UpgradeInitCommonCommand
464
465   # Note we may be able to make this conditional on UpgradeInitCommandNotEmpty
466   # but https://bugs.launchpad.net/heat/+bug/1649900 needs fixing first
467   ControllerUpgradeInitDeployment:
468     type: OS::Heat::SoftwareDeployment
469     depends_on: NetworkDeployment
470     properties:
471       name: ControllerUpgradeInitDeployment
472       actions:
473         if:
474           - server_not_blacklisted
475           - ['CREATE', 'UPDATE']
476           - []
477       server: {get_resource: Controller}
478       config: {get_resource: ControllerUpgradeInitConfig}
479
480   ControllerDeployment:
481     type: OS::TripleO::SoftwareDeployment
482     depends_on: ControllerUpgradeInitDeployment
483     properties:
484       name: ControllerDeployment
485       actions:
486         if:
487           - server_not_blacklisted
488           - ['CREATE', 'UPDATE']
489           - []
490       config: {get_resource: ControllerConfig}
491       server: {get_resource: Controller}
492       input_values:
493         bootstack_nodeid: {get_attr: [Controller, name]}
494         enable_load_balancer: {get_param: EnableLoadBalancer}
495         enable_package_upgrade: {get_attr: [UpdateDeployment, update_managed_packages]}
496
497   # Map heat metadata into hiera datafiles
498   ControllerConfig:
499     type: OS::Heat::StructuredConfig
500     properties:
501       group: hiera
502       config:
503         hierarchy:
504           - '"%{::uuid}"'
505           - heat_config_%{::deploy_config_name}
506           - config_step
507           - controller_extraconfig
508           - extraconfig
509           - service_configs
510           - service_names
511           - controller
512           - bootstrap_node # provided by BootstrapNodeConfig
513           - all_nodes # provided by allNodesConfig
514           - vip_data # provided by allNodesConfig
515           - '"%{::osfamily}"'
516           - neutron_bigswitch_data # Optionally provided by ControllerExtraConfigPre
517           - neutron_cisco_data # Optionally provided by ControllerExtraConfigPre
518           - cisco_n1kv_data # Optionally provided by ControllerExtraConfigPre
519           - midonet_data #Optionally provided by AllNodesExtraConfig
520           - cisco_aci_data # Optionally provided by ControllerExtraConfigPre
521         merge_behavior: deeper
522         datafiles:
523           service_names:
524             service_names: {get_param: ServiceNames}
525             sensu::subscriptions: {get_param: MonitoringSubscriptions}
526           service_configs:
527             map_replace:
528               - {get_param: ServiceConfigSettings}
529               - values: {get_attr: [NetIpMap, net_ip_map]}
530           controller_extraconfig:
531             map_merge:
532               - {get_param: controllerExtraConfig}
533               - {get_param: ControllerExtraConfig}
534           extraconfig: {get_param: ExtraConfig}
535           controller:
536             # data supplied directly to this deployment configuration, etc
537             bootstack_nodeid: {get_input: bootstack_nodeid}
538             # Pacemaker
539             enable_load_balancer: {get_input: enable_load_balancer}
540
541             # Misc
542             tripleo::haproxy::service_certificate: {get_attr: [NodeTLSData, deployed_ssl_certificate_path]}
543             tripleo::packages::enable_upgrade: {get_input: enable_package_upgrade}
544             fqdn_internal_api: {get_attr: [NetHostMap, value, internal_api, fqdn]}
545             fqdn_storage: {get_attr: [NetHostMap, value, storage, fqdn]}
546             fqdn_storage_mgmt: {get_attr: [NetHostMap, value, storage_mgmt, fqdn]}
547             fqdn_tenant: {get_attr: [NetHostMap, value, tenant, fqdn]}
548             fqdn_management: {get_attr: [NetHostMap, value, management, fqdn]}
549             fqdn_ctlplane: {get_attr: [NetHostMap, value, ctlplane, fqdn]}
550             fqdn_external: {get_attr: [NetHostMap, value, external, fqdn]}
551
552   # Hook for site-specific additional pre-deployment config, e.g extra hieradata
553   ControllerExtraConfigPre:
554     depends_on: ControllerDeployment
555     type: OS::TripleO::ControllerExtraConfigPre
556     properties:
557         server: {get_resource: Controller}
558
559   # Hook for site-specific additional pre-deployment config,
560   # applying to all nodes, e.g node registration/unregistration
561   NodeExtraConfig:
562     depends_on: [ControllerExtraConfigPre, NodeTLSData]
563     type: OS::TripleO::NodeExtraConfig
564     properties:
565         server: {get_resource: Controller}
566
567   UpdateConfig:
568     type: OS::TripleO::Tasks::PackageUpdate
569
570   UpdateDeployment:
571     type: OS::Heat::SoftwareDeployment
572     depends_on: NetworkDeployment
573     properties:
574       name: UpdateDeployment
575       actions:
576         if:
577           - server_not_blacklisted
578           - ['CREATE', 'UPDATE']
579           - []
580       config: {get_resource: UpdateConfig}
581       server: {get_resource: Controller}
582       input_values:
583         update_identifier:
584           get_param: UpdateIdentifier
585
586   SshHostPubKey:
587     type: OS::TripleO::Ssh::HostPubKey
588     depends_on: ControllerDeployment
589     properties:
590         server: {get_resource: Controller}
591
592 outputs:
593   ip_address:
594     description: IP address of the server in the ctlplane network
595     value: {get_attr: [Controller, networks, ctlplane, 0]}
596   external_ip_address:
597     description: IP address of the server in the external network
598     value: {get_attr: [ExternalPort, ip_address]}
599   internal_api_ip_address:
600     description: IP address of the server in the internal_api network
601     value: {get_attr: [InternalApiPort, ip_address]}
602   storage_ip_address:
603     description: IP address of the server in the storage network
604     value: {get_attr: [StoragePort, ip_address]}
605   storage_mgmt_ip_address:
606     description: IP address of the server in the storage_mgmt network
607     value: {get_attr: [StorageMgmtPort, ip_address]}
608   tenant_ip_address:
609     description: IP address of the server in the tenant network
610     value: {get_attr: [TenantPort, ip_address]}
611   management_ip_address:
612     description: IP address of the server in the management network
613     value: {get_attr: [ManagementPort, ip_address]}
614   hostname:
615     description: Hostname of the server
616     value: {get_attr: [Controller, name]}
617   hostname_map:
618     description: Mapping of network names to hostnames
619     value:
620       external: {get_attr: [NetHostMap, value, external, fqdn]}
621       internal_api: {get_attr: [NetHostMap, value, internal_api, fqdn]}
622       storage: {get_attr: [NetHostMap, value, storage, fqdn]}
623       storage_mgmt: {get_attr: [NetHostMap, value, storage_mgmt, fqdn]}
624       tenant: {get_attr: [NetHostMap, value, tenant, fqdn]}
625       management: {get_attr: [NetHostMap, value, management, fqdn]}
626       ctlplane: {get_attr: [NetHostMap, value, ctlplane, fqdn]}
627   hosts_entry:
628     description: >
629       Server's IP address and hostname in the /etc/hosts format
630     value:
631       str_replace:
632         template: |
633           PRIMARYIP PRIMARYHOST.DOMAIN PRIMARYHOST
634           EXTERNALIP EXTERNALHOST.DOMAIN EXTERNALHOST
635           INTERNAL_APIIP INTERNAL_APIHOST.DOMAIN INTERNAL_APIHOST
636           STORAGEIP STORAGEHOST.DOMAIN STORAGEHOST
637           STORAGE_MGMTIP STORAGE_MGMTHOST.DOMAIN STORAGE_MGMTHOST
638           TENANTIP TENANTHOST.DOMAIN TENANTHOST
639           MANAGEMENTIP MANAGEMENTHOST.DOMAIN MANAGEMENTHOST
640           CTLPLANEIP CTLPLANEHOST.DOMAIN CTLPLANEHOST
641         params:
642           PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, ControllerHostnameResolveNetwork]}]}
643           DOMAIN: {get_param: CloudDomain}
644           PRIMARYHOST: {get_attr: [Controller, name]}
645           EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
646           EXTERNALHOST: {get_attr: [NetHostMap, value, external, short]}
647           INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
648           INTERNAL_APIHOST: {get_attr: [NetHostMap, value, internal_api, short]}
649           STORAGEIP: {get_attr: [StoragePort, ip_address]}
650           STORAGEHOST: {get_attr: [NetHostMap, value, storage, short]}
651           STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
652           STORAGE_MGMTHOST: {get_attr: [NetHostMap, value, storage_mgmt, short]}
653           TENANTIP: {get_attr: [TenantPort, ip_address]}
654           TENANTHOST: {get_attr: [NetHostMap, value, tenant, short]}
655           MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
656           MANAGEMENTHOST: {get_attr: [NetHostMap, value, management, short]}
657           CTLPLANEIP: {get_attr: [Controller, networks, ctlplane, 0]}
658           CTLPLANEHOST: {get_attr: [NetHostMap, value, ctlplane, short]}
659   known_hosts_entry:
660     description: Entry for ssh known hosts
661     value:
662       str_replace:
663         template: "PRIMARYIP,PRIMARYHOST.DOMAIN,PRIMARYHOST,\
664 EXTERNALIP,EXTERNALHOST.DOMAIN,EXTERNALHOST,\
665 INTERNAL_APIIP,INTERNAL_APIHOST.DOMAIN,INTERNAL_APIHOST,\
666 STORAGEIP,STORAGEHOST.DOMAIN,STORAGEHOST,\
667 STORAGE_MGMTIP,STORAGE_MGMTHOST.DOMAIN,STORAGE_MGMTHOST,\
668 TENANTIP,TENANTHOST.DOMAIN,TENANTHOST,\
669 MANAGEMENTIP,MANAGEMENTHOST.DOMAIN,MANAGEMENTHOST,\
670 CTLPLANEIP,CTLPLANEHOST.DOMAIN,CTLPLANEHOST HOSTSSHPUBKEY"
671         params:
672           PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, ControllerHostnameResolveNetwork]}]}
673           DOMAIN: {get_param: CloudDomain}
674           PRIMARYHOST: {get_attr: [Controller, name]}
675           EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
676           EXTERNALHOST: {get_attr: [NetHostMap, value, external, short]}
677           INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
678           INTERNAL_APIHOST: {get_attr: [NetHostMap, value, internal_api, short]}
679           STORAGEIP: {get_attr: [StoragePort, ip_address]}
680           STORAGEHOST: {get_attr: [NetHostMap, value, storage, short]}
681           STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
682           STORAGE_MGMTHOST: {get_attr: [NetHostMap, value, storage_mgmt, short]}
683           TENANTIP: {get_attr: [TenantPort, ip_address]}
684           TENANTHOST: {get_attr: [NetHostMap, value, tenant, short]}
685           MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
686           MANAGEMENTHOST: {get_attr: [NetHostMap, value, management, short]}
687           CTLPLANEIP: {get_attr: [Controller, networks, ctlplane, 0]}
688           CTLPLANEHOST: {get_attr: [NetHostMap, value, ctlplane, short]}
689           HOSTSSHPUBKEY: {get_attr: [SshHostPubKey, ecdsa]}
690   nova_server_resource:
691     description: Heat resource handle for the Nova compute server
692     value:
693       {get_resource: Controller}
694     condition: server_not_blacklisted
695   tls_key_modulus_md5:
696     description: MD5 checksum of the TLS Key Modulus
697     value: {get_attr: [NodeTLSData, key_modulus_md5]}
698   tls_cert_modulus_md5:
699     description: MD5 checksum of the TLS Certificate Modulus
700     value: {get_attr: [NodeTLSData, cert_modulus_md5]}