Utils
- 本篇为服务器管理平台的结篇,讲述一些必要的Util,如钉钉告警、安全加密、远程登录等功能的实现
1、钉钉告警
1.1、SQL配置告警规则
-
逻辑磁盘容量已使用比例超过90%
-
超过30天未登录
字段名称 | 字段类型 | 解释 |
Id | int | 自增ID |
Table | string | 监测表名 |
Metric | string | 监测指标 |
Template | string | 告警模版 |
Frequency | string | 告警频率 |
Threshold | string | 指标阈值 |
CreatedAt | timestamp | 创建时间 |
UpdatedAt | timestamp | 修改时间 |
1.2、Shell定时轮询
## 打开定时任务配置文件crontab -e## 指定每个工作日上午11:10定时执行脚本,并把执行脚本的日志写入文件 result.log10 11 * * 1,2,3,4,5 sh [alert.sh](http://alert.sh) > result.log
1.3、核心功能函数
const openUrl = "https://oapi.dingtalk.com/robot/send?access_token=43e4ad2bcbbef692c7652b9eecca6fd51a0db9e544edcb579640e78f71259006"// NotifyHandler NotifyHandler
type NotifyHandler struct {web.BaseHandler
}// POST method
func (NotifyHandler) POST(ctx *web.Context) {//1.根据POST表单拼接SQLvar rules []model.AlertRulerules, err := model.GetRules()if err != nil {ctx.JSON("Describe AlertRule", 101, err)return}//2. 查询记录匹配告警模版for _, rule := range rules {switch rule.Table {case "es_logicaldisk":threshold, err := strconv.Atoi(rule.Threshold)if err != nil {ctx.JSON("Describe AlertRule Threshold ,table es_logicaldisk", 101, err)return}disks, err := model.GetDiskInfo(threshold)if err != nil {ctx.JSON("Describe GetDiskInfo Fail", 101, err)return}if len(disks) != 0 {for _, disk := range disks {alarmStr := fmt.Sprintf("时间: %s\n告警标题:逻辑磁盘容量超出%v\n业务IP:%v\n序列号:%v\n磁盘:%v使用百分比%v",time.Now().Format("2006-01-02 15:04:05"), rule.Threshold, disk.BusinessIp, disk.SN, disk.Filesystem, disk.UsePercent)err := notify.SendDingCh(openUrl, alarmStr)if err != nil {ctx.JSON("Describe LogicalDisk", 101, err)return}}}case "es_logininfo":logins, err := model.GetLoginInfo()if err != nil {ctx.JSON("Describe GetLoginInfo Fail", 101, err)return}if len(logins) != 0 {for _, login := range logins {alarmStr := fmt.Sprintf("时间: %s\n告警标题:超过30天未登录\n业务IP:%v\n序列号:%v\n上次登录时间:%v\n,距今间隔:%v",time.Now().Format("2006-01-02 15:04:05"), login.BusinessIp, login.SN, login.StartTime, login.Interval)err := notify.SendDingCh(openUrl, alarmStr)if err != nil {ctx.JSON("Describe LoginInfo", 101, err)return}}}}}ctx.JSON(fmt.Sprintf("ALL Alert Info Already send"), 0, nil)
}
1.4、结果验证
2、数据安全加密
2.1、Token鉴权
- 根据web访问来源平台,分配不同Token进行鉴权识别,不同Token标识不同平台,权限不同,如web链接访问无删除权限
2.2、权限分级及加密存储
- 平台账户分级,不同权限可访问界面不同
- 账户密码加密存储
3、远程登录
3.1、Ansible实现
- 安装
## 安装Ansibleyum install -y ansibleyum install -y sshpass### 修改配置,忽略告警vim /etc/ansible/ansible.cfg[defaults]host_key_checking = False # 第一次远程ssh主机需要将机器指纹添加到known_hosts,此设置忽略该步骤command_warnings=False #忽略ansible执行命令的告警信息deprecation_warnings=False### 增加test用户组vim /etc/ansible/hosts[test]127.0.0.1 ansible_ssh_user=root ansible_ssh_port=22 ansible_ssh_pass=xxx### 执行命令,验证功能ansible test -m shell -a 'lspci'## 批量机器登录 + 执行shell命令
1. ip列表写入ip_list.ini
2. 执行脚本sh auto_ssh.sh $Password
- auto_ssh.sh
#!/bin/bashif [ -s ./result.ini ] ; then> result.ini
fiPassword=$1
sed -i '/ansible_ssh/d' /etc/ansible/hosts# 添加机器信息
for Ip in $(cat ip_list.ini)doUsername="root"echo -e "$Ip ansible_ssh_user=$Username ansible_ssh_port=22 ansible_ssh_pass=$Password" >> /etc/ansible/hostsdone# [test]用户组 执行命令
ansible test -m shell -a 'lspci' > result.ini
echo "All Hosts Ansible Done , please check result.ini ! ! !"
3.2、Expect实现
- 安装
## 安装expectyum install -y expect## 单台机器登录sh login.sh $Ip $Pwd## 单台机器登录 + 执行shell命令
1. 执行命令写入execute_cmd.ini
2. 执行脚本sh cmd_login.sh $Ip $Pwd## 批量机器登录 + 执行shell命令
1. ip列表加入ip_list.ini
2. 执行命令写入execute_cmd.ini
3. 执行脚本
sh list_cmd_login.sh $Pwd
- auto_ssh.sh
#!/usr/bin/expectset user "root"
set host [lindex $argv 0]
set port "22"
set password [lindex $argv 1]spawn ssh -p$port $user@$host
expect {"*yes/no" { send "yes\r"; exp_continue }"*assword:" { send "${password}\r" }}
interact
End
- 欢迎关注,感谢支持!