一、故事的源头:设备配置的备份
一个房子里面有N多设备,每个设备都有配置数据,要例行备份。
摘取了共同点,硬件设备基本上都支持tftp,那么就装了个简单的tftp服务器,在parrot里面是叫tftp-hpa的一个包,设置好目录权限和自动启动,然后像等外卖送饭一样坐等上传了。
└──╼ #cat /etc/default/tftpd-hpa
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/dir/of/tftp/upload"
TFTP_ADDRESS="0.0.0.0:69"
#TFTP_OPTIONS="--secure"
TFTP_OPTIONS="-l -c -s"
----------------------
──╼ #systemctl status tftpd-hpa.service
● tftpd-hpa.service - LSB: HPA's tftp server
Loaded: loaded (/etc/init.d/tftpd-hpa; generated)
Active: active (running)
......
下一步自然就是考虑如何喊各设备送饭了:
设备型号不一,有意思的是先拎出了个相比之下最高科技的几只,竟然带有自动任务功能,配置好它的时间点以及执行的tftp命令,饭能准时送到
然而傻瓜一点的设备怎么办? 好吧,只有自己动手丰衣足食了,找上门去要饭。。。设备设置有SSH端口维护管理,自然想到了expect自动上去拎了。于是有了如下段:
└──╼ $cat tftpDev1.exp
#!/usr/bin/expect
set timeout 10
set Devipaddress [lindex $argv 0]
spawn bash -c "ssh -c aes128-cbc OMuser@$Dev1ipaddress "
expect "assword:"
send "passwd.of.YYYYMM\r"
expect "exit."
send " \r"
send "tftp 192.ParrotsecOS.IP.ADDR put Food.cfg Food_$Devipaddress.cfg"
send " \r"
send "quit \r"
expect eof
然后有多少家就排多少家的菜单列进来,都要完了之后还不忘记找另个地方再转存一份,简单粗爆顺序的堆出来下面这段,能用也能看日志,反正能跑并且没问题就好
└──╼ $cat tarScript.sh
date >> /dir/of/tftp/upload/bakscript.log
expect -f /dir/of/tftp/tftpDev1.exp Door1.DEV.IP.ADDR | tee -a /dir/of/tftp/bakscript.log
expect -f /dir/of/tftp/tftpDevN.exp Door2.DEV.IP.ADDR | tee -a /dir/of/tftp/bakscript.log
......
...... 多少设备要备份的都堆在这里吧。。。
......
tar -zcvf /dir/of/tftp/upload_$(date +%Y%m%d-%H%M%S).tar.gz /dir/of/tftp/upload >> /dir/of/tftp/bakscript.log
expect -f /dir/of/tftp/scripts/scpexpect.exp /dir/of/tftp/upload_$(date +%Y%m%d)*.tar.gz >> /dir/of/tftp/scripts/bakscript.log
date >> /dir/of/tftp/bakscript.log
echo -e " \n\n"
scp的expect略过,网上摘的那么几行,改了下自己用的ip什么的就ok。
最后就是定时一下,所有的时间点设置在相差不了几分钟的样子吧,直接用cron了。
┌─[root@parrot]─[/dir/of/tftp/]
└──╼ #crontab -l
######......
12 0 * * * /bin/su - user -c " sh /dir/of/tftp/scripts/tarScript.sh "
至此,故事的源头到这里就讲的差不多了,长时间下来收获颇丰。。。
└──╼ #ls
...
....
upload_20171106-002321.tar.gz upload_20180807-001221.tar.gz
upload_20171107-002320.tar.gz upload_20180808-001221.tar.gz
┌─[root@parrot]─[/dir/of/tftp/scripts]
└──╼ #ll | wc -l
561
现在回头查看它最早的一个备份包是17年2月份的,侧面反映了系统大概是这个时候安装的,放在旁边不起眼的一个HTPC, 配置D5xx的CPU、2G内存、8G磁盘,这样可怜的配置还又被我利用继续榨取剩余价值了,心好狠毒。。。
二、故事再继续:从源头里面找关注的内容
从备份的配置数据里面找关注的内容
没有配置备份的时候,就不是太关注配置里面有什么东东,有了配置备份,要从配置里面挑自己想要用的东西了,毕竟比爬进设备再去用命令查更快捷一点,就像是饭菜没送到的时候没想过里面更喜欢哪些肉丝鱼片一样,送到了不免要看看里面有啥喜欢吃和不喜欢吃的 。
本地最基本的查看,(顺便说一句本机系统一样是parrot,否则不会来这灌水讲故事) 看看一盘菜的大概样子 :
└──╼ $cat getDev1.sh
#!/bin/bash
ssh [email protected] " cat /dir/of/tftp/scripts/upload/startup_Dev1.cfg "
echo ""
常用的ssh连接都设置过Key,免密登陆还是比较方便的,长的帅不用饭卡凭借刷脸吃饭吧。像这样的getXXX.sh,改一改弄了一堆,用的时候敲get再tab键找吧,同一型号的可以共用一个的再通过参数传标识,也就是类似的Dev1换成了$1。
后来发现查看的关注点有些时候需要专注了,怎么办,再加过滤处理吧。。。 于是有了下面这个过滤设备内外网络端口对照配置的脚本。
└──╼ $cat getnatserver.sh
#!/bin/bash
ssh [email protected] " cat /dir/of/tftp/scripts/upload/ "| grep "nat server" | sed 's/^.* \([[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}.*\) inside.* \([[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}.*\)$/\1 ~~~ \2/g' | sed 's/www/80/g' | awk '{ if ($2=="~~~") { print "--- This is a unexcept line ---" ; } else printf("%18s%8s%18s%8s\n",$1,$2,$4,$5); fi }' |sort -k4n,4 -k3,3
它的功能是把其中一个设备上所有的nat server protocol 。。。 1.2.3.4 80 inside 10.192.172.127 8080
模式的配置内容抓出来再格式化一下。处理后的样子大概是这样的,也算是土豆花生虽然很土也是一目了然看出来了:
└──╼ $./getnatserver.sh
1.2.3.1 any 10.192.172.12 any
1.2.3.2 any 10.192.172.13 any
1.2.3.5 80 10.192.172.21 80
1.2.3.6 80 10.192.172.26 80
......
三、故事再再继续:找到的东西再一次搭配起来利用
结果重新组装curl命令探测服务状态
从菜里面夹到要吃的东西,那就团一起往嘴里送吧 我有点编不下去了 。。。
继续,列表出来了,那么就可以把它做为下一个使用的输入,这里是做简单的外网探测端口的服务状态了,老规矩,还简单的堆出个脚本然后塞进cron里面,能用并且不出错就OK了,这里的主机是放在家里的一个小树莓派3b,惯例还是parrot发布的pi版本在里面跑着
└──╼ #cat gencurl.sh
#!/bin/bash
echo mvOld
mv /root/srvmonitor/rst.txt /root/srvmonitor/rstold.txt
echo GetNatCurlsTxt
ssh EXT.IP.ADDR.MAP -p SSHPORT /root/scripts/getnatserver.sh | sed 's/any/80/g' | awk '{printf("http://%s:%s/\n", $1, $2) }' > /root/srvmonitor/curls.txt
sed -i '/443/ s/^http/https/g ' /root/srvmonitor/curls.txt
sed -i '/DEL.EXCEPT.IP.ADDR/ d ' /root/srvmonitor/curls.txt
echo genRst
for ie in `cat /root/srvmonitor/curls.txt` ; do curl -I --retry 2 -s -o /dev/null -m 15 -w %{http_code} $ie ; echo -e " $ie" ; done > /root/srvmonitor/rst.txt
echo DiffRst
diff /root/srvmonitor/rst.txt /root/srvmonitor/rstold.txt > /root/srvmonitor/diffsrv.txt
if [ $? -ne 0 ] ;
then
echo " scpSendMail"
scp -PSSHPORT /root/srvmonitor/diffsrv.txt [email protected]:/root/
ssh EXT.IP.ADDR.MAP -pSSHPORT 'cat /root/diffsrv.txt | mailx -s "DiffServices-`date`" [email protected] '
echo " sendDone "
fi
echo GenDone
大概功能是cron里面每小时一次,每次生成个rst.txt,生成之前先把上一个小时的备份到rstold.txt里面;通过调用上一步的脚本再组装curl的http链接;curl命令的参数配置成了只返回状态码,2次重试以免结果不准;顺便做些剔除无用数据等处理;最后比较一下近两个小时的差异;如果有则传回来结果文件并远程调用它mail出来,远程已有mail配置就没再在pi上配置了,mail相关的配置可参考之前发过一个帖子。
如果一小时之前和现在的状态有了差异,收到MAIL内容也就是结果文件的样子,其中第一行是结果文件中有差异的行号,第二行<是最近的状态,第四行>是一小时前的状态,如果多块差异也类似:
121c121
< 200 http://1.2.3.5:80/
---
> 000 http://1.2.3.5:80/
题外:监控服务状态有很多开源软件可用,但我并没有选择使用,主要是因为设备配置的变化与监控配置同步的时候发现跟不上节奏,并且ZABBIX等各种监控软件让它在一个小pi上跑也有些舍不得,怕累到它 , 所以也就这样跑几个简单实用基本不用去维护的脚本,然后坐等MAIL吧。