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, }, }, }