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