Add new Pure Storage module to discover facts for FlashBlade (#41673)
Facts that can be discovered are: - all - minimum - config - performance - capacity - network - subnets - lags - filesystems - snapshots
This commit is contained in:
parent
390a08c781
commit
9bf12ee1c0
1 changed files with 652 additions and 0 deletions
652
lib/ansible/modules/storage/purestorage/purefb_facts.py
Normal file
652
lib/ansible/modules/storage/purestorage/purefb_facts.py
Normal file
|
@ -0,0 +1,652 @@
|
||||||
|
#!/usr/bin/python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# (c) 2018, Simon Dodsley (simon@purestorage.com)
|
||||||
|
# GNU General Public License v3.0+ (see COPYING or
|
||||||
|
# https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||||
|
|
||||||
|
from __future__ import absolute_import, division, print_function
|
||||||
|
__metaclass__ = type
|
||||||
|
|
||||||
|
ANSIBLE_METADATA = {'metadata_version': '1.1',
|
||||||
|
'status': ['preview'],
|
||||||
|
'supported_by': 'community'}
|
||||||
|
|
||||||
|
DOCUMENTATION = r'''
|
||||||
|
---
|
||||||
|
module: purefb_facts
|
||||||
|
version_added: '2.7'
|
||||||
|
short_description: Collect facts from Pure Storage FlashBlade
|
||||||
|
description:
|
||||||
|
- Collect facts information from a Pure Storage FlashBlade running the
|
||||||
|
Purity//FB operating system. By default, the module will collect basic
|
||||||
|
fact information including hosts, host groups, protection
|
||||||
|
groups and volume counts. Additional fact information can be collected
|
||||||
|
based on the configured set of arguements.
|
||||||
|
author:
|
||||||
|
- Simon Dodsley (@sdodsley)
|
||||||
|
options:
|
||||||
|
gather_subset:
|
||||||
|
description:
|
||||||
|
- When supplied, this argument will define the facts to be collected.
|
||||||
|
Possible values for this include all, minimum, config, performance,
|
||||||
|
capacity, network, subnets, lags, filesystems and snapshots.
|
||||||
|
required: false
|
||||||
|
default: minimum
|
||||||
|
extends_documentation_fragment:
|
||||||
|
- purestorage.fb
|
||||||
|
'''
|
||||||
|
|
||||||
|
EXAMPLES = r'''
|
||||||
|
- name: collect default set of facts
|
||||||
|
purefb_facts:
|
||||||
|
fb_url: 10.10.10.2
|
||||||
|
api_token: T-55a68eb5-c785-4720-a2ca-8b03903bf641
|
||||||
|
|
||||||
|
- name: collect configuration and capacity facts
|
||||||
|
purefb_facts:
|
||||||
|
gather_subset:
|
||||||
|
- config
|
||||||
|
- capacity
|
||||||
|
fb_url: 10.10.10.2
|
||||||
|
api_token: T-55a68eb5-c785-4720-a2ca-8b03903bf641
|
||||||
|
|
||||||
|
- name: collect all facts
|
||||||
|
purefb_facts:
|
||||||
|
gather_subset:
|
||||||
|
- all
|
||||||
|
fb_url: 10.10.10.2
|
||||||
|
api_token: T-55a68eb5-c785-4720-a2ca-8b03903bf641
|
||||||
|
'''
|
||||||
|
|
||||||
|
RETURN = r'''
|
||||||
|
ansible_facts:
|
||||||
|
description: Returns the facts collected from the FlashBlade
|
||||||
|
returned: always
|
||||||
|
type: complex
|
||||||
|
contains:
|
||||||
|
"capacity": {
|
||||||
|
"aggregate": {
|
||||||
|
"data_reduction": 1.1179228,
|
||||||
|
"snapshots": 0,
|
||||||
|
"total_physical": 17519748439,
|
||||||
|
"unique": 17519748439,
|
||||||
|
"virtual": 19585726464
|
||||||
|
},
|
||||||
|
"file-system": {
|
||||||
|
"data_reduction": 1.3642412,
|
||||||
|
"snapshots": 0,
|
||||||
|
"total_physical": 4748219708,
|
||||||
|
"unique": 4748219708,
|
||||||
|
"virtual": 6477716992
|
||||||
|
},
|
||||||
|
"object-store": {
|
||||||
|
"data_reduction": 1.0263462,
|
||||||
|
"snapshots": 0,
|
||||||
|
"total_physical": 12771528731,
|
||||||
|
"unique": 12771528731,
|
||||||
|
"virtual": 6477716992
|
||||||
|
},
|
||||||
|
"total": 83359896948925
|
||||||
|
}
|
||||||
|
"config": {
|
||||||
|
"alert_watchers": {
|
||||||
|
"enabled": true,
|
||||||
|
"name": "notify@acmestorage.com"
|
||||||
|
},
|
||||||
|
"array_management": {
|
||||||
|
"base_dn": null,
|
||||||
|
"bind_password": null,
|
||||||
|
"bind_user": null,
|
||||||
|
"enabled": false,
|
||||||
|
"name": "management",
|
||||||
|
"services": [
|
||||||
|
"management"
|
||||||
|
],
|
||||||
|
"uris": []
|
||||||
|
},
|
||||||
|
"directory_service_roles": {
|
||||||
|
"array_admin": {
|
||||||
|
"group": null,
|
||||||
|
"group_base": null
|
||||||
|
},
|
||||||
|
"ops_admin": {
|
||||||
|
"group": null,
|
||||||
|
"group_base": null
|
||||||
|
},
|
||||||
|
"readonly": {
|
||||||
|
"group": null,
|
||||||
|
"group_base": null
|
||||||
|
},
|
||||||
|
"storage_admin": {
|
||||||
|
"group": null,
|
||||||
|
"group_base": null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"dns": {
|
||||||
|
"domain": "demo.acmestorage.com",
|
||||||
|
"name": "demo-fb-1",
|
||||||
|
"nameservers": [
|
||||||
|
"8.8.8.8"
|
||||||
|
],
|
||||||
|
"search": [
|
||||||
|
"demo.acmestorage.com"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"nfs_directory_service": {
|
||||||
|
"base_dn": null,
|
||||||
|
"bind_password": null,
|
||||||
|
"bind_user": null,
|
||||||
|
"enabled": false,
|
||||||
|
"name": "nfs",
|
||||||
|
"services": [
|
||||||
|
"nfs"
|
||||||
|
],
|
||||||
|
"uris": []
|
||||||
|
},
|
||||||
|
"ntp": [
|
||||||
|
"0.ntp.pool.org"
|
||||||
|
],
|
||||||
|
"smb_directory_service": {
|
||||||
|
"base_dn": null,
|
||||||
|
"bind_password": null,
|
||||||
|
"bind_user": null,
|
||||||
|
"enabled": false,
|
||||||
|
"name": "smb",
|
||||||
|
"services": [
|
||||||
|
"smb"
|
||||||
|
],
|
||||||
|
"uris": []
|
||||||
|
},
|
||||||
|
"smtp": {
|
||||||
|
"name": "demo-fb-1",
|
||||||
|
"relay_host": null,
|
||||||
|
"sender_domain": "acmestorage.com"
|
||||||
|
},
|
||||||
|
"ssl_certs": {
|
||||||
|
"certificate": "-----BEGIN CERTIFICATE-----\n\n-----END CERTIFICATE-----",
|
||||||
|
"common_name": "Acme Storage",
|
||||||
|
"country": "US",
|
||||||
|
"email": null,
|
||||||
|
"intermediate_certificate": null,
|
||||||
|
"issued_by": "Acme Storage",
|
||||||
|
"issued_to": "Acme Storage",
|
||||||
|
"key_size": 4096,
|
||||||
|
"locality": null,
|
||||||
|
"name": "global",
|
||||||
|
"organization": "Acme Storage",
|
||||||
|
"organizational_unit": "Acme Storage",
|
||||||
|
"passphrase": null,
|
||||||
|
"private_key": null,
|
||||||
|
"state": null,
|
||||||
|
"status": "self-signed",
|
||||||
|
"valid_from": "1508433967000",
|
||||||
|
"valid_to": "2458833967000"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"default": {
|
||||||
|
"blades": 15,
|
||||||
|
"buckets": 7,
|
||||||
|
"filesystems": 2,
|
||||||
|
"flashblade_name": "demo-fb-1",
|
||||||
|
"object_store_accounts": 1,
|
||||||
|
"object_store_users": 1,
|
||||||
|
"purity_version": "2.2.0",
|
||||||
|
"snapshots": 1,
|
||||||
|
"total_capacity": 83359896948925
|
||||||
|
}
|
||||||
|
"filesystems": {
|
||||||
|
"k8s-pvc-d24b1357-579e-11e8-811f-ecf4bbc88f54": {
|
||||||
|
"destroyed": false,
|
||||||
|
"fast_remove": false,
|
||||||
|
"hard_limit": true,
|
||||||
|
"nfs_rules": "*(rw,no_root_squash)",
|
||||||
|
"provisioned": 21474836480,
|
||||||
|
"snapshot_enabled": false
|
||||||
|
},
|
||||||
|
"z": {
|
||||||
|
"destroyed": false,
|
||||||
|
"fast_remove": false,
|
||||||
|
"hard_limit": false,
|
||||||
|
"provisioned": 1073741824,
|
||||||
|
"snapshot_enabled": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"lag": {
|
||||||
|
"uplink": {
|
||||||
|
"lag_speed": 0,
|
||||||
|
"port_speed": 40000000000,
|
||||||
|
"ports": [
|
||||||
|
{
|
||||||
|
"name": "CH1.FM1.ETH1.1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "CH1.FM1.ETH1.2"
|
||||||
|
},
|
||||||
|
],
|
||||||
|
"status": "healthy"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"network": {
|
||||||
|
"fm1.admin0": {
|
||||||
|
"address": "10.10.100.6",
|
||||||
|
"gateway": "10.10.100.1",
|
||||||
|
"mtu": 1500,
|
||||||
|
"netmask": "255.255.255.0",
|
||||||
|
"services": [
|
||||||
|
"support"
|
||||||
|
],
|
||||||
|
"type": "vip",
|
||||||
|
"vlan": 2200
|
||||||
|
},
|
||||||
|
"fm2.admin0": {
|
||||||
|
"address": "10.10.100.7",
|
||||||
|
"gateway": "10.10.100.1",
|
||||||
|
"mtu": 1500,
|
||||||
|
"netmask": "255.255.255.0",
|
||||||
|
"services": [
|
||||||
|
"support"
|
||||||
|
],
|
||||||
|
"type": "vip",
|
||||||
|
"vlan": 2200
|
||||||
|
},
|
||||||
|
"nfs1": {
|
||||||
|
"address": "10.10.100.4",
|
||||||
|
"gateway": "10.10.100.1",
|
||||||
|
"mtu": 1500,
|
||||||
|
"netmask": "255.255.255.0",
|
||||||
|
"services": [
|
||||||
|
"data"
|
||||||
|
],
|
||||||
|
"type": "vip",
|
||||||
|
"vlan": 2200
|
||||||
|
},
|
||||||
|
"vir0": {
|
||||||
|
"address": "10.10.100.5",
|
||||||
|
"gateway": "10.10.100.1",
|
||||||
|
"mtu": 1500,
|
||||||
|
"netmask": "255.255.255.0",
|
||||||
|
"services": [
|
||||||
|
"management"
|
||||||
|
],
|
||||||
|
"type": "vip",
|
||||||
|
"vlan": 2200
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"performance": {
|
||||||
|
"aggregate": {
|
||||||
|
"bytes_per_op": 0,
|
||||||
|
"bytes_per_read": 0,
|
||||||
|
"bytes_per_write": 0,
|
||||||
|
"read_bytes_per_sec": 0,
|
||||||
|
"reads_per_sec": 0,
|
||||||
|
"usec_per_other_op": 0,
|
||||||
|
"usec_per_read_op": 0,
|
||||||
|
"usec_per_write_op": 0,
|
||||||
|
"write_bytes_per_sec": 0,
|
||||||
|
"writes_per_sec": 0
|
||||||
|
},
|
||||||
|
"http": {
|
||||||
|
"bytes_per_op": 0,
|
||||||
|
"bytes_per_read": 0,
|
||||||
|
"bytes_per_write": 0,
|
||||||
|
"read_bytes_per_sec": 0,
|
||||||
|
"reads_per_sec": 0,
|
||||||
|
"usec_per_other_op": 0,
|
||||||
|
"usec_per_read_op": 0,
|
||||||
|
"usec_per_write_op": 0,
|
||||||
|
"write_bytes_per_sec": 0,
|
||||||
|
"writes_per_sec": 0
|
||||||
|
},
|
||||||
|
"nfs": {
|
||||||
|
"bytes_per_op": 0,
|
||||||
|
"bytes_per_read": 0,
|
||||||
|
"bytes_per_write": 0,
|
||||||
|
"read_bytes_per_sec": 0,
|
||||||
|
"reads_per_sec": 0,
|
||||||
|
"usec_per_other_op": 0,
|
||||||
|
"usec_per_read_op": 0,
|
||||||
|
"usec_per_write_op": 0,
|
||||||
|
"write_bytes_per_sec": 0,
|
||||||
|
"writes_per_sec": 0
|
||||||
|
},
|
||||||
|
"s3": {
|
||||||
|
"bytes_per_op": 0,
|
||||||
|
"bytes_per_read": 0,
|
||||||
|
"bytes_per_write": 0,
|
||||||
|
"read_bytes_per_sec": 0,
|
||||||
|
"reads_per_sec": 0,
|
||||||
|
"usec_per_other_op": 0,
|
||||||
|
"usec_per_read_op": 0,
|
||||||
|
"usec_per_write_op": 0,
|
||||||
|
"write_bytes_per_sec": 0,
|
||||||
|
"writes_per_sec": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"snapshots": {
|
||||||
|
"z.188": {
|
||||||
|
"destroyed": false,
|
||||||
|
"source": "z",
|
||||||
|
"source_destroyed": false,
|
||||||
|
"suffix": "188"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"subnet": {
|
||||||
|
"new-mgmt": {
|
||||||
|
"gateway": "10.10.100.1",
|
||||||
|
"interfaces": [
|
||||||
|
{
|
||||||
|
"name": "fm1.admin0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "fm2.admin0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "nfs1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "vir0"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"lag": "uplink",
|
||||||
|
"mtu": 1500,
|
||||||
|
"prefix": "10.10.100.0/24",
|
||||||
|
"services": [
|
||||||
|
"data",
|
||||||
|
"management",
|
||||||
|
"support"
|
||||||
|
],
|
||||||
|
"vlan": 2200
|
||||||
|
}
|
||||||
|
}
|
||||||
|
'''
|
||||||
|
|
||||||
|
|
||||||
|
from ansible.module_utils.basic import AnsibleModule
|
||||||
|
from ansible.module_utils.pure import get_blade, purefb_argument_spec
|
||||||
|
|
||||||
|
|
||||||
|
MIN_REQUIRED_API_VERSION = '1.3'
|
||||||
|
HARD_LIMIT_API_VERSION = '1.4'
|
||||||
|
|
||||||
|
|
||||||
|
def generate_default_dict(blade):
|
||||||
|
default_facts = {}
|
||||||
|
defaults = blade.arrays.list_arrays().items[0]
|
||||||
|
default_facts['flashblade_name'] = defaults.name
|
||||||
|
default_facts['purity_version'] = defaults.version
|
||||||
|
default_facts['filesystems'] = \
|
||||||
|
len(blade.file_systems.list_file_systems().items)
|
||||||
|
default_facts['snapshots'] = \
|
||||||
|
len(blade.file_system_snapshots.list_file_system_snapshots().items)
|
||||||
|
default_facts['buckets'] = len(blade.buckets.list_buckets().items)
|
||||||
|
default_facts['object_store_users'] = \
|
||||||
|
len(blade.object_store_users.list_object_store_users().items)
|
||||||
|
default_facts['object_store_accounts'] = \
|
||||||
|
len(blade.object_store_accounts.list_object_store_accounts().items)
|
||||||
|
default_facts['blades'] = len(blade.blade.list_blades().items)
|
||||||
|
default_facts['total_capacity'] = \
|
||||||
|
blade.arrays.list_arrays_space().items[0].capacity
|
||||||
|
return default_facts
|
||||||
|
|
||||||
|
|
||||||
|
def generate_perf_dict(blade):
|
||||||
|
perf_facts = {}
|
||||||
|
total_perf = blade.arrays.list_arrays_performance()
|
||||||
|
http_perf = blade.arrays.list_arrays_performance(protocol='http')
|
||||||
|
s3_perf = blade.arrays.list_arrays_performance(protocol='s3')
|
||||||
|
nfs_perf = blade.arrays.list_arrays_performance(protocol='nfs')
|
||||||
|
perf_facts['aggregate'] = {
|
||||||
|
'bytes_per_op': total_perf.items[0].bytes_per_op,
|
||||||
|
'bytes_per_read': total_perf.items[0].bytes_per_read,
|
||||||
|
'bytes_per_write': total_perf.items[0].bytes_per_write,
|
||||||
|
'read_bytes_per_sec': total_perf.items[0].read_bytes_per_sec,
|
||||||
|
'reads_per_sec': total_perf.items[0].reads_per_sec,
|
||||||
|
'usec_per_other_op': total_perf.items[0].usec_per_other_op,
|
||||||
|
'usec_per_read_op': total_perf.items[0].usec_per_read_op,
|
||||||
|
'usec_per_write_op': total_perf.items[0].usec_per_write_op,
|
||||||
|
'write_bytes_per_sec': total_perf.items[0].write_bytes_per_sec,
|
||||||
|
'writes_per_sec': total_perf.items[0].writes_per_sec,
|
||||||
|
}
|
||||||
|
perf_facts['http'] = {
|
||||||
|
'bytes_per_op': http_perf.items[0].bytes_per_op,
|
||||||
|
'bytes_per_read': http_perf.items[0].bytes_per_read,
|
||||||
|
'bytes_per_write': http_perf.items[0].bytes_per_write,
|
||||||
|
'read_bytes_per_sec': http_perf.items[0].read_bytes_per_sec,
|
||||||
|
'reads_per_sec': http_perf.items[0].reads_per_sec,
|
||||||
|
'usec_per_other_op': http_perf.items[0].usec_per_other_op,
|
||||||
|
'usec_per_read_op': http_perf.items[0].usec_per_read_op,
|
||||||
|
'usec_per_write_op': http_perf.items[0].usec_per_write_op,
|
||||||
|
'write_bytes_per_sec': http_perf.items[0].write_bytes_per_sec,
|
||||||
|
'writes_per_sec': http_perf.items[0].writes_per_sec,
|
||||||
|
}
|
||||||
|
perf_facts['s3'] = {
|
||||||
|
'bytes_per_op': s3_perf.items[0].bytes_per_op,
|
||||||
|
'bytes_per_read': s3_perf.items[0].bytes_per_read,
|
||||||
|
'bytes_per_write': s3_perf.items[0].bytes_per_write,
|
||||||
|
'read_bytes_per_sec': s3_perf.items[0].read_bytes_per_sec,
|
||||||
|
'reads_per_sec': s3_perf.items[0].reads_per_sec,
|
||||||
|
'usec_per_other_op': s3_perf.items[0].usec_per_other_op,
|
||||||
|
'usec_per_read_op': s3_perf.items[0].usec_per_read_op,
|
||||||
|
'usec_per_write_op': s3_perf.items[0].usec_per_write_op,
|
||||||
|
'write_bytes_per_sec': s3_perf.items[0].write_bytes_per_sec,
|
||||||
|
'writes_per_sec': s3_perf.items[0].writes_per_sec,
|
||||||
|
}
|
||||||
|
perf_facts['nfs'] = {
|
||||||
|
'bytes_per_op': nfs_perf.items[0].bytes_per_op,
|
||||||
|
'bytes_per_read': nfs_perf.items[0].bytes_per_read,
|
||||||
|
'bytes_per_write': nfs_perf.items[0].bytes_per_write,
|
||||||
|
'read_bytes_per_sec': nfs_perf.items[0].read_bytes_per_sec,
|
||||||
|
'reads_per_sec': nfs_perf.items[0].reads_per_sec,
|
||||||
|
'usec_per_other_op': nfs_perf.items[0].usec_per_other_op,
|
||||||
|
'usec_per_read_op': nfs_perf.items[0].usec_per_read_op,
|
||||||
|
'usec_per_write_op': nfs_perf.items[0].usec_per_write_op,
|
||||||
|
'write_bytes_per_sec': nfs_perf.items[0].write_bytes_per_sec,
|
||||||
|
'writes_per_sec': nfs_perf.items[0].writes_per_sec,
|
||||||
|
}
|
||||||
|
|
||||||
|
return perf_facts
|
||||||
|
|
||||||
|
|
||||||
|
def generate_config_dict(blade):
|
||||||
|
config_facts = {}
|
||||||
|
config_facts['dns'] = blade.dns.list_dns().items[0].to_dict()
|
||||||
|
config_facts['smtp'] = blade.smtp.list_smtp().items[0].to_dict()
|
||||||
|
config_facts['alert_watchers'] = \
|
||||||
|
blade.alert_watchers.list_alert_watchers().items[0].to_dict()
|
||||||
|
api_version = blade.api_version.list_versions().versions
|
||||||
|
if HARD_LIMIT_API_VERSION in api_version:
|
||||||
|
config_facts['array_management'] = \
|
||||||
|
blade.directory_services.list_directory_services(names=['management']).items[0].to_dict()
|
||||||
|
config_facts['directory_service_roles'] = {}
|
||||||
|
roles = blade.directory_services.list_directory_services_roles()
|
||||||
|
for role in range(0, len(roles.items)):
|
||||||
|
role_name = roles.items[role].name
|
||||||
|
config_facts['directory_service_roles'][role_name] = {
|
||||||
|
'group': roles.items[role].group,
|
||||||
|
'group_base': roles.items[role].group_base
|
||||||
|
}
|
||||||
|
config_facts['nfs_directory_service'] = \
|
||||||
|
blade.directory_services.list_directory_services(names=['nfs']).items[0].to_dict()
|
||||||
|
config_facts['smb_directory_service'] = \
|
||||||
|
blade.directory_services.list_directory_services(names=['smb']).items[0].to_dict()
|
||||||
|
config_facts['ntp'] = blade.arrays.list_arrays().items[0].ntp_servers
|
||||||
|
config_facts['ssl_certs'] = \
|
||||||
|
blade.certificates.list_certificates().items[0].to_dict()
|
||||||
|
return config_facts
|
||||||
|
|
||||||
|
|
||||||
|
def generate_subnet_dict(blade):
|
||||||
|
sub_facts = {}
|
||||||
|
subnets = blade.subnets.list_subnets()
|
||||||
|
for sub in range(0, len(subnets.items)):
|
||||||
|
sub_name = subnets.items[sub].name
|
||||||
|
if subnets.items[sub].enabled:
|
||||||
|
sub_facts[sub_name] = {
|
||||||
|
'gateway': subnets.items[sub].gateway,
|
||||||
|
'mtu': subnets.items[sub].mtu,
|
||||||
|
'vlan': subnets.items[sub].vlan,
|
||||||
|
'prefix': subnets.items[sub].prefix,
|
||||||
|
'services': subnets.items[sub].services,
|
||||||
|
}
|
||||||
|
sub_facts[sub_name]['lag'] = subnets.items[sub].link_aggregation_group.name
|
||||||
|
sub_facts[sub_name]['interfaces'] = []
|
||||||
|
for iface in range(0, len(subnets.items[sub].interfaces)):
|
||||||
|
sub_facts[sub_name]['interfaces'].append({'name': subnets.items[sub].interfaces[iface].name})
|
||||||
|
return sub_facts
|
||||||
|
|
||||||
|
|
||||||
|
def generate_lag_dict(blade):
|
||||||
|
lag_facts = {}
|
||||||
|
groups = blade.link_aggregation_groups.list_link_aggregation_groups()
|
||||||
|
for groupcnt in range(0, len(groups.items)):
|
||||||
|
lag_name = groups.items[groupcnt].name
|
||||||
|
lag_facts[lag_name] = {
|
||||||
|
'lag_speed': groups.items[groupcnt].lag_speed,
|
||||||
|
'port_speed': groups.items[groupcnt].port_speed,
|
||||||
|
'status': groups.items[groupcnt].status,
|
||||||
|
}
|
||||||
|
lag_facts[lag_name]['ports'] = []
|
||||||
|
for port in range(0, len(groups.items[groupcnt].ports)):
|
||||||
|
lag_facts[lag_name]['ports'].append({'name': groups.items[groupcnt].ports[port].name})
|
||||||
|
return lag_facts
|
||||||
|
|
||||||
|
|
||||||
|
def generate_network_dict(blade):
|
||||||
|
net_facts = {}
|
||||||
|
ports = blade.network_interfaces.list_network_interfaces()
|
||||||
|
for portcnt in range(0, len(ports.items)):
|
||||||
|
int_name = ports.items[portcnt].name
|
||||||
|
if ports.items[portcnt].enabled:
|
||||||
|
net_facts[int_name] = {
|
||||||
|
'type': ports.items[portcnt].type,
|
||||||
|
'mtu': ports.items[portcnt].mtu,
|
||||||
|
'vlan': ports.items[portcnt].vlan,
|
||||||
|
'address': ports.items[portcnt].address,
|
||||||
|
'services': ports.items[portcnt].services,
|
||||||
|
'gateway': ports.items[portcnt].gateway,
|
||||||
|
'netmask': ports.items[portcnt].netmask,
|
||||||
|
}
|
||||||
|
return net_facts
|
||||||
|
|
||||||
|
|
||||||
|
def generate_capacity_dict(blade):
|
||||||
|
capacity_facts = {}
|
||||||
|
total_cap = blade.arrays.list_arrays_space()
|
||||||
|
file_cap = blade.arrays.list_arrays_space(type='file-system')
|
||||||
|
object_cap = blade.arrays.list_arrays_space(type='object-store')
|
||||||
|
capacity_facts['total'] = total_cap.items[0].capacity
|
||||||
|
capacity_facts['aggregate'] = {
|
||||||
|
'data_reduction': total_cap.items[0].space.data_reduction,
|
||||||
|
'snapshots': total_cap.items[0].space.snapshots,
|
||||||
|
'total_physical': total_cap.items[0].space.total_physical,
|
||||||
|
'unique': total_cap.items[0].space.unique,
|
||||||
|
'virtual': total_cap.items[0].space.virtual,
|
||||||
|
}
|
||||||
|
capacity_facts['file-system'] = {
|
||||||
|
'data_reduction': file_cap.items[0].space.data_reduction,
|
||||||
|
'snapshots': file_cap.items[0].space.snapshots,
|
||||||
|
'total_physical': file_cap.items[0].space.total_physical,
|
||||||
|
'unique': file_cap.items[0].space.unique,
|
||||||
|
'virtual': file_cap.items[0].space.virtual,
|
||||||
|
}
|
||||||
|
capacity_facts['object-store'] = {
|
||||||
|
'data_reduction': object_cap.items[0].space.data_reduction,
|
||||||
|
'snapshots': object_cap.items[0].space.snapshots,
|
||||||
|
'total_physical': object_cap.items[0].space.total_physical,
|
||||||
|
'unique': object_cap.items[0].space.unique,
|
||||||
|
'virtual': file_cap.items[0].space.virtual,
|
||||||
|
}
|
||||||
|
|
||||||
|
return capacity_facts
|
||||||
|
|
||||||
|
|
||||||
|
def generate_snap_dict(blade):
|
||||||
|
snap_facts = {}
|
||||||
|
snaps = blade.file_system_snapshots.list_file_system_snapshots()
|
||||||
|
for snap in range(0, len(snaps.items)):
|
||||||
|
snapshot = snaps.items[snap].name
|
||||||
|
snap_facts[snapshot] = {
|
||||||
|
'destroyed': snaps.items[snap].destroyed,
|
||||||
|
'source': snaps.items[snap].source,
|
||||||
|
'suffix': snaps.items[snap].suffix,
|
||||||
|
'source_destroyed': snaps.items[snap].source_destroyed,
|
||||||
|
}
|
||||||
|
return snap_facts
|
||||||
|
|
||||||
|
|
||||||
|
def generate_fs_dict(blade):
|
||||||
|
fs_facts = {}
|
||||||
|
fsys = blade.file_systems.list_file_systems()
|
||||||
|
for fsystem in range(0, len(fsys.items)):
|
||||||
|
share = fsys.items[fsystem].name
|
||||||
|
fs_facts[share] = {
|
||||||
|
'fast_remove': fsys.items[fsystem].fast_remove_directory_enabled,
|
||||||
|
'snapshot_enabled': fsys.items[fsystem].snapshot_directory_enabled,
|
||||||
|
'provisioned': fsys.items[fsystem].provisioned,
|
||||||
|
'destroyed': fsys.items[fsystem].destroyed,
|
||||||
|
}
|
||||||
|
if fsys.items[fsystem].http.enabled:
|
||||||
|
fs_facts[share]['http'] = fsys.items[fsystem].http.enabled
|
||||||
|
if fsys.items[fsystem].smb.enabled:
|
||||||
|
fs_facts[share]['smb_mode'] = fsys.items[fsystem].smb.acl_mode
|
||||||
|
if fsys.items[fsystem].nfs.enabled:
|
||||||
|
fs_facts[share]['nfs_rules'] = fsys.items[fsystem].nfs.rules
|
||||||
|
api_version = blade.api_version.list_versions().versions
|
||||||
|
if HARD_LIMIT_API_VERSION in api_version:
|
||||||
|
fs_facts[share]['hard_limit'] = fsys.items[fsystem].hard_limit_enabled
|
||||||
|
|
||||||
|
return fs_facts
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
argument_spec = purefb_argument_spec()
|
||||||
|
argument_spec.update(dict(
|
||||||
|
gather_subset=dict(default='minimum', type='list',)
|
||||||
|
))
|
||||||
|
|
||||||
|
module = AnsibleModule(argument_spec, supports_check_mode=True)
|
||||||
|
|
||||||
|
blade = get_blade(module)
|
||||||
|
versions = blade.api_version.list_versions().versions
|
||||||
|
|
||||||
|
if MIN_REQUIRED_API_VERSION not in versions:
|
||||||
|
module.fail_json(msg='FlashBlade REST version not supported. Minimum version required: {0}'.format(MIN_REQUIRED_API_VERSION))
|
||||||
|
|
||||||
|
subset = [test.lower() for test in module.params['gather_subset']]
|
||||||
|
valid_subsets = ('all', 'minimum', 'config', 'performance', 'capacity',
|
||||||
|
'network', 'subnets', 'lags',
|
||||||
|
'filesystems', 'snapshots')
|
||||||
|
subset_test = (test in valid_subsets for test in subset)
|
||||||
|
if not all(subset_test):
|
||||||
|
module.fail_json(msg="value must gather_subset must be one or more of: %s, got: %s"
|
||||||
|
% (",".join(valid_subsets), ",".join(subset)))
|
||||||
|
|
||||||
|
facts = {}
|
||||||
|
|
||||||
|
if 'minimum' in subset or 'all' in subset:
|
||||||
|
facts['default'] = generate_default_dict(blade)
|
||||||
|
if 'performance' in subset or 'all' in subset:
|
||||||
|
facts['performance'] = generate_perf_dict(blade)
|
||||||
|
if 'config' in subset or 'all' in subset:
|
||||||
|
facts['config'] = generate_config_dict(blade)
|
||||||
|
if 'capacity' in subset or 'all' in subset:
|
||||||
|
facts['capacity'] = generate_capacity_dict(blade)
|
||||||
|
if 'lags' in subset or 'all' in subset:
|
||||||
|
facts['lag'] = generate_lag_dict(blade)
|
||||||
|
if 'network' in subset or 'all' in subset:
|
||||||
|
facts['network'] = generate_network_dict(blade)
|
||||||
|
if 'subnets' in subset or 'all' in subset:
|
||||||
|
facts['subnet'] = generate_subnet_dict(blade)
|
||||||
|
if 'filesystems' in subset or 'all' in subset:
|
||||||
|
facts['filesystems'] = generate_fs_dict(blade)
|
||||||
|
if 'snapshots' in subset or 'all' in subset:
|
||||||
|
facts['snapshots'] = generate_snap_dict(blade)
|
||||||
|
|
||||||
|
result = dict(ansible_purefb_facts=facts,)
|
||||||
|
|
||||||
|
module.exit_json(**result)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
Loading…
Reference in a new issue