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