Add missing xinetd/rsync container for Swift
[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           - config_step
435           - ceph_extraconfig
436           - extraconfig
437           - service_names
438           - service_configs
439           - ceph
440           - bootstrap_node # provided by allNodesConfig
441           - all_nodes # provided by allNodesConfig
442           - vip_data # provided by allNodesConfig
443           - '"%{::osfamily}"'
444         merge_behavior: deeper
445         datafiles:
446           service_names:
447             service_names: {get_param: ServiceNames}
448             sensu::subscriptions: {get_param: MonitoringSubscriptions}
449           service_configs:
450             map_replace:
451               - {get_param: ServiceConfigSettings}
452               - values: {get_attr: [NetIpMap, net_ip_map]}
453           ceph_extraconfig: {get_param: CephStorageExtraConfig}
454           extraconfig: {get_param: ExtraConfig}
455           ceph:
456             tripleo::packages::enable_upgrade: {get_input: enable_package_upgrade}
457             fqdn_internal_api: {get_attr: [NetHostMap, value, internal_api, fqdn]}
458             fqdn_storage: {get_attr: [NetHostMap, value, storage, fqdn]}
459             fqdn_storage_mgmt: {get_attr: [NetHostMap, value, storage_mgmt, fqdn]}
460             fqdn_tenant: {get_attr: [NetHostMap, value, tenant, fqdn]}
461             fqdn_management: {get_attr: [NetHostMap, value, management, fqdn]}
462             fqdn_ctlplane: {get_attr: [NetHostMap, value, ctlplane, fqdn]}
463
464   # Resource for site-specific injection of root certificate
465   NodeTLSCAData:
466     depends_on: CephStorageDeployment
467     type: OS::TripleO::NodeTLSCAData
468     properties:
469       server: {get_resource: CephStorage}
470
471   # Hook for site-specific additional pre-deployment config, e.g extra hieradata
472   CephStorageExtraConfigPre:
473     depends_on: CephStorageDeployment
474     type: OS::TripleO::CephStorageExtraConfigPre
475     properties:
476         server: {get_resource: CephStorage}
477
478   # Hook for site-specific additional pre-deployment config,
479   # applying to all nodes, e.g node registration/unregistration
480   NodeExtraConfig:
481     depends_on: [CephStorageExtraConfigPre, NodeTLSCAData]
482     type: OS::TripleO::NodeExtraConfig
483     properties:
484         server: {get_resource: CephStorage}
485
486   UpdateConfig:
487     type: OS::TripleO::Tasks::PackageUpdate
488
489   UpdateDeployment:
490     type: OS::Heat::SoftwareDeployment
491     depends_on: NetworkDeployment
492     condition: server_not_blacklisted
493     properties:
494       config: {get_resource: UpdateConfig}
495       server: {get_resource: CephStorage}
496       input_values:
497         update_identifier:
498           get_param: UpdateIdentifier
499
500   SshHostPubKey:
501     type: OS::TripleO::Ssh::HostPubKey
502     depends_on: CephStorageDeployment
503     properties:
504         server: {get_resource: CephStorage}
505
506 outputs:
507   ip_address:
508     description: IP address of the server in the ctlplane network
509     value: {get_attr: [CephStorage, networks, ctlplane, 0]}
510   hostname:
511     description: Hostname of the server
512     value: {get_attr: [CephStorage, name]}
513   hostname_map:
514     description: Mapping of network names to hostnames
515     value:
516       external: {get_attr: [NetHostMap, value, external, fqdn]}
517       internal_api: {get_attr: [NetHostMap, value, internal_api, fqdn]}
518       storage: {get_attr: [NetHostMap, value, storage, fqdn]}
519       storage_mgmt: {get_attr: [NetHostMap, value, storage_mgmt, fqdn]}
520       tenant: {get_attr: [NetHostMap, value, tenant, fqdn]}
521       management: {get_attr: [NetHostMap, value, management, fqdn]}
522       ctlplane: {get_attr: [NetHostMap, value, ctlplane, fqdn]}
523   hosts_entry:
524     value:
525       str_replace:
526         template: |
527           PRIMARYIP PRIMARYHOST.DOMAIN PRIMARYHOST
528           EXTERNALIP EXTERNALHOST.DOMAIN EXTERNALHOST
529           INTERNAL_APIIP INTERNAL_APIHOST.DOMAIN INTERNAL_APIHOST
530           STORAGEIP STORAGEHOST.DOMAIN STORAGEHOST
531           STORAGE_MGMTIP STORAGE_MGMTHOST.DOMAIN STORAGE_MGMTHOST
532           TENANTIP TENANTHOST.DOMAIN TENANTHOST
533           MANAGEMENTIP MANAGEMENTHOST.DOMAIN MANAGEMENTHOST
534           CTLPLANEIP CTLPLANEHOST.DOMAIN CTLPLANEHOST
535         params:
536           PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, CephStorageHostnameResolveNetwork]}]}
537           DOMAIN: {get_param: CloudDomain}
538           PRIMARYHOST: {get_attr: [CephStorage, name]}
539           EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
540           EXTERNALHOST: {get_attr: [NetHostMap, value, external, short]}
541           INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
542           INTERNAL_APIHOST: {get_attr: [NetHostMap, value, internal_api, short]}
543           STORAGEIP: {get_attr: [StoragePort, ip_address]}
544           STORAGEHOST: {get_attr: [NetHostMap, value, storage, short]}
545           STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
546           STORAGE_MGMTHOST: {get_attr: [NetHostMap, value, storage_mgmt, short]}
547           TENANTIP: {get_attr: [TenantPort, ip_address]}
548           TENANTHOST: {get_attr: [NetHostMap, value, tenant, short]}
549           MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
550           MANAGEMENTHOST: {get_attr: [NetHostMap, value, management, short]}
551           CTLPLANEIP: {get_attr: [CephStorage, networks, ctlplane, 0]}
552           CTLPLANEHOST: {get_attr: [NetHostMap, value, ctlplane, short]}
553   known_hosts_entry:
554     description: Entry for ssh known hosts
555     value:
556       str_replace:
557         template: "PRIMARYIP,PRIMARYHOST.DOMAIN,PRIMARYHOST,\
558 EXTERNALIP,EXTERNALHOST.DOMAIN,EXTERNALHOST,\
559 INTERNAL_APIIP,INTERNAL_APIHOST.DOMAIN,INTERNAL_APIHOST,\
560 STORAGEIP,STORAGEHOST.DOMAIN,STORAGEHOST,\
561 STORAGE_MGMTIP,STORAGE_MGMTHOST.DOMAIN,STORAGE_MGMTHOST,\
562 TENANTIP,TENANTHOST.DOMAIN,TENANTHOST,\
563 MANAGEMENTIP,MANAGEMENTHOST.DOMAIN,MANAGEMENTHOST,\
564 CTLPLANEIP,CTLPLANEHOST.DOMAIN,CTLPLANEHOST HOSTSSHPUBKEY"
565         params:
566           PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, CephStorageHostnameResolveNetwork]}]}
567           DOMAIN: {get_param: CloudDomain}
568           PRIMARYHOST: {get_attr: [CephStorage, name]}
569           EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
570           EXTERNALHOST: {get_attr: [NetHostMap, value, external, short]}
571           INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
572           INTERNAL_APIHOST: {get_attr: [NetHostMap, value, internal_api, short]}
573           STORAGEIP: {get_attr: [StoragePort, ip_address]}
574           STORAGEHOST: {get_attr: [NetHostMap, value, storage, short]}
575           STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
576           STORAGE_MGMTHOST: {get_attr: [NetHostMap, value, storage_mgmt, short]}
577           TENANTIP: {get_attr: [TenantPort, ip_address]}
578           TENANTHOST: {get_attr: [NetHostMap, value, tenant, short]}
579           MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
580           MANAGEMENTHOST: {get_attr: [NetHostMap, value, management, short]}
581           CTLPLANEIP: {get_attr: [CephStorage, networks, ctlplane, 0]}
582           CTLPLANEHOST: {get_attr: [NetHostMap, value, ctlplane, short]}
583           HOSTSSHPUBKEY: {get_attr: [SshHostPubKey, ecdsa]}
584   nova_server_resource:
585     description: Heat resource handle for the ceph storage server
586     value:
587       {get_resource: CephStorage}
588     condition: server_not_blacklisted
589   external_ip_address:
590     description: IP address of the server in the external network
591     value: {get_attr: [ExternalPort, ip_address]}
592   internal_api_ip_address:
593     description: IP address of the server in the internal_api network
594     value: {get_attr: [InternalApiPort, ip_address]}
595   storage_ip_address:
596     description: IP address of the server in the storage network
597     value: {get_attr: [StoragePort, ip_address]}
598   storage_mgmt_ip_address:
599     description: IP address of the server in the storage_mgmt network
600     value: {get_attr: [StorageMgmtPort, ip_address]}
601   tenant_ip_address:
602     description: IP address of the server in the tenant network
603     value: {get_attr: [TenantPort, ip_address]}
604   management_ip_address:
605     description: IP address of the server in the management network
606     value: {get_attr: [ManagementPort, ip_address]}