Merge "Add Nova Vncproxy service to containerized deployment"
[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
165 conditions:
166   server_not_blacklisted:
167     not:
168       equals:
169         - {get_param: [DeploymentServerBlacklistDict, {get_param: Hostname}]}
170         - 1
171
172 resources:
173   {{role}}:
174     type: OS::TripleO::{{role.name}}Server
175     metadata:
176       os-collect-config:
177         command: {get_param: ConfigCommand}
178         splay: {get_param: ConfigCollectSplay}
179     properties:
180       image: {get_param: {{role}}Image}
181       image_update_policy: {get_param: ImageUpdatePolicy}
182       flavor: {get_param: Overcloud{{role}}Flavor}
183       key_name: {get_param: KeyName}
184       networks:
185         - network: ctlplane
186       user_data_format: SOFTWARE_CONFIG
187       user_data: {get_resource: UserData}
188       name:
189         str_replace:
190             template: {get_param: Hostname}
191             params: {get_param: HostnameMap}
192       software_config_transport: {get_param: SoftwareConfigTransport}
193       metadata:
194         map_merge:
195           - {get_param: ServerMetadata}
196           - {get_param: {{role}}ServerMetadata}
197           - {get_param: ServiceMetadataSettings}
198       scheduler_hints: {get_param: {{role}}SchedulerHints}
199
200   # Combine the NodeAdminUserData and NodeUserData mime archives
201   UserData:
202     type: OS::Heat::MultipartMime
203     properties:
204       parts:
205       - config: {get_resource: NodeAdminUserData}
206         type: multipart
207       - config: {get_resource: NodeUserData}
208         type: multipart
209       - config: {get_resource: RoleUserData}
210         type: multipart
211
212   # Creates the "heat-admin" user if configured via the environment
213   # Should return a OS::Heat::MultipartMime reference via OS::stack_id
214   NodeAdminUserData:
215     type: OS::TripleO::NodeAdminUserData
216
217   # For optional operator additional userdata
218   # Should return a OS::Heat::MultipartMime reference via OS::stack_id
219   NodeUserData:
220     type: OS::TripleO::NodeUserData
221
222   # For optional operator role-specific userdata
223   # Should return a OS::Heat::MultipartMime reference via OS::stack_id
224   RoleUserData:
225     type: OS::TripleO::{{role}}::NodeUserData
226
227   ExternalPort:
228     type: OS::TripleO::{{role}}::Ports::ExternalPort
229     properties:
230       ControlPlaneIP: {get_attr: [{{role}}, networks, ctlplane, 0]}
231       IPPool: {get_param: {{role}}IPs}
232       NodeIndex: {get_param: NodeIndex}
233
234   InternalApiPort:
235     type: OS::TripleO::{{role}}::Ports::InternalApiPort
236     properties:
237       ControlPlaneIP: {get_attr: [{{role}}, networks, ctlplane, 0]}
238       IPPool: {get_param: {{role}}IPs}
239       NodeIndex: {get_param: NodeIndex}
240
241   StoragePort:
242     type: OS::TripleO::{{role}}::Ports::StoragePort
243     properties:
244       ControlPlaneIP: {get_attr: [{{role}}, networks, ctlplane, 0]}
245       IPPool: {get_param: {{role}}IPs}
246       NodeIndex: {get_param: NodeIndex}
247
248   StorageMgmtPort:
249     type: OS::TripleO::{{role}}::Ports::StorageMgmtPort
250     properties:
251       ControlPlaneIP: {get_attr: [{{role}}, networks, ctlplane, 0]}
252       IPPool: {get_param: {{role}}IPs}
253       NodeIndex: {get_param: NodeIndex}
254
255   TenantPort:
256     type: OS::TripleO::{{role}}::Ports::TenantPort
257     properties:
258       ControlPlaneIP: {get_attr: [{{role}}, networks, ctlplane, 0]}
259       IPPool: {get_param: {{role}}IPs}
260       NodeIndex: {get_param: NodeIndex}
261
262   ManagementPort:
263     type: OS::TripleO::{{role}}::Ports::ManagementPort
264     properties:
265       ControlPlaneIP: {get_attr: [{{role}}, networks, ctlplane, 0]}
266       IPPool: {get_param: {{role}}IPs}
267       NodeIndex: {get_param: NodeIndex}
268
269   NetworkConfig:
270     type: OS::TripleO::{{role}}::Net::SoftwareConfig
271     properties:
272       ControlPlaneIp: {get_attr: [{{role}}, networks, ctlplane, 0]}
273       ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
274       InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
275       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
276       StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
277       TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
278       ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}
279
280   NetIpMap:
281     type: OS::TripleO::Network::Ports::NetIpMap
282     properties:
283       ControlPlaneIp: {get_attr: [{{role}}, networks, ctlplane, 0]}
284       ExternalIp: {get_attr: [ExternalPort, ip_address]}
285       ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
286       ExternalIpUri: {get_attr: [ExternalPort, ip_address_uri]}
287       InternalApiIp: {get_attr: [InternalApiPort, ip_address]}
288       InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
289       InternalApiIpUri: {get_attr: [InternalApiPort, ip_address_uri]}
290       StorageIp: {get_attr: [StoragePort, ip_address]}
291       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
292       StorageIpUri: {get_attr: [StoragePort, ip_address_uri]}
293       StorageMgmtIp: {get_attr: [StorageMgmtPort, ip_address]}
294       StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
295       StorageMgmtIpUri: {get_attr: [StorageMgmtPort, ip_address_uri]}
296       TenantIp: {get_attr: [TenantPort, ip_address]}
297       TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
298       TenantIpUri: {get_attr: [TenantPort, ip_address_uri]}
299       ManagementIp: {get_attr: [ManagementPort, ip_address]}
300       ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}
301       ManagementIpUri: {get_attr: [ManagementPort, ip_address_uri]}
302
303   NetHostMap:
304     type: OS::Heat::Value
305     properties:
306       type: json
307       value:
308         external:
309           fqdn:
310             list_join:
311             - '.'
312             - - {get_attr: [{{role}}, name]}
313               - external
314               - {get_param: CloudDomain}
315           short:
316             list_join:
317             - '.'
318             - - {get_attr: [{{role}}, name]}
319               - external
320         internal_api:
321           fqdn:
322             list_join:
323             - '.'
324             - - {get_attr: [{{role}}, name]}
325               - internalapi
326               - {get_param: CloudDomain}
327           short:
328             list_join:
329             - '.'
330             - - {get_attr: [{{role}}, name]}
331               - internalapi
332         storage:
333           fqdn:
334             list_join:
335             - '.'
336             - - {get_attr: [{{role}}, name]}
337               - storage
338               - {get_param: CloudDomain}
339           short:
340             list_join:
341             - '.'
342             - - {get_attr: [{{role}}, name]}
343               - storage
344         storage_mgmt:
345           fqdn:
346             list_join:
347             - '.'
348             - - {get_attr: [{{role}}, name]}
349               - storagemgmt
350               - {get_param: CloudDomain}
351           short:
352             list_join:
353             - '.'
354             - - {get_attr: [{{role}}, name]}
355               - storagemgmt
356         tenant:
357           fqdn:
358             list_join:
359             - '.'
360             - - {get_attr: [{{role}}, name]}
361               - tenant
362               - {get_param: CloudDomain}
363           short:
364             list_join:
365             - '.'
366             - - {get_attr: [{{role}}, name]}
367               - tenant
368         management:
369           fqdn:
370             list_join:
371             - '.'
372             - - {get_attr: [{{role}}, name]}
373               - management
374               - {get_param: CloudDomain}
375           short:
376             list_join:
377             - '.'
378             - - {get_attr: [{{role}}, name]}
379               - management
380         ctlplane:
381           fqdn:
382             list_join:
383             - '.'
384             - - {get_attr: [{{role}}, name]}
385               - ctlplane
386               - {get_param: CloudDomain}
387           short:
388             list_join:
389             - '.'
390             - - {get_attr: [{{role}}, name]}
391               - ctlplane
392
393   PreNetworkConfig:
394     type: OS::TripleO::{{role}}::PreNetworkConfig
395     properties:
396       server: {get_resource: {{role}}}
397
398   NetworkDeployment:
399     type: OS::TripleO::SoftwareDeployment
400     depends_on: PreNetworkConfig
401     properties:
402       name: NetworkDeployment
403       config: {get_resource: NetworkConfig}
404       server: {get_resource: {{role}}}
405       actions: {get_param: NetworkDeploymentActions}
406       input_values:
407         bridge_name: br-ex
408         interface_name: {get_param: NeutronPublicInterface}
409       actions:
410         if:
411           - server_not_blacklisted
412           - {get_param: NetworkDeploymentActions}
413           - []
414
415   {{role}}UpgradeInitConfig:
416     type: OS::Heat::SoftwareConfig
417     properties:
418       group: script
419       config:
420         list_join:
421         - ''
422         - - "#!/bin/bash\n\n"
423           - "if [[ -f /etc/resolv.conf.save ]] ; then rm /etc/resolv.conf.save; fi\n\n"
424           - get_param: UpgradeInitCommand
425           - get_param: UpgradeInitCommonCommand
426
427   # Note we may be able to make this conditional on UpgradeInitCommandNotEmpty
428   # but https://bugs.launchpad.net/heat/+bug/1649900 needs fixing first
429   {{role}}UpgradeInitDeployment:
430     type: OS::Heat::SoftwareDeployment
431     depends_on: NetworkDeployment
432     properties:
433       name: {{role}}UpgradeInitDeployment
434       server: {get_resource: {{role}}}
435       config: {get_resource: {{role}}UpgradeInitConfig}
436       actions:
437         if:
438           - server_not_blacklisted
439           - ['CREATE', 'UPDATE']
440           - []
441
442   {{role}}Deployment:
443     type: OS::Heat::StructuredDeployment
444     depends_on: {{role}}UpgradeInitDeployment
445     properties:
446       name: {{role}}Deployment
447       config: {get_resource: {{role}}Config}
448       server: {get_resource: {{role}}}
449       input_values:
450         enable_package_upgrade: {get_attr: [UpdateDeployment, update_managed_packages]}
451       actions:
452         if:
453           - server_not_blacklisted
454           - ['CREATE', 'UPDATE']
455           - []
456
457   {{role}}Config:
458     type: OS::Heat::StructuredConfig
459     properties:
460       group: hiera
461       config:
462         hierarchy:
463           - '"%{::uuid}"'
464           - heat_config_%{::deploy_config_name}
465           - config_step
466           - {{role.lower()}}_extraconfig
467           - extraconfig
468           - service_names
469           - service_configs
470           - {{role.lower()}}
471           - bootstrap_node # provided by allNodesConfig
472           - all_nodes # provided by allNodesConfig
473           - vip_data # provided by allNodesConfig
474           - '"%{::osfamily}"'
475         merge_behavior: deeper
476         datafiles:
477           service_names:
478             service_names: {get_param: ServiceNames}
479             sensu::subscriptions: {get_param: MonitoringSubscriptions}
480           service_configs:
481             map_replace:
482               - {get_param: ServiceConfigSettings}
483               - values: {get_attr: [NetIpMap, net_ip_map]}
484           {{role.lower()}}_extraconfig: {get_param: {{role}}ExtraConfig}
485           extraconfig: {get_param: ExtraConfig}
486           {{role.lower()}}:
487             tripleo::packages::enable_upgrade: {get_input: enable_package_upgrade}
488             tripleo::profile::base::logging::fluentd::fluentd_sources: {get_param: LoggingSources}
489             tripleo::profile::base::logging::fluentd::fluentd_groups: {get_param: LoggingGroups}
490             fqdn_internal_api: {get_attr: [NetHostMap, value, internal_api, fqdn]}
491             fqdn_storage: {get_attr: [NetHostMap, value, storage, fqdn]}
492             fqdn_storage_mgmt: {get_attr: [NetHostMap, value, storage_mgmt, fqdn]}
493             fqdn_tenant: {get_attr: [NetHostMap, value, tenant, fqdn]}
494             fqdn_management: {get_attr: [NetHostMap, value, management, fqdn]}
495             fqdn_ctlplane: {get_attr: [NetHostMap, value, ctlplane, fqdn]}
496             fqdn_external: {get_attr: [NetHostMap, value, external, fqdn]}
497
498   # Resource for site-specific injection of root certificate
499   NodeTLSCAData:
500     depends_on: {{role}}Deployment
501     type: OS::TripleO::NodeTLSCAData
502     properties:
503       server: {get_resource: {{role}}}
504
505   # Hook for site-specific additional pre-deployment config, e.g extra hieradata
506   {{role}}ExtraConfigPre:
507     depends_on: {{role}}Deployment
508     type: OS::TripleO::{{role}}ExtraConfigPre
509     properties:
510         server: {get_resource: {{role}}}
511
512   # Hook for site-specific additional pre-deployment config,
513   # applying to all nodes, e.g node registration/unregistration
514   NodeExtraConfig:
515     depends_on: [{{role}}ExtraConfigPre, NodeTLSCAData]
516     type: OS::TripleO::NodeExtraConfig
517     properties:
518         server: {get_resource: {{role}}}
519
520   UpdateConfig:
521     type: OS::TripleO::Tasks::PackageUpdate
522
523   UpdateDeployment:
524     type: OS::Heat::SoftwareDeployment
525     depends_on: NetworkDeployment
526     properties:
527       name: UpdateDeployment
528       config: {get_resource: UpdateConfig}
529       server: {get_resource: {{role}}}
530       input_values:
531         update_identifier:
532           get_param: UpdateIdentifier
533       actions:
534         if:
535           - server_not_blacklisted
536           - ['CREATE', 'UPDATE']
537           - []
538
539   SshHostPubKey:
540     type: OS::TripleO::Ssh::HostPubKey
541     depends_on: {{role}}Deployment
542     properties:
543         server: {get_resource: {{role}}}
544
545 outputs:
546   ip_address:
547     description: IP address of the server in the ctlplane network
548     value: {get_attr: [{{role}}, networks, ctlplane, 0]}
549   hostname:
550     description: Hostname of the server
551     value: {get_attr: [{{role}}, name]}
552   hostname_map:
553     description: Mapping of network names to hostnames
554     value:
555       external: {get_attr: [NetHostMap, value, external, fqdn]}
556       internal_api: {get_attr: [NetHostMap, value, internal_api, fqdn]}
557       storage: {get_attr: [NetHostMap, value, storage, fqdn]}
558       storage_mgmt: {get_attr: [NetHostMap, value, storage_mgmt, fqdn]}
559       tenant: {get_attr: [NetHostMap, value, tenant, fqdn]}
560       management: {get_attr: [NetHostMap, value, management, fqdn]}
561       ctlplane: {get_attr: [NetHostMap, value, ctlplane, fqdn]}
562   hosts_entry:
563     value:
564       str_replace:
565         template: |
566           PRIMARYIP PRIMARYHOST.DOMAIN PRIMARYHOST
567           EXTERNALIP EXTERNALHOST.DOMAIN EXTERNALHOST
568           INTERNAL_APIIP INTERNAL_APIHOST.DOMAIN INTERNAL_APIHOST
569           STORAGEIP STORAGEHOST.DOMAIN STORAGEHOST
570           STORAGE_MGMTIP STORAGE_MGMTHOST.DOMAIN STORAGE_MGMTHOST
571           TENANTIP TENANTHOST.DOMAIN TENANTHOST
572           MANAGEMENTIP MANAGEMENTHOST.DOMAIN MANAGEMENTHOST
573           CTLPLANEIP CTLPLANEHOST.DOMAIN CTLPLANEHOST
574         params:
575           PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, {{role}}HostnameResolveNetwork]}]}
576           DOMAIN: {get_param: CloudDomain}
577           PRIMARYHOST: {get_attr: [{{role}}, name]}
578           EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
579           EXTERNALHOST: {get_attr: [NetHostMap, value, external, short]}
580           INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
581           INTERNAL_APIHOST: {get_attr: [NetHostMap, value, internal_api, short]}
582           STORAGEIP: {get_attr: [StoragePort, ip_address]}
583           STORAGEHOST: {get_attr: [NetHostMap, value, storage, short]}
584           STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
585           STORAGE_MGMTHOST: {get_attr: [NetHostMap, value, storage_mgmt, short]}
586           TENANTIP: {get_attr: [TenantPort, ip_address]}
587           TENANTHOST: {get_attr: [NetHostMap, value, tenant, short]}
588           MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
589           MANAGEMENTHOST: {get_attr: [NetHostMap, value, management, short]}
590           CTLPLANEIP: {get_attr: [{{role}}, networks, ctlplane, 0]}
591           CTLPLANEHOST: {get_attr: [NetHostMap, value, ctlplane, short]}
592   known_hosts_entry:
593     description: Entry for ssh known hosts
594     value:
595       str_replace:
596         template: "PRIMARYIP,PRIMARYHOST.DOMAIN,PRIMARYHOST,\
597 EXTERNALIP,EXTERNALHOST.DOMAIN,EXTERNALHOST,\
598 INTERNAL_APIIP,INTERNAL_APIHOST.DOMAIN,INTERNAL_APIHOST,\
599 STORAGEIP,STORAGEHOST.DOMAIN,STORAGEHOST,\
600 STORAGE_MGMTIP,STORAGE_MGMTHOST.DOMAIN,STORAGE_MGMTHOST,\
601 TENANTIP,TENANTHOST.DOMAIN,TENANTHOST,\
602 MANAGEMENTIP,MANAGEMENTHOST.DOMAIN,MANAGEMENTHOST,\
603 CTLPLANEIP,CTLPLANEHOST.DOMAIN,CTLPLANEHOST HOSTSSHPUBKEY"
604         params:
605           PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, {{role}}HostnameResolveNetwork]}]}
606           DOMAIN: {get_param: CloudDomain}
607           PRIMARYHOST: {get_attr: [{{role}}, name]}
608           EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
609           EXTERNALHOST: {get_attr: [NetHostMap, value, external, short]}
610           INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
611           INTERNAL_APIHOST: {get_attr: [NetHostMap, value, internal_api, short]}
612           STORAGEIP: {get_attr: [StoragePort, ip_address]}
613           STORAGEHOST: {get_attr: [NetHostMap, value, storage, short]}
614           STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
615           STORAGE_MGMTHOST: {get_attr: [NetHostMap, value, storage_mgmt, short]}
616           TENANTIP: {get_attr: [TenantPort, ip_address]}
617           TENANTHOST: {get_attr: [NetHostMap, value, tenant, short]}
618           MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
619           MANAGEMENTHOST: {get_attr: [NetHostMap, value, management, short]}
620           CTLPLANEIP: {get_attr: [{{role}}, networks, ctlplane, 0]}
621           CTLPLANEHOST: {get_attr: [NetHostMap, value, ctlplane, short]}
622           HOSTSSHPUBKEY: {get_attr: [SshHostPubKey, ecdsa]}
623   nova_server_resource:
624     description: Heat resource handle for {{role}} server
625     value:
626       {get_resource: {{role}}}
627     condition: server_not_blacklisted
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]}