вторник, 15 марта 2016 г.

Python скрипт для мониторинга дискового пространства занимаемого ZFS снапшотами

Помимо основной работы, я подрабатываю фрилансером: администрирование, Python, Java программирование.
Так вот, захотел клиент знать сколько места занимают ZFS снапшоты, для того чтоб контролировать дисковое пространство. Исследование вопроса показало, что инструмента для получения конкретного результата в стандартных средствах нет.
Можно посмотреть сколько занимают снапшоты конкретной файловой системы, можно посмотреть размер для каждого снапшота, а вот конкретно для всех нет. Плюс он захотел знать сколько занимают снапшоты за день (постановка вопроса, конечно не верная, ибо размер снапшота величина не постоянная, но тем не менее).
На сервере снапшоты создаются автоматически с помощью утилиты zfsnap, в имени снапшота присутствует дата.


Родился скрипт, почему Python? - потому, что он есть везде и с одинаковым синтаксисом.
Собственно скрипт:

#!/usr/bin/env python2                                                                                                                                                                                                                   
# -*- coding: utf8 -*-                                                                                                                                                                                                                   
import subprocess,os,re,sys                                                                                                                                                                                                              
from datetime import datetime 
my_dict={'b':1,'K':1024,'M':1048576,'G':1073741824} #Словарь единиц измерения
# Проверяем командную строку на наличие параметра
# если параметра нет обрабатываем вывод: zfs list -o space | awk '{print$4}'                                                                                                                                                                                                                                    
if len(sys.argv)==1:
    snap_size_src_str=subprocess.check_output("zfs list -o space | awk '{print$4}'",shell=True)                                                                                                                                          
    date_string=datetime.strftime(datetime.today(), "%Y.%m.%d %H:%M:%S")                                                                                                                                                                 
else:     # параметр есть обрабатываем вывод: zfs list -t snapshot | grep "+параметр+"| awk '{print$2}'                                                                                                                                                                                                                             
    date_string=str(sys.argv[1])                                                                                                                                                                                                         
    snap_size_src_str=subprocess.check_output("zfs list -t snapshot | grep "+date_string+"| awk '{print$2}'",shell=True)                                                                                                                 
size_list=snap_size_src_str.split("\n")                                                                                                                                                                                                  
size_list.pop(0)                                                                                                                                                                                                                         
size_snapshot=0.0                                                                                                                                                                                                                        
for i in size_list: # сумируем непустые значения                                                                                                                                                                                                                   
    if len(i)!=0 and i[len(i)-1] in my_dict:                                                                                                                                                                                             
        size_snapshot+= float(i[:len(i)-1:])*my_dict[i[len(i)-1]]                                                                                                                                                                        
    elif len(i)!=0:                                                                                                                                                                                                                      
        size_snapshot+= float(i)                                                                                                                                                                                                         
if size_snapshot >= 1073741824:   # Переводим из байт в кило/мега/гиго                                                                                                                                                                                                        
    sz="G"                                                                                                                                                                                                                               
elif size_snapshot >= 1048576:                                                                                                                                                                                                             
    sz="M"                                                                                                                                                                                                                               
elif size_snapshot >= 1024:                                                                                                                                                                                                                
    sz="K"                                                                                                                                                                                                                               
else:                                                                                                                                                                                                                                    
    sz="b"      # Выводим результат переведя в удобоваримые единицы и округлив до 2х знаков после запятой                                                                                                                                                                                                                     
print date_string," ",str(round(size_snapshot/int(my_dict[sz]),2))+sz             

Скрипт без параметров показывает весь объем пространства, занимаемый снапшотами, запущенный с параметром в виде  гггг-мм-дд выводит объем снапшотов в имени которого есть эта дата. На самом деле маска может быть любой - по сути парсится вывод комманды:

zfs list -t snapshot | grep "+date_string+"| awk '{print$2}'"

где date_string - ваш параметр.
В общем то и все.   Буду рад, если кому то пригодится.

Комментариев нет:

Отправить комментарий