无监控不运维,虽然我这些帖子可能对于谷歌级别的运维所不屑(虽然我也玩虚拟化,公有私有云,集群),但这些都是很接地气的真实案例,而且不花一分钱,对于新手改改直接可以使用,对于高手用在大型的项目上有画龙点睛,锦上添花的效果。

技术就是要多玩,玩出名堂。

同样,简单介绍需求背景:

现在任何一家企业,如果说它没有上共享存储(无论是NAS还是EMC,无论是分布式还是磁盘阵列,无论是ISCSI,还是SAN),我认为它还是处于原始社会。

用户最直观的就是登录一个网络路径\\IP地址或者映射一个网盘到本地,当用得普遍了,问题就来了。

刚来没几天,设计部的老大来找麻烦了,说他们存放在共享的工作路径的设计文档丢失或者说文件不正常了(文件名可以看到,但大小为0),我第一反应是NAS出问题了,但经验告诉我威联通的企业级NAS没那么不靠谱的,

在了解到设计部的工作都是直接用2D或者3D设计软件直接从网盘上开启设计档,或者说新建设计档直接用软件保存到网盘路径;

这样做目的在我看来就是为了偷懒,省去了一个在本地硬盘保存然后上传下载到共享存储的过程,不是不可以,但是不推荐,为什么?

1,直接通过网络去开启网盘文件,局域网稳定还好说,要是出现抖动呢?(偶尔抖动下,鬼知道呢?更不要说找原因),文档做一半没及时保存就废了。

2,不是人傻钱多一般公司舍不得上EMC或者SAN(高可靠,高可用,高速度),一般搞个入门级NAS配个百兆交换机(即使千兆设备,遇上网线施工不良,哪里达不到千兆就自动降速为百兆),网盘文件上传下载也就10M的速度,这个速度,和本地硬盘存储开启文档简直是天壤之别,为了省那么一点麻烦,开启个几十M的3D图档需要等待半分钟,傻不傻,弄不好,直接无响应死机给你看。

3,在本地硬盘上编辑好工作档再上传下载到网盘的过程是显式的,失败成功,一目了然,而直接通过工作软件直接去网盘拉取和另存文档是隐式的,工作软件后台做了什么,做没做成功,无法得知,要是软件出bug了,明明软件保存了文档,但NAS上显示是不正常的。

鄙人丰富的企业运维经验使我总结了以上观点,但是解释给这位设计部老大听的时候,却并不被认可,几次下来,我怒了,作为一个搞技术的,需要用技术武装自己,证明自己的观点。

那么,本篇教程就奉送给那些曾今被各种不理解伤害到的同行们:

首先,我想到我需要将设计部的共享盘里面的文件目录和大小,创建修改时间像拍虚拟机快照一样,定时拍一个快照来供我查询追溯。

作为玩linux的这个非常好办,基本思路是将需要监控的网盘挂载到linux里面,然后使用crontab去定时执行一个tree命令就搞定了,说得很简单还是分几步走的:

1,CentOS挂载NAS共享盘:

图片.png

最好是加入到/etc/rc.local开机启动文件里面,这样开机会自动挂载;

2,编辑脚本文件,定时去输出目录大小日志:

tree --charset UTF-8  /root/design/design/ -s -D  -h -N >/root/design_monitor/design.dir
tree --charset UTF-8  /root/design/photo/  -s -D  -h -N >/root/design_monitor/photo.dir

运行这个shell脚本那么会得到两个主要监控的共享目录的树形图,下图拿design这个目录举例,打开脚本输出的design.dir文件:

共享存储路径的监控_第1张图片

光有这个还远远不够说明问题,我需要知道每天工作人员在网盘做了些什么,功夫不负有心人,我找到了利器:Directory Monitor(免费的,高级功能收费),但免费的基础版已经够用了,网上有破解的,但我不需要:

共享存储路径的监控_第2张图片

在window server上安装上这个软件后,服务器常年不关机,那么就等于7X24小时对目录进行监控,这玩意儿很厉害,很专业,当然也很小白(适合新手),简单好用:

共享存储路径的监控_第3张图片

定义好监控路径参数还有日志输出位置(我直接放监控的共享盘内,方便linux访问):

共享存储路径的监控_第4张图片

得到目录操作日志大概是这样的:

共享存储路径的监控_第5张图片

