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