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