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