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