Merge "Fixup for manila-api containerized service"
[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 must match the
89       overcloud_domain_name configured on the undercloud.
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       deployment_actions: {get_attr: [DeploymentActions, value]}
403
404   NetworkDeployment:
405     type: OS::TripleO::SoftwareDeployment
406     depends_on: PreNetworkConfig
407     properties:
408       name: NetworkDeployment
409       config: {get_resource: NetworkConfig}
410       server: {get_resource: {{role}}}
411       actions: {get_param: NetworkDeploymentActions}
412       input_values:
413         bridge_name: br-ex
414         interface_name: {get_param: NeutronPublicInterface}
415       actions:
416         if:
417           - server_not_blacklisted
418           - {get_param: NetworkDeploymentActions}
419           - []
420
421   {{role}}UpgradeInitConfig:
422     type: OS::Heat::SoftwareConfig
423     properties:
424       group: script
425       config:
426         list_join:
427         - ''
428         - - "#!/bin/bash\n\n"
429           - "if [[ -f /etc/resolv.conf.save ]] ; then rm /etc/resolv.conf.save; fi\n\n"
430           - get_param: UpgradeInitCommand
431           - get_param: UpgradeInitCommonCommand
432
433   # Note we may be able to make this conditional on UpgradeInitCommandNotEmpty
434   # but https://bugs.launchpad.net/heat/+bug/1649900 needs fixing first
435   {{role}}UpgradeInitDeployment:
436     type: OS::Heat::SoftwareDeployment
437     depends_on: NetworkDeployment
438     properties:
439       name: {{role}}UpgradeInitDeployment
440       server: {get_resource: {{role}}}
441       config: {get_resource: {{role}}UpgradeInitConfig}
442       actions:
443         if:
444           - server_not_blacklisted
445           - ['CREATE', 'UPDATE']
446           - []
447
448   {{role}}Deployment:
449     type: OS::Heat::StructuredDeployment
450     depends_on: {{role}}UpgradeInitDeployment
451     properties:
452       name: {{role}}Deployment
453       config: {get_resource: {{role}}Config}
454       server: {get_resource: {{role}}}
455       input_values:
456         enable_package_upgrade: {get_attr: [UpdateDeployment, update_managed_packages]}
457       actions:
458         if:
459           - server_not_blacklisted
460           - ['CREATE', 'UPDATE']
461           - []
462
463   {{role}}Config:
464     type: OS::Heat::StructuredConfig
465     properties:
466       group: hiera
467       config:
468         hierarchy:
469           - '"%{::uuid}"'
470           - heat_config_%{::deploy_config_name}
471           - config_step
472           - {{role.lower()}}_extraconfig
473           - extraconfig
474           - service_names
475           - service_configs
476           - {{role.lower()}}
477           - bootstrap_node # provided by allNodesConfig
478           - all_nodes # provided by allNodesConfig
479           - vip_data # provided by allNodesConfig
480           - '"%{::osfamily}"'
481         merge_behavior: deeper
482         datafiles:
483           service_names:
484             service_names: {get_param: ServiceNames}
485             sensu::subscriptions: {get_param: MonitoringSubscriptions}
486           service_configs:
487             map_replace:
488               - {get_param: ServiceConfigSettings}
489               - values: {get_attr: [NetIpMap, net_ip_map]}
490           {{role.lower()}}_extraconfig: {get_param: {{role}}ExtraConfig}
491           extraconfig: {get_param: ExtraConfig}
492           {{role.lower()}}:
493             tripleo::packages::enable_upgrade: {get_input: enable_package_upgrade}
494             tripleo::profile::base::logging::fluentd::fluentd_sources: {get_param: LoggingSources}
495             tripleo::profile::base::logging::fluentd::fluentd_groups: {get_param: LoggingGroups}
496             fqdn_internal_api: {get_attr: [NetHostMap, value, internal_api, fqdn]}
497             fqdn_storage: {get_attr: [NetHostMap, value, storage, fqdn]}
498             fqdn_storage_mgmt: {get_attr: [NetHostMap, value, storage_mgmt, fqdn]}
499             fqdn_tenant: {get_attr: [NetHostMap, value, tenant, fqdn]}
500             fqdn_management: {get_attr: [NetHostMap, value, management, fqdn]}
501             fqdn_ctlplane: {get_attr: [NetHostMap, value, ctlplane, fqdn]}
502             fqdn_external: {get_attr: [NetHostMap, value, external, fqdn]}
503
504   # Resource for site-specific injection of root certificate
505   NodeTLSCAData:
506     depends_on: {{role}}Deployment
507     type: OS::TripleO::NodeTLSCAData
508     properties:
509       server: {get_resource: {{role}}}
510
511   # Hook for site-specific additional pre-deployment config, e.g extra hieradata
512   {{role}}ExtraConfigPre:
513     depends_on: {{role}}Deployment
514     type: OS::TripleO::{{role}}ExtraConfigPre
515     # We have to use conditions here so that we don't break backwards
516     # compatibility with templates everywhere
517     condition: server_not_blacklisted
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     # We have to use conditions here so that we don't break backwards
527     # compatibility with templates everywhere
528     condition: server_not_blacklisted
529     properties:
530         server: {get_resource: {{role}}}
531
532   UpdateConfig:
533     type: OS::TripleO::Tasks::PackageUpdate
534
535   UpdateDeployment:
536     type: OS::Heat::SoftwareDeployment
537     depends_on: NetworkDeployment
538     properties:
539       name: UpdateDeployment
540       config: {get_resource: UpdateConfig}
541       server: {get_resource: {{role}}}
542       input_values:
543         update_identifier:
544           get_param: UpdateIdentifier
545       actions:
546         if:
547           - server_not_blacklisted
548           - ['CREATE', 'UPDATE']
549           - []
550
551   DeploymentActions:
552     type: OS::Heat::Value
553     properties:
554       value:
555         if:
556           - server_not_blacklisted
557           - ['CREATE', 'UPDATE']
558           - []
559
560   SshHostPubKey:
561     type: OS::TripleO::Ssh::HostPubKey
562     depends_on: {{role}}Deployment
563     properties:
564         server: {get_resource: {{role}}}
565         deployment_actions: {get_attr: [DeploymentActions, value]}
566
567 outputs:
568   ip_address:
569     description: IP address of the server in the ctlplane network
570     value: {get_attr: [{{role}}, networks, ctlplane, 0]}
571   hostname:
572     description: Hostname of the server
573     value: {get_attr: [{{role}}, name]}
574   hostname_map:
575     description: Mapping of network names to hostnames
576     value:
577       external: {get_attr: [NetHostMap, value, external, fqdn]}
578       internal_api: {get_attr: [NetHostMap, value, internal_api, fqdn]}
579       storage: {get_attr: [NetHostMap, value, storage, fqdn]}
580       storage_mgmt: {get_attr: [NetHostMap, value, storage_mgmt, fqdn]}
581       tenant: {get_attr: [NetHostMap, value, tenant, fqdn]}
582       management: {get_attr: [NetHostMap, value, management, fqdn]}
583       ctlplane: {get_attr: [NetHostMap, value, ctlplane, fqdn]}
584   hosts_entry:
585     value:
586       str_replace:
587         template: |
588           PRIMARYIP PRIMARYHOST.DOMAIN PRIMARYHOST
589           EXTERNALIP EXTERNALHOST.DOMAIN EXTERNALHOST
590           INTERNAL_APIIP INTERNAL_APIHOST.DOMAIN INTERNAL_APIHOST
591           STORAGEIP STORAGEHOST.DOMAIN STORAGEHOST
592           STORAGE_MGMTIP STORAGE_MGMTHOST.DOMAIN STORAGE_MGMTHOST
593           TENANTIP TENANTHOST.DOMAIN TENANTHOST
594           MANAGEMENTIP MANAGEMENTHOST.DOMAIN MANAGEMENTHOST
595           CTLPLANEIP CTLPLANEHOST.DOMAIN CTLPLANEHOST
596         params:
597           PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, {{role}}HostnameResolveNetwork]}]}
598           DOMAIN: {get_param: CloudDomain}
599           PRIMARYHOST: {get_attr: [{{role}}, name]}
600           EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
601           EXTERNALHOST: {get_attr: [NetHostMap, value, external, short]}
602           INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
603           INTERNAL_APIHOST: {get_attr: [NetHostMap, value, internal_api, short]}
604           STORAGEIP: {get_attr: [StoragePort, ip_address]}
605           STORAGEHOST: {get_attr: [NetHostMap, value, storage, short]}
606           STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
607           STORAGE_MGMTHOST: {get_attr: [NetHostMap, value, storage_mgmt, short]}
608           TENANTIP: {get_attr: [TenantPort, ip_address]}
609           TENANTHOST: {get_attr: [NetHostMap, value, tenant, short]}
610           MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
611           MANAGEMENTHOST: {get_attr: [NetHostMap, value, management, short]}
612           CTLPLANEIP: {get_attr: [{{role}}, networks, ctlplane, 0]}
613           CTLPLANEHOST: {get_attr: [NetHostMap, value, ctlplane, short]}
614   known_hosts_entry:
615     description: Entry for ssh known hosts
616     value:
617       str_replace:
618         template: "PRIMARYIP,PRIMARYHOST.DOMAIN,PRIMARYHOST,\
619 EXTERNALIP,EXTERNALHOST.DOMAIN,EXTERNALHOST,\
620 INTERNAL_APIIP,INTERNAL_APIHOST.DOMAIN,INTERNAL_APIHOST,\
621 STORAGEIP,STORAGEHOST.DOMAIN,STORAGEHOST,\
622 STORAGE_MGMTIP,STORAGE_MGMTHOST.DOMAIN,STORAGE_MGMTHOST,\
623 TENANTIP,TENANTHOST.DOMAIN,TENANTHOST,\
624 MANAGEMENTIP,MANAGEMENTHOST.DOMAIN,MANAGEMENTHOST,\
625 CTLPLANEIP,CTLPLANEHOST.DOMAIN,CTLPLANEHOST HOSTSSHPUBKEY"
626         params:
627           PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, {{role}}HostnameResolveNetwork]}]}
628           DOMAIN: {get_param: CloudDomain}
629           PRIMARYHOST: {get_attr: [{{role}}, name]}
630           EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
631           EXTERNALHOST: {get_attr: [NetHostMap, value, external, short]}
632           INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
633           INTERNAL_APIHOST: {get_attr: [NetHostMap, value, internal_api, short]}
634           STORAGEIP: {get_attr: [StoragePort, ip_address]}
635           STORAGEHOST: {get_attr: [NetHostMap, value, storage, short]}
636           STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
637           STORAGE_MGMTHOST: {get_attr: [NetHostMap, value, storage_mgmt, short]}
638           TENANTIP: {get_attr: [TenantPort, ip_address]}
639           TENANTHOST: {get_attr: [NetHostMap, value, tenant, short]}
640           MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
641           MANAGEMENTHOST: {get_attr: [NetHostMap, value, management, short]}
642           CTLPLANEIP: {get_attr: [{{role}}, networks, ctlplane, 0]}
643           CTLPLANEHOST: {get_attr: [NetHostMap, value, ctlplane, short]}
644           HOSTSSHPUBKEY: {get_attr: [SshHostPubKey, ecdsa]}
645   nova_server_resource:
646     description: Heat resource handle for {{role}} server
647     value:
648       {get_resource: {{role}}}
649     condition: server_not_blacklisted
650   external_ip_address:
651     description: IP address of the server in the external network
652     value: {get_attr: [ExternalPort, ip_address]}
653   internal_api_ip_address:
654     description: IP address of the server in the internal_api network
655     value: {get_attr: [InternalApiPort, ip_address]}
656   storage_ip_address:
657     description: IP address of the server in the storage network
658     value: {get_attr: [StoragePort, ip_address]}
659   storage_mgmt_ip_address:
660     description: IP address of the server in the storage_mgmt network
661     value: {get_attr: [StorageMgmtPort, ip_address]}
662   tenant_ip_address:
663     description: IP address of the server in the tenant network
664     value: {get_attr: [TenantPort, ip_address]}
665   management_ip_address:
666     description: IP address of the server in the management network
667     value: {get_attr: [ManagementPort, ip_address]}