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