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