Pacemaker HA suport for OVN DB servers
[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
545   # Hook for site-specific additional pre-deployment config, e.g extra hieradata
546   ControllerExtraConfigPre:
547     depends_on: ControllerDeployment
548     type: OS::TripleO::ControllerExtraConfigPre
549     properties:
550         server: {get_resource: Controller}
551
552   # Hook for site-specific additional pre-deployment config,
553   # applying to all nodes, e.g node registration/unregistration
554   NodeExtraConfig:
555     depends_on: [ControllerExtraConfigPre, NodeTLSData]
556     type: OS::TripleO::NodeExtraConfig
557     properties:
558         server: {get_resource: Controller}
559
560   UpdateConfig:
561     type: OS::TripleO::Tasks::PackageUpdate
562
563   UpdateDeployment:
564     type: OS::Heat::SoftwareDeployment
565     depends_on: NetworkDeployment
566     properties:
567       name: UpdateDeployment
568       actions:
569         if:
570           - server_not_blacklisted
571           - ['CREATE', 'UPDATE']
572           - []
573       config: {get_resource: UpdateConfig}
574       server: {get_resource: Controller}
575       input_values:
576         update_identifier:
577           get_param: UpdateIdentifier
578
579   SshHostPubKey:
580     type: OS::TripleO::Ssh::HostPubKey
581     depends_on: ControllerDeployment
582     properties:
583         server: {get_resource: Controller}
584
585 outputs:
586   ip_address:
587     description: IP address of the server in the ctlplane network
588     value: {get_attr: [Controller, networks, ctlplane, 0]}
589   external_ip_address:
590     description: IP address of the server in the external network
591     value: {get_attr: [ExternalPort, ip_address]}
592   internal_api_ip_address:
593     description: IP address of the server in the internal_api network
594     value: {get_attr: [InternalApiPort, ip_address]}
595   storage_ip_address:
596     description: IP address of the server in the storage network
597     value: {get_attr: [StoragePort, ip_address]}
598   storage_mgmt_ip_address:
599     description: IP address of the server in the storage_mgmt network
600     value: {get_attr: [StorageMgmtPort, ip_address]}
601   tenant_ip_address:
602     description: IP address of the server in the tenant network
603     value: {get_attr: [TenantPort, ip_address]}
604   management_ip_address:
605     description: IP address of the server in the management network
606     value: {get_attr: [ManagementPort, ip_address]}
607   hostname:
608     description: Hostname of the server
609     value: {get_attr: [Controller, name]}
610   hostname_map:
611     description: Mapping of network names to hostnames
612     value:
613       external: {get_attr: [NetHostMap, value, external, fqdn]}
614       internal_api: {get_attr: [NetHostMap, value, internal_api, fqdn]}
615       storage: {get_attr: [NetHostMap, value, storage, fqdn]}
616       storage_mgmt: {get_attr: [NetHostMap, value, storage_mgmt, fqdn]}
617       tenant: {get_attr: [NetHostMap, value, tenant, fqdn]}
618       management: {get_attr: [NetHostMap, value, management, fqdn]}
619       ctlplane: {get_attr: [NetHostMap, value, ctlplane, fqdn]}
620   hosts_entry:
621     description: >
622       Server's IP address and hostname in the /etc/hosts format
623     value:
624       str_replace:
625         template: |
626           PRIMARYIP PRIMARYHOST.DOMAIN PRIMARYHOST
627           EXTERNALIP EXTERNALHOST.DOMAIN EXTERNALHOST
628           INTERNAL_APIIP INTERNAL_APIHOST.DOMAIN INTERNAL_APIHOST
629           STORAGEIP STORAGEHOST.DOMAIN STORAGEHOST
630           STORAGE_MGMTIP STORAGE_MGMTHOST.DOMAIN STORAGE_MGMTHOST
631           TENANTIP TENANTHOST.DOMAIN TENANTHOST
632           MANAGEMENTIP MANAGEMENTHOST.DOMAIN MANAGEMENTHOST
633           CTLPLANEIP CTLPLANEHOST.DOMAIN CTLPLANEHOST
634         params:
635           PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, ControllerHostnameResolveNetwork]}]}
636           DOMAIN: {get_param: CloudDomain}
637           PRIMARYHOST: {get_attr: [Controller, name]}
638           EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
639           EXTERNALHOST: {get_attr: [NetHostMap, value, external, short]}
640           INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
641           INTERNAL_APIHOST: {get_attr: [NetHostMap, value, internal_api, short]}
642           STORAGEIP: {get_attr: [StoragePort, ip_address]}
643           STORAGEHOST: {get_attr: [NetHostMap, value, storage, short]}
644           STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
645           STORAGE_MGMTHOST: {get_attr: [NetHostMap, value, storage_mgmt, short]}
646           TENANTIP: {get_attr: [TenantPort, ip_address]}
647           TENANTHOST: {get_attr: [NetHostMap, value, tenant, short]}
648           MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
649           MANAGEMENTHOST: {get_attr: [NetHostMap, value, management, short]}
650           CTLPLANEIP: {get_attr: [Controller, networks, ctlplane, 0]}
651           CTLPLANEHOST: {get_attr: [NetHostMap, value, ctlplane, short]}
652   known_hosts_entry:
653     description: Entry for ssh known hosts
654     value:
655       str_replace:
656         template: "PRIMARYIP,PRIMARYHOST.DOMAIN,PRIMARYHOST,\
657 EXTERNALIP,EXTERNALHOST.DOMAIN,EXTERNALHOST,\
658 INTERNAL_APIIP,INTERNAL_APIHOST.DOMAIN,INTERNAL_APIHOST,\
659 STORAGEIP,STORAGEHOST.DOMAIN,STORAGEHOST,\
660 STORAGE_MGMTIP,STORAGE_MGMTHOST.DOMAIN,STORAGE_MGMTHOST,\
661 TENANTIP,TENANTHOST.DOMAIN,TENANTHOST,\
662 MANAGEMENTIP,MANAGEMENTHOST.DOMAIN,MANAGEMENTHOST,\
663 CTLPLANEIP,CTLPLANEHOST.DOMAIN,CTLPLANEHOST HOSTSSHPUBKEY"
664         params:
665           PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, ControllerHostnameResolveNetwork]}]}
666           DOMAIN: {get_param: CloudDomain}
667           PRIMARYHOST: {get_attr: [Controller, name]}
668           EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
669           EXTERNALHOST: {get_attr: [NetHostMap, value, external, short]}
670           INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
671           INTERNAL_APIHOST: {get_attr: [NetHostMap, value, internal_api, short]}
672           STORAGEIP: {get_attr: [StoragePort, ip_address]}
673           STORAGEHOST: {get_attr: [NetHostMap, value, storage, short]}
674           STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
675           STORAGE_MGMTHOST: {get_attr: [NetHostMap, value, storage_mgmt, short]}
676           TENANTIP: {get_attr: [TenantPort, ip_address]}
677           TENANTHOST: {get_attr: [NetHostMap, value, tenant, short]}
678           MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
679           MANAGEMENTHOST: {get_attr: [NetHostMap, value, management, short]}
680           CTLPLANEIP: {get_attr: [Controller, networks, ctlplane, 0]}
681           CTLPLANEHOST: {get_attr: [NetHostMap, value, ctlplane, short]}
682           HOSTSSHPUBKEY: {get_attr: [SshHostPubKey, ecdsa]}
683   nova_server_resource:
684     description: Heat resource handle for the Nova compute server
685     value:
686       {get_resource: Controller}
687     condition: server_not_blacklisted
688   tls_key_modulus_md5:
689     description: MD5 checksum of the TLS Key Modulus
690     value: {get_attr: [NodeTLSData, key_modulus_md5]}
691   tls_cert_modulus_md5:
692     description: MD5 checksum of the TLS Certificate Modulus
693     value: {get_attr: [NodeTLSData, cert_modulus_md5]}