bundlewrap/bundles/zfs/metadata.py

140 lines
4.4 KiB
Python

import re
defaults = {
'cron': {
'zfs-auto-snapshot-daily': '0 0 * * * root /usr/local/sbin/zfs-auto-snapshot daily',
'zfs-auto-snapshot-hourly': '0 * * * * root /usr/local/sbin/zfs-auto-snapshot hourly',
'zfs-auto-snapshot-monthly': '0 0 1 * * root /usr/local/sbin/zfs-auto-snapshot monthly',
'zfs-auto-snapshot-weekly': '0 0 * * 7 root /usr/local/sbin/zfs-auto-snapshot weekly',
},
'zfs': {
'datasets': {},
'pools': {},
'snapshots': {
# 'backup': {
# 'enabled': True,
# 'filesystems_with_snapshot': {},
# },
'retain_defaults': {
'hourly': 24,
'daily': 7,
'weekly': 2,
'monthly': 1,
},
},
},
}
#if node.has_bundle('telegraf'):
# defaults.update({
# 'telegraf': {
# 'input_plugins': {
# 'exec': {
# 'zfs_dataset': {
# 'command': 'telegraf-zfs-dataset',
# 'interval': '120s',
# },
# },
# 'zfs': {},
# },
# },
# })
# defaults['sudo']['verbatim'].add('telegraf ALL=(ALL) NOPASSWD:/sbin/zfs list *')
if node.has_bundle('sshmon'):
defaults.update({
'icinga2_api': {
'zfs': {
'services': {
'ZFS AUTO SNAPSHOT': {
'command_on_monitored_host': '/usr/lib/nagios/plugins/check_zfs_auto_snapshot',
},
'ZFS MOUNTED VOLUMES': {
'command_on_monitored_host': '/usr/lib/nagios/plugins/check_zfs_volumes',
},
},
},
},
})
@metadata_reactor
def zfs_scrub_cronjob(metadata):
when = metadata.get('zfs/scrub/cron', '{} 0 * * sun'.format((node.magic_number % 60)))
return {
'cron': {
'zfs-scrub': '{} root /usr/lib/zfs-linux/scrub'.format(when),
},
}
# TODO
#@metadata_reactor
#def zfs_snapshot_backup(metadata):
# if metadata.get('zfs/snapshots/backup/enabled'):
# # Collect all filesystems/datasets (e.g., "tank/mysql") which
# # are configured for (local) snapshots. For each of them, store
# # the mountpoint. This information will be used primarily by
# # "/usr/local/sbin/zfs-backup-snapshot", but may also be used by
# # other bundles (think backup tools).
# #
# # In other words, this API allows other bundles to check whether
# # a path belongs to a ZFS dataset with snapshots enabled.
#
# filesystems = {}
#
# if metadata.get('zfs/snapshots/snapshot_only', None) is not None:
# for name in metadata.get('zfs/snapshots/snapshot_only'):
# attrs = metadata.get('zfs/datasets')[name]
# if attrs.get('mountpoint') not in (None, "none"):
# filesystems[name] = attrs['mountpoint']
# else:
# for name, attrs in metadata.get('zfs/datasets').items():
# if attrs.get('mountpoint') not in (None, "none"):
# filesystems[name] = attrs['mountpoint']
#
# for pattern in metadata.get('zfs/snapshots/snapshot_never', set()):
# filesystems = {k: v for k, v in filesystems.items() if not re.search(pattern, k)}
#
# return {
# 'zfs': {
# 'snapshots': {
# 'backup': {
# 'filesystems_with_snapshot': filesystems,
# },
# },
# },
# }
# else:
# return {}
@metadata_reactor
def monitoring(metadata):
if not node.has_bundle('sshmon'):
raise DoNotRunAgain
services = {}
for poolname, pool_options in metadata.get('zfs/pools').items():
services['ZFS ZPOOL ONLINE {}'.format(poolname)] = {
'command_on_monitored_host': 'sudo /usr/lib/nagios/plugins/check_zpool_online {}'.format(poolname),
}
services['ZFS ZPOOL SPACE ' + poolname] = {
'command_on_monitored_host': 'sudo /usr/lib/nagios/plugins/check_zpool_space {} 90'.format(poolname)
}
services['ZFS OLD SNAPSHOTS'] = {
'command_on_monitored_host': 'sudo /usr/lib/nagios/plugins/check_zfs_old_snapshots',
}
return {
'icinga2_api': {
'zfs': {
'services': services,
},
},
}