我这人很懒,这么闹心的一件事,我不想每天都惦记着,我得让它自动化,每天发个邮件把上面所有的东东作为附件到我和那位设计部老大的邮箱里,啥时候出现问题,自己去追溯,不要说我没有证据,想仿照DiretoryMonitor一样不用打开附件就直接能看到漂亮的操作日志,就做一下html格式化。

那么,在linux下面又弄个python程序去做这件事,直接上干货:

# !/usr/bin/python3

import smtplib
import os , time
from email.mime.text import MIMEText
from email.header import Header
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart

today = time.localtime(time.time())
today = time.strftime('%Y%m%d', today)

def lastestfile(path):
        filenamelist = os.listdir(path)
        tm = os.stat(path + filenamelist[0])
        name = filenamelist[0]
        for item in filenamelist:
                temp = os.stat(path + item)
                if tm.st_ctime < temp.st_ctime:
                        tm = temp
                        name = item

        return name

design_log_path = '/root/design/Log/design_log/'
design_log_name =  lastestfile(design_log_path)
design_log_path = design_log_path + design_log_name

photo_log_path = '/root/design/Log/photo_log/'
photo_log_name =  lastestfile(photo_log_path)
photo_log_path = photo_log_path + photo_log_name

def htmlContent(path):

    log_text = open(path, 'r',encoding='utf-8')
    lines = log_text.readlines()
    head = "操 作执 行 时 间文 件 路 径"

    tmp = ""

    for line in lines:
        if line.find("新增")>=0:
            t = line.index(' ')
            tmp = tmp + "" + line[0:t] + "" + (line[t + 1:].split(': '))[0] + "" + (line[t + 1:].split(': '))[1] + ""

        elif line.find("修改")>=0:
            t = line.index(' ')
            tmp = tmp + "" + line[0:t] + "" + (line[t + 1:].split(': '))[0] + "" + (line[t + 1:].split(': '))[1] + ""

        elif line.find("重命名")>=0:
            t = line.index(' ')
            tmp = tmp +  "" + line[0:t] + "" + (line[t + 1:].split(': '))[0] + "" + (line[t + 1:].split(': '))[1] + ""
         elif line.find("删除")>=0:
            t = line.index(' ')
            tmp = tmp + "" + line[0:t] + "" + (line[t + 1:].split(': '))[0] + "" + (line[t + 1:].split(': '))[1] + ""

        else:

            pass


    htmlContent=head + tmp + ""
    return htmlContent




sent_content = "Directory Monitor---【design】" + htmlContent(design_log_path) + "
Directory Monitor---【photo】" + htmlContent(photo_log_path) + "" _user = "邮箱账号" _pwd = "密码" _to = "设计部和我的邮箱群组" msg = MIMEMultipart() msg["Subject"] = "Design-Dep NAS File Snapshot" msg["From"] = _user msg["To"] = _to part = MIMEText(sent_content, 'html', 'utf-8') msg.attach(part) part = MIMEApplication(open('/root/py_script/design_monitor/design.dir', 'rb').read()) part.add_header('Content-Disposition', 'attachment', filename="design_" + today + ".dir") msg.attach(part) part = MIMEApplication(open('/root/py_script/design_monitor/photo.dir', 'rb').read()) part.add_header('Content-Disposition', 'attachment', filename="photo_" + today + ".dir") msg.attach(part) part = MIMEApplication(open(design_log_path, 'rb').read()) part.add_header('Content-Disposition', 'attachment', filename=design_log_name) msg.attach(part) part = MIMEApplication(open(photo_log_path, 'rb').read()) part.add_header('Content-Disposition', 'attachment', filename=photo_log_name) msg.attach(part) s = smtplib.SMTP("邮箱服务器地址", timeout=30) s.login(_user, _pwd) s.sendmail(_user, _to, msg.as_string()) s.close()

展示下最后的效果图:

共享存储路径的监控_第6张图片

好,终于,下一次设计部老大又来投诉说设计文档出现异常了,我先通过每天的操作日志看下这个文档是什么时候创建的(他们自己的文档,不用看日志他也大概知道是什么时候做的),

通过操作日志找到了新增的那一天,然后通过检差当天的tree命令输出的文件目录树形图,发现创建的当天就是异常的,说明设计软件没有正常保存到网盘上,不怪任何人和设备;

要怪就只能怪他过分相信它的设计软件并且对重要的设计文档的保存当场不去网盘上做确认有没有保存成功。

就这样,设计部从此闭上他们唠叨的嘴巴,我的耳根得以清净,有时候,解释根本没有用,他们要的是证据。

共享存储路径的监控_第7张图片