1.多机器查看日志存在的问题
为了保持服务高可用和速度,现代的服务器一般都是2台或者以上形成的服务器集群,如果服务器出现故障,运维需要查看线上日志去定位问题,一般有很多方式,一般的公司有日志收集系统,会将所有的日志上传到日志收集系统中,我们可以在这个系统中查找,如果没有这种系统,我们就要去每台服务器上面去定位日志,如果服务器数量较多,则需要每台服务器去查找,非常耗费时间还容易出错,所以我们申请一台单独的日志集群服务器,用这台服务器配置好所有的线上服务器的ip,通过这台服务器就可以一次性查询出所有的日志。
2.预先工作
免登
与免登相关的几个文件
1)id_rsa:私钥
2)id_rsa.pub:公钥,和私钥配对生成
3)authorized_key:记录来访的其他服务器公钥,只有成对生成的私钥才能解密公钥加密的内容,例如A机器可以免登B服务器,则在B服务器这个文件中写入A服务器生成的公钥,公钥存放在A机器的id_rsa.pub文件
4)known_hosts:记录来访的其他服务器的信息,一般通过ssh,scp和ssh-copy-id命令会记录,例如A机器免登B机器,则A机器的此文件中会记录B机器的信息
以A->B免登为例,操作顺序如下:
1) 在A机器执行指令 ssh-keygen -t rsa生成本机的公钥和私钥(已有的跳过这一步),生成文件id_rsa和id_rsa.pub;
2) A机器使用 ssh-copy-id userid@B服务器ip地址,使用此命令后会将当前机器A的公钥发送到对方B,并保存在对方~/.ssh的authorized_key文件中,这样A就可以免密登录B,初次登录会有提示你确认要访问吗,当第一次连接后,A服务器上会生成known_hosts文件,保存B机器的信息,这样下次A免密登录B就不再提示;
3)A机器执行指令 userid@B服务器ip地址 来校验免密登录是否生效
所以我们要使用ssh-copy-id指令拷贝集群服务器的公钥到各个应用服务器,有几个执行几次
ip配置文件
新建文件存放所有应用服务器的ip地址,每个ip之间换行,格式如下:
127.0.0.1
127.0.0.2
127.0.0.3
127.0.0.4
3.编写执行脚本
新建sh文件user.sh,脚本内容如下:
#!/bin/bash
do_command()
{
hosts=`sed -n '/^[^#]/p' ip_hostlist.txt`
for host in $hosts
do
echo ""
echo HOST $host
ssh log@$host "$@"
done
return 0
}
if [ $# != 1 ]
then
echo "=========================================="
echo "功能:批量在多台服务器上执行命令"
echo "方法:$0 \"<cmd_to_exec\" eg:./salarylog.sh \"grep --color 'exception' ~/logs/error.log\" "
echo "返回:各服务器执行命令返回的结果列表"
echo "前提:在待执行命令的各个服务器上设置了免密登录"
echo "警告:禁止执行删除、格式化等这样的可能造成严重后果的命令"
echo "=========================================="
exit 1
fi
echo "确定要执行命令?[yes/no]:$@ "
read to_run
if [ $to_run = "yes" -o $to_run = "YES" -o $to_run = "y" -o $to_run = "Y" ]
then
echo ""
echo -e "\033[31m执行命令 : $@ \033[0m"
do_command "$@"
else
echo "取消执行命令!"
fi
echo ""
echo "=========================================="
备注说明:
ip_hostlist.txt 应用服务器的ip地址列表,例如我们的应用服务器ip列表为:
10.5.46.110
10.5.46.111
10.5.46.112
10.5.46.113
10.5.46.114
10.5.46.115
10.4.46.116
10.4.46.117
ssh log@@" 能执行的前提是集群服务器已经配置好ip_hostlist.txt文件ip地址所有的免登信息
测试执行情况
如果需要查找所有机器中/home/admin/user.log目录文件中含有'error'字符的日志,则指令如下:
./user.sh "cat /home/admin/user.log | grep 'error' "
执行后会提示确认命令:
确定要执行命令?[yes/no]:cat /home/admin/user.log | grep 'error'
输入no后结果:
取消执行命令!
**输入yes结果: **
执行命令 : cat /home/admin/user.log | grep 'error'
HOST 10.5.46.110
HOST 10.5.46.111
HOST 10.5.46.112
HOST 10.5.46.113
HOST 10.5.46.114
HOST 10.5.46.115
HOST 10.4.46.116
HOST 10.4.46.117
很显然文件中没有该字符
网友评论