XTOOLS【运维平台】之本地&远程服务器磁盘容量校验(三)
目录
一、业务场景1.1 难点UI实现二、本地磁盘容量检验2.1 逻辑架构图2.2 代码逻辑2.3 伪代码2.4 难点三、远程磁盘容量检验3.1 逻辑架构图3.2 代码逻辑3.3 伪代码3.4 难点
一、业务场景
互联网爆炸时代,数据就是金钱,但过期数据如何有效定期压缩,为有效数据留下宝贵空间是很多业务遇到的问题。多数公司采用的方式如下:
shell
脚本以crontab
的方式定期压缩/删除/异地备份等方式解决空间不足的问题
中间过渡服务器临时处理有效数据,定期将数据同步至大数据服务器
DB和文本同时落地,压缩后定期更换新磁带,备份数据做冷备处理
但无论哪种数据,都会存在技术门槛较高
的问题,日积月累和人员不断迭代后容易出现的问题如下:
shell
脚本改动难度大,没人愿意承担升级改造风险,只能推倒重来或砍掉新需求
所有工作只能运维通过命令行的方式完成,初级运维无法快速上手
针对如上痛点,xtools平台提供了web化压缩功能,同时每次压缩前能够根据用户输入的目录检测目录对应挂载的磁盘
容量是否足够,避免压缩过程中
磁盘容量爆炸。
1.1 难点
1.2 UI实现
二、本地磁盘容量检验
本地磁盘容量主要通过shutil
模块实现,需要技巧的地方主要是如何以human的方式输出结果
2.1 逻辑架构图
《本地磁盘容量检验.png》
2.2 代码逻辑
用户在页面输入压缩包要存放的目录
shutil
模块底层逻辑自动判别目录对应的挂载磁盘,并返回统一单位
的total、used、free
容量大小
自定义磁盘容量使用阀值
计算磁盘已使用的容量,和自定义的阀值做比较
如果未达到则执行压缩进程,如达到或超过阀值,则返回警告warning
2.3 伪代码
# 以human的方式计算并输出磁盘容量
def gm_conversion(size, *args):
power = 2 ** 10
n = 0
power_n = {0: '', 1: 'KB', 2: 'MB', 3: 'GB', 4: 'TB', 5: 'PB', 6: 'EB'}
while size > power:
size /= power
n += 1
return size, power_n[n]
# 自定义阀值,并根据比较结果返回True或False
def usage_greater_than_max(usage, _max):
"""
:param usage: string. '70%'
:param _max: eg. '80%'
:return: True is disk space is low
"""
avail = int(usage.replace('%', ''))
_max = int(_max.replace('%', ''))
return True if avail > _max else False
# 定义磁盘容量过低时的返回信息
def is_lower():
"""
usage:
:return:
"""
info = {'warning': 'Disk space is lowwer then 20%'}
return info
# 计算磁盘容量,格式化指定位数的百分比容量
def disk_space_check_local(path, *args):
max_usage = '80%'
total_b, used_b, free_b = shutil.disk_usage(path)
total_h, total_unit = gm_conversion(total_b)
used_b, used_unit = gm_conversion(used_b)
free_b, free_unit = gm_conversion(free_b)
print('total_h: {:6.2f} {}, used_b: {:6.2f} {}, free_b: {:6.2f} {}'.format(total_h, total_unit, used_b, used_unit,
free_b, free_unit))
usage = format(used_b / total_b, '.0%')
# check disk space
flag = usage_greater_than_max(usage, max_usage)
# return total_h, total_unit, used_b, used_unit, free_b, free_unit
return flag
2.4 难点
以human的方式计算并输出磁盘容量
计算磁盘容量,格式化指定位数的百分比容量
三、远程磁盘容量检验
远程服务器因为python
版本的潜在不同,且不支持远程方式执行shutil
模块的方式,所以着实头疼了一阵子,最终通过传递执行脚本至远程服务器并返回执行结果在Master机计算结果的方式解决了该问题。
3.1 逻辑架构图
《远程服务器磁盘容量检验.png》
3.2 代码逻辑
用户输出压缩包对应的存放目录
生成带参数的python
脚本,通过Ansible scp
模块将py脚本传输至远程服务器临时目录
通过Ansible AdHoc
远程执行py脚本,并接受返回结果(total、used、free
)
在Master
机执行磁盘容量计算逻辑
自定义磁盘容量使用上限阀值
判断磁盘容量是否超过阀值
未超过,则执行压缩逻辑,超过返回WARNING
并退出
3.3 伪代码
#!/bin/env python
# 收集远程服务器磁盘容量信息
import os
import collections
import sys
def disk_usage(path='./'):
st = os.statvfs(path)
free = st.f_bavail * st.f_frsize
total = st.f_blocks * st.f_frsize
used = (st.f_blocks - st.f_bfree) * st.f_frsize
# _ntuple_diskusage = collections.namedtuple('usage', 'total used free')
return {'total': total, 'used': used, 'free': free}
# return _ntuple_diskusage(total, used, free)
# return {'total': total, 'used': used, 'free': free}
try:
input_path = sys.argv[0].strip()
usage = disk_usage(input_path)
print(usage)
except:
print({'message': 'PLZ input path'})
exit(400)
# 通过Ansible AdHoc传输脚本至远程服务器并执行结果
get_disk_usage = [
{'action': {'module': 'copy', 'args': 'src=apps/common/fetch_remote_diskusage.py dest=/tmp/fetch_remote_diskusage.py'}, 'name': 'script_distribute'},
{'action': {'module': 'shell', 'args': 'python /tmp/fetch_remote_diskusage.py ' + src_path }, 'name': 'get_disk_usage'},
]
3.4 难点
如何获取远程服务器磁盘容量
上期回顾:
XTOOLS【运维平台】之文件OR目录压缩(一)
XTOOLS【运维平台】之文件OR目录压缩(二)《本地压缩和远程压缩实现》
下期预告:
XTOOLS【运维平台】之任务定时处理(四)
【the end】
如果觉得有帮助,记得点击上方“运维部落“ → 点击右上角“...” → 点选"置顶公众号 "或“设为星标”
长按关注运维部落(linux178)↓