Use Deployment actions for blacklist
[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     properties:
386       name: NetworkDeployment
387       config: {get_resource: NetworkConfig}
388       server: {get_resource: CephStorage}
389       actions:
390         if:
391           - server_not_blacklisted
392           - {get_param: NetworkDeploymentActions}
393           - []
394
395   CephStorageUpgradeInitConfig:
396     type: OS::Heat::SoftwareConfig
397     properties:
398       group: script
399       config:
400         list_join:
401         - ''
402         - - "#!/bin/bash\n\n"
403           - "if [[ -f /etc/resolv.conf.save ]] ; then rm /etc/resolv.conf.save; fi\n\n"
404           - get_param: UpgradeInitCommand
405           - get_param: UpgradeInitCommonCommand
406
407   # Note we may be able to make this conditional on UpgradeInitCommandNotEmpty
408   # but https://bugs.launchpad.net/heat/+bug/1649900 needs fixing first
409   CephStorageUpgradeInitDeployment:
410     type: OS::Heat::SoftwareDeployment
411     depends_on: NetworkDeployment
412     properties:
413       name: CephStorageUpgradeInitDeployment
414       server: {get_resource: CephStorage}
415       config: {get_resource: CephStorageUpgradeInitConfig}
416       actions:
417         if:
418           - server_not_blacklisted
419           - ['CREATE', 'UPDATE']
420           - []
421
422   CephStorageDeployment:
423     type: OS::Heat::StructuredDeployment
424     depends_on: CephStorageUpgradeInitDeployment
425     properties:
426       name: CephStorageDeployment
427       config: {get_resource: CephStorageConfig}
428       server: {get_resource: CephStorage}
429       input_values:
430         enable_package_upgrade: {get_attr: [UpdateDeployment, update_managed_packages]}
431       actions:
432         if:
433           - server_not_blacklisted
434           - ['CREATE', 'UPDATE']
435           - []
436
437   CephStorageConfig:
438     type: OS::Heat::StructuredConfig
439     properties:
440       group: hiera
441       config:
442         hierarchy:
443           - '"%{::uuid}"'
444           - heat_config_%{::deploy_config_name}
445           - ceph_extraconfig
446           - extraconfig
447           - service_names
448           - service_configs
449           - ceph
450           - bootstrap_node # provided by allNodesConfig
451           - all_nodes # provided by allNodesConfig
452           - vip_data # provided by allNodesConfig
453           - '"%{::osfamily}"'
454         merge_behavior: deeper
455         datafiles:
456           service_names:
457             service_names: {get_param: ServiceNames}
458             sensu::subscriptions: {get_param: MonitoringSubscriptions}
459           service_configs:
460             map_replace:
461               - {get_param: ServiceConfigSettings}
462               - values: {get_attr: [NetIpMap, net_ip_map]}
463           ceph_extraconfig: {get_param: CephStorageExtraConfig}
464           extraconfig: {get_param: ExtraConfig}
465           ceph:
466             tripleo::packages::enable_upgrade: {get_input: enable_package_upgrade}
467             fqdn_internal_api: {get_attr: [NetHostMap, value, internal_api, fqdn]}
468             fqdn_storage: {get_attr: [NetHostMap, value, storage, fqdn]}
469             fqdn_storage_mgmt: {get_attr: [NetHostMap, value, storage_mgmt, fqdn]}
470             fqdn_tenant: {get_attr: [NetHostMap, value, tenant, fqdn]}
471             fqdn_management: {get_attr: [NetHostMap, value, management, fqdn]}
472             fqdn_ctlplane: {get_attr: [NetHostMap, value, ctlplane, fqdn]}
473
474   # Resource for site-specific injection of root certificate
475   NodeTLSCAData:
476     depends_on: CephStorageDeployment
477     type: OS::TripleO::NodeTLSCAData
478     properties:
479       server: {get_resource: CephStorage}
480
481   # Hook for site-specific additional pre-deployment config, e.g extra hieradata
482   CephStorageExtraConfigPre:
483     depends_on: CephStorageDeployment
484     type: OS::TripleO::CephStorageExtraConfigPre
485     properties:
486         server: {get_resource: CephStorage}
487
488   # Hook for site-specific additional pre-deployment config,
489   # applying to all nodes, e.g node registration/unregistration
490   NodeExtraConfig:
491     depends_on: [CephStorageExtraConfigPre, NodeTLSCAData]
492     type: OS::TripleO::NodeExtraConfig
493     properties:
494         server: {get_resource: CephStorage}
495
496   UpdateConfig:
497     type: OS::TripleO::Tasks::PackageUpdate
498
499   UpdateDeployment:
500     type: OS::Heat::SoftwareDeployment
501     depends_on: NetworkDeployment
502     properties:
503       config: {get_resource: UpdateConfig}
504       server: {get_resource: CephStorage}
505       input_values:
506         update_identifier:
507           get_param: UpdateIdentifier
508       actions:
509         if:
510           - server_not_blacklisted
511           - ['CREATE', 'UPDATE']
512           - []
513
514   SshHostPubKey:
515     type: OS::TripleO::Ssh::HostPubKey
516     depends_on: CephStorageDeployment
517     properties:
518         server: {get_resource: CephStorage}
519
520 outputs:
521   ip_address:
522     description: IP address of the server in the ctlplane network
523     value: {get_attr: [CephStorage, networks, ctlplane, 0]}
524   hostname:
525     description: Hostname of the server
526     value: {get_attr: [CephStorage, name]}
527   hostname_map:
528     description: Mapping of network names to hostnames
529     value:
530       external: {get_attr: [NetHostMap, value, external, fqdn]}
531       internal_api: {get_attr: [NetHostMap, value, internal_api, fqdn]}
532       storage: {get_attr: [NetHostMap, value, storage, fqdn]}
533       storage_mgmt: {get_attr: [NetHostMap, value, storage_mgmt, fqdn]}
534       tenant: {get_attr: [NetHostMap, value, tenant, fqdn]}
535       management: {get_attr: [NetHostMap, value, management, fqdn]}
536       ctlplane: {get_attr: [NetHostMap, value, ctlplane, fqdn]}
537   hosts_entry:
538     value:
539       str_replace:
540         template: |
541           PRIMARYIP PRIMARYHOST.DOMAIN PRIMARYHOST
542           EXTERNALIP EXTERNALHOST.DOMAIN EXTERNALHOST
543           INTERNAL_APIIP INTERNAL_APIHOST.DOMAIN INTERNAL_APIHOST
544           STORAGEIP STORAGEHOST.DOMAIN STORAGEHOST
545           STORAGE_MGMTIP STORAGE_MGMTHOST.DOMAIN STORAGE_MGMTHOST
546           TENANTIP TENANTHOST.DOMAIN TENANTHOST
547           MANAGEMENTIP MANAGEMENTHOST.DOMAIN MANAGEMENTHOST
548           CTLPLANEIP CTLPLANEHOST.DOMAIN CTLPLANEHOST
549         params:
550           PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, CephStorageHostnameResolveNetwork]}]}
551           DOMAIN: {get_param: CloudDomain}
552           PRIMARYHOST: {get_attr: [CephStorage, name]}
553           EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
554           EXTERNALHOST: {get_attr: [NetHostMap, value, external, short]}
555           INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
556           INTERNAL_APIHOST: {get_attr: [NetHostMap, value, internal_api, short]}
557           STORAGEIP: {get_attr: [StoragePort, ip_address]}
558           STORAGEHOST: {get_attr: [NetHostMap, value, storage, short]}
559           STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
560           STORAGE_MGMTHOST: {get_attr: [NetHostMap, value, storage_mgmt, short]}
561           TENANTIP: {get_attr: [TenantPort, ip_address]}
562           TENANTHOST: {get_attr: [NetHostMap, value, tenant, short]}
563           MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
564           MANAGEMENTHOST: {get_attr: [NetHostMap, value, management, short]}
565           CTLPLANEIP: {get_attr: [CephStorage, networks, ctlplane, 0]}
566           CTLPLANEHOST: {get_attr: [NetHostMap, value, ctlplane, short]}
567   known_hosts_entry:
568     description: Entry for ssh known hosts
569     value:
570       str_replace:
571         template: "PRIMARYIP,PRIMARYHOST.DOMAIN,PRIMARYHOST,\
572 EXTERNALIP,EXTERNALHOST.DOMAIN,EXTERNALHOST,\
573 INTERNAL_APIIP,INTERNAL_APIHOST.DOMAIN,INTERNAL_APIHOST,\
574 STORAGEIP,STORAGEHOST.DOMAIN,STORAGEHOST,\
575 STORAGE_MGMTIP,STORAGE_MGMTHOST.DOMAIN,STORAGE_MGMTHOST,\
576 TENANTIP,TENANTHOST.DOMAIN,TENANTHOST,\
577 MANAGEMENTIP,MANAGEMENTHOST.DOMAIN,MANAGEMENTHOST,\
578 CTLPLANEIP,CTLPLANEHOST.DOMAIN,CTLPLANEHOST HOSTSSHPUBKEY"
579         params:
580           PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, CephStorageHostnameResolveNetwork]}]}
581           DOMAIN: {get_param: CloudDomain}
582           PRIMARYHOST: {get_attr: [CephStorage, name]}
583           EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
584           EXTERNALHOST: {get_attr: [NetHostMap, value, external, short]}
585           INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
586           INTERNAL_APIHOST: {get_attr: [NetHostMap, value, internal_api, short]}
587           STORAGEIP: {get_attr: [StoragePort, ip_address]}
588           STORAGEHOST: {get_attr: [NetHostMap, value, storage, short]}
589           STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
590           STORAGE_MGMTHOST: {get_attr: [NetHostMap, value, storage_mgmt, short]}
591           TENANTIP: {get_attr: [TenantPort, ip_address]}
592           TENANTHOST: {get_attr: [NetHostMap, value, tenant, short]}
593           MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
594           MANAGEMENTHOST: {get_attr: [NetHostMap, value, management, short]}
595           CTLPLANEIP: {get_attr: [CephStorage, networks, ctlplane, 0]}
596           CTLPLANEHOST: {get_attr: [NetHostMap, value, ctlplane, short]}
597           HOSTSSHPUBKEY: {get_attr: [SshHostPubKey, ecdsa]}
598   nova_server_resource:
599     description: Heat resource handle for the ceph storage server
600     value:
601       {get_resource: CephStorage}
602     condition: server_not_blacklisted
603   external_ip_address:
604     description: IP address of the server in the external network
605     value: {get_attr: [ExternalPort, ip_address]}
606   internal_api_ip_address:
607     description: IP address of the server in the internal_api network
608     value: {get_attr: [InternalApiPort, ip_address]}
609   storage_ip_address:
610     description: IP address of the server in the storage network
611     value: {get_attr: [StoragePort, ip_address]}
612   storage_mgmt_ip_address:
613     description: IP address of the server in the storage_mgmt network
614     value: {get_attr: [StorageMgmtPort, ip_address]}
615   tenant_ip_address:
616     description: IP address of the server in the tenant network
617     value: {get_attr: [TenantPort, ip_address]}
618   management_ip_address:
619     description: IP address of the server in the management network
620     value: {get_attr: [ManagementPort, ip_address]}