1、问题描述和排查
客户线上系统发现有部分主机监控告警空间占用过大,一直也不消除。脚本调试发现,日志自动清理脚本执行有问题,清理没起作用,过期文件未被清理,导致空间占用超过阈值。进一步发现是系统的find没有返回值。
登录问题主机后发现find被替换为空文件……,所以执行没有任何输出了。
2、问题解决
要解决这个问题需要通过正常的文件覆盖替换恢复问题文件。这也是主机文件被篡改后通用的解决方法。如果文件事先做过备份的话,直接用备份过的文件覆盖回来就好了;如果没有做过备份则需要通过其他同版本系统、相似环境下主机的文件来恢复了。
主机间文件复制,可以使用scp或rsync来手动执行实现。但是如果涉及很多太主机的话,这样手动干,耗时耗力不说,还容易由于误操作出现问题。这时候就需要自动运维系统来批量文件恢复了。
本文将通过Rex自动化运维系统实例演示问题解决的实际操作和脚本。本文所使用的解决问题是思路和方法同样也适用于其他自动运维系统。下面的脚本经过简单修改就可以在Ansiable、SaltStack、Puppet中使用。
限于篇幅问题,关于Rex和上面这几种自动运维系统的使用方法本文不赘述,大家有兴趣可以在下面留言,小编会在合适的时候写一些使用实例来和大家一起学习。
3、批量扫描有问题服务器列表
扫描原理简单就是远程发出指令,在主机执行命令ls 列出find文件的大小, 如果大小为1(即为空),则为问题主机。
task "find",group => "all",sub {
my $output= run 'ls -al /usr/bin/find';
say connection->server.':'. $output;
};
通过执行脚本获得主机上find文件大小,结果输出到findlist.txt
rex -qw find 1>findlist.txt
然后对findlist处理,用perl单行命令找出文件文件列表里面find大小为1的文件。
执行后结果如下 :
192.168 .0.1 -rwxr-xr-x 1 root root 1 Sep 4 2017 /usr/bin/find
192.168 .0.2 -rwxr-xr-x 1 root root 157760 Sep 4 2017 /usr/bin/find
192.168 .0.3 -rwxr-xr-x 1 root root 157760 Sep 4 2017 /usr/bin/find
192.168 .0.4 -rwxr-xr-x 1 root root 1 Sep 4 2017 usr/bin/find
获得有问题的主机ip列表:
perl -lane 'print $F[0] if $F[5]==1' findlist.txt|perl -pe 's/:$//'
结果为 :
192.168.0.1
192.168.0.4
4、获得问题主机发行版版本号
通过版本找到,找到对应版本find文件进行替换。主机发行版版本号通过/etc/issue文件获得。
task "issue", group => "all",sub {
my $output= run 'cat /etc/issue';
say connection->server.':'. $output;
};
5、替换find文件
用Rex的upload模块上传find文件覆盖问题主机find文件,并改变其属主和分组为root。最后用find命令搜索/root目录的文件,并计算文件数目,如果不为0,说明find功能正常,替换文件成功。
task "findchange",group => "all",sub {
upload "/tmp/find","/bin/find";
run 'chown root.root /bin/find';
my $output=run 'find /root -type f|wc -l';
say connection->server.' :'. $output;
};
整个过程的原理和流程就是这样,是不是很简单?
如果你喜欢本文件,请给我点赞,并关注我。有或者没有问题,你都可以回复文章。
最后在次新春佳节来临之际祝大家新年快乐,万事如意。