Merge "Dell SC: Add exclude_domain_ip option"
[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 should match the dhcp_domain
108       configured in the Undercloud neutron. Defaults to localdomain.
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
175 parameter_groups:
176 - label: deprecated
177   description: Do not use deprecated params, they will be removed.
178   parameters:
179   - controllerExtraConfig
180
181 conditions:
182   server_not_blacklisted:
183     not:
184       equals:
185         - {get_param: [DeploymentServerBlacklistDict, {get_param: Hostname}]}
186         - 1
187
188
189 resources:
190
191   Controller:
192     type: OS::TripleO::ControllerServer
193     metadata:
194       os-collect-config:
195         command: {get_param: ConfigCommand}
196         splay: {get_param: ConfigCollectSplay}
197     properties:
198       image: {get_param: controllerImage}
199       image_update_policy: {get_param: ImageUpdatePolicy}
200       flavor: {get_param: OvercloudControlFlavor}
201       key_name: {get_param: KeyName}
202       networks:
203         - network: ctlplane
204       user_data_format: SOFTWARE_CONFIG
205       user_data: {get_resource: UserData}
206       name:
207         str_replace:
208             template: {get_param: Hostname}
209             params: {get_param: HostnameMap}
210       software_config_transport: {get_param: SoftwareConfigTransport}
211       metadata:
212         map_merge:
213           - {get_param: ServerMetadata}
214           - {get_param: ControllerServerMetadata}
215           - {get_param: ServiceMetadataSettings}
216       scheduler_hints: {get_param: ControllerSchedulerHints}
217
218   # Combine the NodeAdminUserData and NodeUserData mime archives
219   UserData:
220     type: OS::Heat::MultipartMime
221     properties:
222       parts:
223       - config: {get_resource: NodeAdminUserData}
224         type: multipart
225       - config: {get_resource: NodeUserData}
226         type: multipart
227       - config: {get_resource: RoleUserData}
228         type: multipart
229
230   # Creates the "heat-admin" user if configured via the environment
231   # Should return a OS::Heat::MultipartMime reference via OS::stack_id
232   NodeAdminUserData:
233     type: OS::TripleO::NodeAdminUserData
234
235   # For optional operator additional userdata
236   # Should return a OS::Heat::MultipartMime reference via OS::stack_id
237   NodeUserData:
238     type: OS::TripleO::NodeUserData
239
240   # For optional operator role-specific userdata
241   # Should return a OS::Heat::MultipartMime reference via OS::stack_id
242   RoleUserData:
243     type: OS::TripleO::Controller::NodeUserData
244
245   ExternalPort:
246     type: OS::TripleO::Controller::Ports::ExternalPort
247     properties:
248       IPPool: {get_param: ControllerIPs}
249       NodeIndex: {get_param: NodeIndex}
250       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
251
252   InternalApiPort:
253     type: OS::TripleO::Controller::Ports::InternalApiPort
254     properties:
255       IPPool: {get_param: ControllerIPs}
256       NodeIndex: {get_param: NodeIndex}
257       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
258
259   StoragePort:
260     type: OS::TripleO::Controller::Ports::StoragePort
261     properties:
262       IPPool: {get_param: ControllerIPs}
263       NodeIndex: {get_param: NodeIndex}
264       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
265
266   StorageMgmtPort:
267     type: OS::TripleO::Controller::Ports::StorageMgmtPort
268     properties:
269       IPPool: {get_param: ControllerIPs}
270       NodeIndex: {get_param: NodeIndex}
271       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
272
273   TenantPort:
274     type: OS::TripleO::Controller::Ports::TenantPort
275     properties:
276       IPPool: {get_param: ControllerIPs}
277       NodeIndex: {get_param: NodeIndex}
278       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
279
280   ManagementPort:
281     type: OS::TripleO::Controller::Ports::ManagementPort
282     properties:
283       IPPool: {get_param: ControllerIPs}
284       NodeIndex: {get_param: NodeIndex}
285       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
286
287   NetIpMap:
288     type: OS::TripleO::Network::Ports::NetIpMap
289     properties:
290       ControlPlaneIp: {get_attr: [Controller, networks, ctlplane, 0]}
291       ExternalIp: {get_attr: [ExternalPort, ip_address]}
292       ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
293       ExternalIpUri: {get_attr: [ExternalPort, ip_address_uri]}
294       InternalApiIp: {get_attr: [InternalApiPort, ip_address]}
295       InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
296       InternalApiIpUri: {get_attr: [InternalApiPort, ip_address_uri]}
297       StorageIp: {get_attr: [StoragePort, ip_address]}
298       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
299       StorageIpUri: {get_attr: [StoragePort, ip_address_uri]}
300       StorageMgmtIp: {get_attr: [StorageMgmtPort, ip_address]}
301       StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
302       StorageMgmtIpUri: {get_attr: [StorageMgmtPort, ip_address_uri]}
303       TenantIp: {get_attr: [TenantPort, ip_address]}
304       TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
305       TenantIpUri: {get_attr: [TenantPort, ip_address_uri]}
306       ManagementIp: {get_attr: [ManagementPort, ip_address]}
307       ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}
308       ManagementIpUri: {get_attr: [ManagementPort, ip_address_uri]}
309
310   NetHostMap:
311     type: OS::Heat::Value
312     properties:
313       type: json
314       value:
315         external:
316           fqdn:
317             list_join:
318             - '.'
319             - - {get_attr: [Controller, name]}
320               - external
321               - {get_param: CloudDomain}
322           short:
323             list_join:
324             - '.'
325             - - {get_attr: [Controller, name]}
326               - external
327         internal_api:
328           fqdn:
329             list_join:
330             - '.'
331             - - {get_attr: [Controller, name]}
332               - internalapi
333               - {get_param: CloudDomain}
334           short:
335             list_join:
336             - '.'
337             - - {get_attr: [Controller, name]}
338               - internalapi
339         storage:
340           fqdn:
341             list_join:
342             - '.'
343             - - {get_attr: [Controller, name]}
344               - storage
345               - {get_param: CloudDomain}
346           short:
347             list_join:
348             - '.'
349             - - {get_attr: [Controller, name]}
350               - storage
351         storage_mgmt:
352           fqdn:
353             list_join:
354             - '.'
355             - - {get_attr: [Controller, name]}
356               - storagemgmt
357               - {get_param: CloudDomain}
358           short:
359             list_join:
360             - '.'
361             - - {get_attr: [Controller, name]}
362               - storagemgmt
363         tenant:
364           fqdn:
365             list_join:
366             - '.'
367             - - {get_attr: [Controller, name]}
368               - tenant
369               - {get_param: CloudDomain}
370           short:
371             list_join:
372             - '.'
373             - - {get_attr: [Controller, name]}
374               - tenant
375         management:
376           fqdn:
377             list_join:
378             - '.'
379             - - {get_attr: [Controller, name]}
380               - management
381               - {get_param: CloudDomain}
382           short:
383             list_join:
384             - '.'
385             - - {get_attr: [Controller, name]}
386               - management
387         ctlplane:
388           fqdn:
389             list_join:
390             - '.'
391             - - {get_attr: [Controller, name]}
392               - ctlplane
393               - {get_param: CloudDomain}
394           short:
395             list_join:
396             - '.'
397             - - {get_attr: [Controller, name]}
398               - ctlplane
399
400   PreNetworkConfig:
401     type: OS::TripleO::Controller::PreNetworkConfig
402     properties:
403       server: {get_resource: Controller}
404
405   NetworkConfig:
406     type: OS::TripleO::Controller::Net::SoftwareConfig
407     properties:
408       ControlPlaneIp: {get_attr: [Controller, networks, ctlplane, 0]}
409       ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
410       InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
411       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
412       StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
413       TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
414       ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}
415
416   NetworkDeployment:
417     type: OS::TripleO::SoftwareDeployment
418     depends_on: PreNetworkConfig
419     properties:
420       name: NetworkDeployment
421       config: {get_resource: NetworkConfig}
422       server: {get_resource: Controller}
423       actions:
424         if:
425           - server_not_blacklisted
426           - {get_param: NetworkDeploymentActions}
427           - []
428       input_values:
429         bridge_name: br-ex
430         interface_name: {get_param: NeutronPublicInterface}
431
432   # Resource for site-specific injection of root certificate
433   NodeTLSCAData:
434     depends_on: NetworkDeployment
435     type: OS::TripleO::NodeTLSCAData
436     properties:
437       server: {get_resource: Controller}
438
439   # Resource for site-specific passing of private keys/certificates
440   NodeTLSData:
441     depends_on: NodeTLSCAData
442     type: OS::TripleO::NodeTLSData
443     properties:
444       server: {get_resource: Controller}
445       NodeIndex: {get_param: NodeIndex}
446
447   ControllerUpgradeInitConfig:
448     type: OS::Heat::SoftwareConfig
449     properties:
450       group: script
451       config:
452         list_join:
453         - ''
454         - - "#!/bin/bash\n\n"
455           - "if [[ -f /etc/resolv.conf.save ]] ; then rm /etc/resolv.conf.save; fi\n\n"
456           - get_param: UpgradeInitCommand
457           - get_param: UpgradeInitCommonCommand
458
459   # Note we may be able to make this conditional on UpgradeInitCommandNotEmpty
460   # but https://bugs.launchpad.net/heat/+bug/1649900 needs fixing first
461   ControllerUpgradeInitDeployment:
462     type: OS::Heat::SoftwareDeployment
463     depends_on: NetworkDeployment
464     properties:
465       name: ControllerUpgradeInitDeployment
466       actions:
467         if:
468           - server_not_blacklisted
469           - ['CREATE', 'UPDATE']
470           - []
471       server: {get_resource: Controller}
472       config: {get_resource: ControllerUpgradeInitConfig}
473
474   ControllerDeployment:
475     type: OS::TripleO::SoftwareDeployment
476     depends_on: ControllerUpgradeInitDeployment
477     properties:
478       name: ControllerDeployment
479       actions:
480         if:
481           - server_not_blacklisted
482           - ['CREATE', 'UPDATE']
483           - []
484       config: {get_resource: ControllerConfig}
485       server: {get_resource: Controller}
486       input_values:
487         bootstack_nodeid: {get_attr: [Controller, name]}
488         enable_load_balancer: {get_param: EnableLoadBalancer}
489         enable_package_upgrade: {get_attr: [UpdateDeployment, update_managed_packages]}
490
491   # Map heat metadata into hiera datafiles
492   ControllerConfig:
493     type: OS::Heat::StructuredConfig
494     properties:
495       group: hiera
496       config:
497         hierarchy:
498           - '"%{::uuid}"'
499           - heat_config_%{::deploy_config_name}
500           - config_step
501           - controller_extraconfig
502           - extraconfig
503           - service_configs
504           - service_names
505           - controller
506           - bootstrap_node # provided by BootstrapNodeConfig
507           - all_nodes # provided by allNodesConfig
508           - vip_data # provided by allNodesConfig
509           - '"%{::osfamily}"'
510           - neutron_bigswitch_data # Optionally provided by ControllerExtraConfigPre
511           - neutron_cisco_data # Optionally provided by ControllerExtraConfigPre
512           - cisco_n1kv_data # Optionally provided by ControllerExtraConfigPre
513           - midonet_data #Optionally provided by AllNodesExtraConfig
514           - cisco_aci_data # Optionally provided by ControllerExtraConfigPre
515         merge_behavior: deeper
516         datafiles:
517           service_names:
518             service_names: {get_param: ServiceNames}
519             sensu::subscriptions: {get_param: MonitoringSubscriptions}
520           service_configs:
521             map_replace:
522               - {get_param: ServiceConfigSettings}
523               - values: {get_attr: [NetIpMap, net_ip_map]}
524           controller_extraconfig:
525             map_merge:
526               - {get_param: controllerExtraConfig}
527               - {get_param: ControllerExtraConfig}
528           extraconfig: {get_param: ExtraConfig}
529           controller:
530             # data supplied directly to this deployment configuration, etc
531             bootstack_nodeid: {get_input: bootstack_nodeid}
532             # Pacemaker
533             enable_load_balancer: {get_input: enable_load_balancer}
534
535             # Misc
536             tripleo::haproxy::service_certificate: {get_attr: [NodeTLSData, deployed_ssl_certificate_path]}
537             tripleo::packages::enable_upgrade: {get_input: enable_package_upgrade}
538             fqdn_internal_api: {get_attr: [NetHostMap, value, internal_api, fqdn]}
539             fqdn_storage: {get_attr: [NetHostMap, value, storage, fqdn]}
540             fqdn_storage_mgmt: {get_attr: [NetHostMap, value, storage_mgmt, fqdn]}
541             fqdn_tenant: {get_attr: [NetHostMap, value, tenant, fqdn]}
542             fqdn_management: {get_attr: [NetHostMap, value, management, fqdn]}
543             fqdn_ctlplane: {get_attr: [NetHostMap, value, ctlplane, fqdn]}
544             fqdn_external: {get_attr: [NetHostMap, value, external, fqdn]}
545
546   # Hook for site-specific additional pre-deployment config, e.g extra hieradata
547   ControllerExtraConfigPre:
548     depends_on: ControllerDeployment
549     type: OS::TripleO::ControllerExtraConfigPre
550     properties:
551         server: {get_resource: Controller}
552
553   # Hook for site-specific additional pre-deployment config,
554   # applying to all nodes, e.g node registration/unregistration
555   NodeExtraConfig:
556     depends_on: [ControllerExtraConfigPre, NodeTLSData]
557     type: OS::TripleO::NodeExtraConfig
558     properties:
559         server: {get_resource: Controller}
560
561   UpdateConfig:
562     type: OS::TripleO::Tasks::PackageUpdate
563
564   UpdateDeployment:
565     type: OS::Heat::SoftwareDeployment
566     depends_on: NetworkDeployment
567     properties:
568       name: UpdateDeployment
569       actions:
570         if:
571           - server_not_blacklisted
572           - ['CREATE', 'UPDATE']
573           - []
574       config: {get_resource: UpdateConfig}
575       server: {get_resource: Controller}
576       input_values:
577         update_identifier:
578           get_param: UpdateIdentifier
579
580   SshHostPubKey:
581     type: OS::TripleO::Ssh::HostPubKey
582     depends_on: ControllerDeployment
583     properties:
584         server: {get_resource: Controller}
585
586 outputs:
587   ip_address:
588     description: IP address of the server in the ctlplane network
589     value: {get_attr: [Controller, networks, ctlplane, 0]}
590   external_ip_address:
591     description: IP address of the server in the external network
592     value: {get_attr: [ExternalPort, ip_address]}
593   internal_api_ip_address:
594     description: IP address of the server in the internal_api network
595     value: {get_attr: [InternalApiPort, ip_address]}
596   storage_ip_address:
597     description: IP address of the server in the storage network
598     value: {get_attr: [StoragePort, ip_address]}
599   storage_mgmt_ip_address:
600     description: IP address of the server in the storage_mgmt network
601     value: {get_attr: [StorageMgmtPort, ip_address]}
602   tenant_ip_address:
603     description: IP address of the server in the tenant network
604     value: {get_attr: [TenantPort, ip_address]}
605   management_ip_address:
606     description: IP address of the server in the management network
607     value: {get_attr: [ManagementPort, ip_address]}
608   hostname:
609     description: Hostname of the server
610     value: {get_attr: [Controller, name]}
611   hostname_map:
612     description: Mapping of network names to hostnames
613     value:
614       external: {get_attr: [NetHostMap, value, external, fqdn]}
615       internal_api: {get_attr: [NetHostMap, value, internal_api, fqdn]}
616       storage: {get_attr: [NetHostMap, value, storage, fqdn]}
617       storage_mgmt: {get_attr: [NetHostMap, value, storage_mgmt, fqdn]}
618       tenant: {get_attr: [NetHostMap, value, tenant, fqdn]}
619       management: {get_attr: [NetHostMap, value, management, fqdn]}
620       ctlplane: {get_attr: [NetHostMap, value, ctlplane, fqdn]}
621   hosts_entry:
622     description: >
623       Server's IP address and hostname in the /etc/hosts format
624     value:
625       str_replace:
626         template: |
627           PRIMARYIP PRIMARYHOST.DOMAIN PRIMARYHOST
628           EXTERNALIP EXTERNALHOST.DOMAIN EXTERNALHOST
629           INTERNAL_APIIP INTERNAL_APIHOST.DOMAIN INTERNAL_APIHOST
630           STORAGEIP STORAGEHOST.DOMAIN STORAGEHOST
631           STORAGE_MGMTIP STORAGE_MGMTHOST.DOMAIN STORAGE_MGMTHOST
632           TENANTIP TENANTHOST.DOMAIN TENANTHOST
633           MANAGEMENTIP MANAGEMENTHOST.DOMAIN MANAGEMENTHOST
634           CTLPLANEIP CTLPLANEHOST.DOMAIN CTLPLANEHOST
635         params:
636           PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, ControllerHostnameResolveNetwork]}]}
637           DOMAIN: {get_param: CloudDomain}
638           PRIMARYHOST: {get_attr: [Controller, name]}
639           EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
640           EXTERNALHOST: {get_attr: [NetHostMap, value, external, short]}
641           INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
642           INTERNAL_APIHOST: {get_attr: [NetHostMap, value, internal_api, short]}
643           STORAGEIP: {get_attr: [StoragePort, ip_address]}
644           STORAGEHOST: {get_attr: [NetHostMap, value, storage, short]}
645           STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
646           STORAGE_MGMTHOST: {get_attr: [NetHostMap, value, storage_mgmt, short]}
647           TENANTIP: {get_attr: [TenantPort, ip_address]}
648           TENANTHOST: {get_attr: [NetHostMap, value, tenant, short]}
649           MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
650           MANAGEMENTHOST: {get_attr: [NetHostMap, value, management, short]}
651           CTLPLANEIP: {get_attr: [Controller, networks, ctlplane, 0]}
652           CTLPLANEHOST: {get_attr: [NetHostMap, value, ctlplane, short]}
653   known_hosts_entry:
654     description: Entry for ssh known hosts
655     value:
656       str_replace:
657         template: "PRIMARYIP,PRIMARYHOST.DOMAIN,PRIMARYHOST,\
658 EXTERNALIP,EXTERNALHOST.DOMAIN,EXTERNALHOST,\
659 INTERNAL_APIIP,INTERNAL_APIHOST.DOMAIN,INTERNAL_APIHOST,\
660 STORAGEIP,STORAGEHOST.DOMAIN,STORAGEHOST,\
661 STORAGE_MGMTIP,STORAGE_MGMTHOST.DOMAIN,STORAGE_MGMTHOST,\
662 TENANTIP,TENANTHOST.DOMAIN,TENANTHOST,\
663 MANAGEMENTIP,MANAGEMENTHOST.DOMAIN,MANAGEMENTHOST,\
664 CTLPLANEIP,CTLPLANEHOST.DOMAIN,CTLPLANEHOST HOSTSSHPUBKEY"
665         params:
666           PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, ControllerHostnameResolveNetwork]}]}
667           DOMAIN: {get_param: CloudDomain}
668           PRIMARYHOST: {get_attr: [Controller, name]}
669           EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
670           EXTERNALHOST: {get_attr: [NetHostMap, value, external, short]}
671           INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
672           INTERNAL_APIHOST: {get_attr: [NetHostMap, value, internal_api, short]}
673           STORAGEIP: {get_attr: [StoragePort, ip_address]}
674           STORAGEHOST: {get_attr: [NetHostMap, value, storage, short]}
675           STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
676           STORAGE_MGMTHOST: {get_attr: [NetHostMap, value, storage_mgmt, short]}
677           TENANTIP: {get_attr: [TenantPort, ip_address]}
678           TENANTHOST: {get_attr: [NetHostMap, value, tenant, short]}
679           MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
680           MANAGEMENTHOST: {get_attr: [NetHostMap, value, management, short]}
681           CTLPLANEIP: {get_attr: [Controller, networks, ctlplane, 0]}
682           CTLPLANEHOST: {get_attr: [NetHostMap, value, ctlplane, short]}
683           HOSTSSHPUBKEY: {get_attr: [SshHostPubKey, ecdsa]}
684   nova_server_resource:
685     description: Heat resource handle for the Nova compute server
686     value:
687       {get_resource: Controller}
688     condition: server_not_blacklisted
689   tls_key_modulus_md5:
690     description: MD5 checksum of the TLS Key Modulus
691     value: {get_attr: [NodeTLSData, key_modulus_md5]}
692   tls_cert_modulus_md5:
693     description: MD5 checksum of the TLS Certificate Modulus
694     value: {get_attr: [NodeTLSData, cert_modulus_md5]}