刚入职新公司,领导说:这20台服务器你来管。
然后甩给我一个Excel表格,里面就写了IP和密码,其他啥都没有。
前任留下的文档?不存在的。
分享一下我是怎么快速上手的。
Day 1:摸清家底
第一步:能登上去
先确认所有服务器都能SSH上去。
# 写个脚本批量测试
for ip in $(cat servers.txt); doecho -n "$ip: "timeout 3 ssh -o ConnectTimeout=3 root@$ip "echo OK" 2>/dev/null || echo "FAILED"
done
跑完发现有3台连不上:
- 1台IP错了
- 1台密码错了
- 1台防火墙没开SSH
找IT把问题解决了,20台都能登了。
第二步:收集信息
登上去了,但不知道每台机器跑的什么。写个脚本收集一下:
#!/bin/bash
# collect_info.shecho "主机名: $(hostname)"
echo "IP: $(hostname -I | awk '{print $1}')"
echo "系统: $(cat /etc/os-release | grep PRETTY_NAME | cut -d'"' -f2)"
echo "内核: $(uname -r)"
echo "CPU: $(nproc) 核"
echo "内存: $(free -h | grep Mem | awk '{print $2}')"
echo "磁盘: $(df -h / | tail -1 | awk '{print $2}')"
echo ""
echo "运行的服务:"
systemctl list-units --type=service --state=running | grep -E "nginx|mysql|redis|docker|java|node|python" | awk '{print $1}'
echo ""
echo "监听端口:"
netstat -tlnp | grep LISTEN | awk '{print $4, $7}' | sort -u
echo ""
echo "定时任务:"
crontab -l 2>/dev/null
批量执行:
for ip in $(cat servers.txt); doecho "========== $ip =========="ssh root@$ip 'bash -s' < collect_info.shecho ""
done > server_info.txt
跑完得到一个大文件,整理成表格:
| IP | 主机名 | 配置 | 服务 | 用途 |
|---|---|---|---|---|
| 192.168.1.10 | web-01 | 4C8G | nginx, java | Web服务 |
| 192.168.1.11 | web-02 | 4C8G | nginx, java | Web服务 |
| 192.168.1.20 | db-01 | 16C64G | mysql | 数据库主 |
| ... | ... | ... | ... | ... |
Day 2:理清架构
知道每台机器跑什么了,但不知道它们之间的关系。
画架构图
根据收集的信息,大概画出来:
┌─────────────┐│ 负载均衡 ││ 192.168.1.1 │└──────┬──────┘│┌──────────────┼──────────────┐│ │ │┌──────┴──────┐┌──────┴──────┐┌──────┴──────┐│ Web-01 ││ Web-02 ││ Web-03 ││ .10 ││ .11 ││ .12 │└──────┬──────┘└──────┬──────┘└──────┬──────┘│ │ │└──────────────┼──────────────┘│┌──────────────┼──────────────┐│ │ │┌──────┴──────┐┌──────┴──────┐┌──────┴──────┐│ MySQL主 ││ MySQL从 ││ Redis ││ .20 ││ .21 ││ .30 │└─────────────┘└─────────────┘└─────────────┘
确认关键信息
# MySQL主从关系
ssh root@192.168.1.21 "mysql -e 'SHOW SLAVE STATUS\G'" | grep -E "Master_Host|Slave_IO_Running|Slave_SQL_Running"# Redis是单机还是集群
ssh root@192.168.1.30 "redis-cli INFO Replication"# Nginx配置指向哪里
ssh root@192.168.1.10 "cat /etc/nginx/conf.d/*.conf" | grep proxy_pass
Day 3:建立监控
没监控就是瞎子。先搞个简单的。
快速方案:用现有的
问了一下,公司有Zabbix但没接这些服务器。
把Agent装上去:
# 批量安装Zabbix Agent
for ip in $(cat servers.txt); doecho "Installing on $ip..."ssh root@$ip "apt install -y zabbix-agent && systemctl enable zabbix-agent && systemctl start zabbix-agent"
done
然后在Zabbix Server上批量添加主机。
自己搞:简单脚本
如果没有现成监控,先用脚本顶一下:
#!/bin/bash
# simple_monitor.shSERVERS="192.168.1.10 192.168.1.11 192.168.1.20 192.168.1.30"
WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=xxx"for ip in $SERVERS; do# 检测SSHif ! timeout 5 ssh root@$ip "echo" &>/dev/null; thencurl -s -H "Content-Type: application/json" -d "{\"msgtype\":\"text\",\"text\":{\"content\":\"[告警] $ip SSH连接失败\"}}" $WEBHOOKcontinuefi# 检测磁盘DISK=$(ssh root@$ip "df / | tail -1 | awk '{print \$5}' | tr -d '%'")if [ $DISK -gt 80 ]; thencurl -s -H "Content-Type: application/json" -d "{\"msgtype\":\"text\",\"text\":{\"content\":\"[告警] $ip 磁盘使用率 ${DISK}%\"}}" $WEBHOOKfi# 检测内存MEM=$(ssh root@$ip "free | grep Mem | awk '{print int(\$3/\$2*100)}'")if [ $MEM -gt 90 ]; thencurl -s -H "Content-Type: application/json" -d "{\"msgtype\":\"text\",\"text\":{\"content\":\"[告警] $ip 内存使用率 ${MEM}%\"}}" $WEBHOOKfi
done
加到crontab,每5分钟跑一次:
*/5 * * * * /opt/scripts/simple_monitor.sh
Day 4:统一管理
SSH密钥配置
一个个输密码太烦了,配置密钥登录:
# 生成密钥(如果没有)
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -N ""# 分发公钥
for ip in $(cat servers.txt); dossh-copy-id -i ~/.ssh/id_ed25519.pub root@$ip
done
SSH Config配置
# ~/.ssh/config
Host web1HostName 192.168.1.10User rootHost web2HostName 192.168.1.11User rootHost dbHostName 192.168.1.20User rootHost redisHostName 192.168.1.30User root
现在直接 ssh web1 就能连了。
批量管理工具
如果服务器更多,可以用Ansible:
# inventory.yml
all:children:web:hosts:192.168.1.10:192.168.1.11:192.168.1.12:db:hosts:192.168.1.20:192.168.1.21:redis:hosts:192.168.1.30:
# 批量执行命令
ansible all -i inventory.yml -m shell -a "uptime"# 批量安装软件
ansible web -i inventory.yml -m apt -a "name=htop state=present"
Day 5:文档整理
把前面收集的信息整理成文档,方便以后查:
# 服务器清单## 生产环境| 主机名 | IP | 配置 | 服务 | 用途 |
|--------|-----|------|------|------|
| web-01 | 192.168.1.10 | 4C8G | nginx, java | Web |
| web-02 | 192.168.1.11 | 4C8G | nginx, java | Web |
| db-01 | 192.168.1.20 | 16C64G | mysql(主) | 数据库 |
| db-02 | 192.168.1.21 | 16C64G | mysql(从) | 数据库 |
| redis-01 | 192.168.1.30 | 8C32G | redis | 缓存 |## 网络架构(贴架构图)## 关键服务配置(MySQL主从配置、Nginx配置等)## 运维手册(常用命令、故障处理等)
遇到的问题
问题1:有些服务器在不同网段
20台服务器分布在3个网段,有些还在DMZ区,从我的电脑不能直连。
解决方案:
- 通过跳板机中转
- 或者用组网软件把所有服务器组到一个虚拟网络
我最后选了后者,用星空组网把所有服务器组到一起,直接SSH虚拟IP就能连。
问题2:不知道哪些服务重要
问了一下同事和领导,确认了优先级:
| 优先级 | 服务 | 说明 |
|---|---|---|
| P0 | MySQL主库 | 挂了业务全完 |
| P0 | Web服务 | 挂了用户访问不了 |
| P1 | MySQL从库 | 挂了影响读性能 |
| P1 | Redis | 挂了性能下降 |
| P2 | 其他 | 影响较小 |
问题3:不知道部署流程
找之前的同事问了一下大概流程,然后自己部署了几次,把流程文档化了:
# 部署流程
1. 拉取代码:git pull
2. 编译打包:mvn package
3. 备份当前版本:cp app.jar app.jar.bak
4. 替换新版本:cp target/app.jar /opt/app/
5. 重启服务:systemctl restart app
6. 检查日志:tail -f /var/log/app/app.log
7. 检查监控:确认服务正常
总结
接手服务器的步骤:
| 阶段 | 事项 |
|---|---|
| Day 1 | 确认能登录,收集基本信息 |
| Day 2 | 理清架构关系,画架构图 |
| Day 3 | 建立监控告警 |
| Day 4 | 配置统一管理(密钥、Ansible) |
| Day 5 | 整理文档 |
几个建议:
- 先能登上去 - 连不上啥都白搭
- 画架构图 - 别指望脑子记
- 尽快建监控 - 出问题了才知道
- 写文档 - 不然下一个接手的人还要再来一遍
- 多问 - 有些东西问一句能省几个小时
有接手服务器的经验欢迎评论区分享~