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.log
10 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表单拼接SQL
var rules []model.AlertRule
rules, 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实现
安装
## 安装Ansible yum install -y ansible yum 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'
- ip列表写入ip_list.ini
执行脚本
sh auto_ssh.sh $Passwordauto_ssh.sh
#!/bin/bash if [ -s ./result.ini ] ; then > result.ini fi Password=$1 sed -i '/ansible_ssh/d' /etc/ansible/hosts # 添加机器信息 for Ip in $(cat ip_list.ini) do Username="root" echo -e "$Ip ansible_ssh_user=$Username ansible_ssh_port=22 ansible_ssh_pass=$Password" >> /etc/ansible/hosts done # [test]用户组 执行命令 ansible test -m shell -a 'lspci' > result.ini echo "All Hosts Ansible Done , please check result.ini ! ! !"
3.2、Expect实现
安装
## 安装expect yum install -y expect ## 单台机器登录 sh login.sh $Ip $Pwd
- 执行命令写入execute_cmd.ini
执行脚本
sh cmd_login.sh $Ip $Pwd批量机器登录 + 执行shell命令
- ip列表加入ip_list.ini
- 执行命令写入execute_cmd.ini
执行脚本
sh list_cmd_login.sh $Pwdauto_ssh.sh
#!/usr/bin/expect set 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
- 欢迎关注,感谢支持!
本文由mdnice多平台发布
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。