承德市网站建设_网站建设公司_企业官网_seo优化
2025/12/22 14:58:28 网站建设 项目流程

刚入职新公司,领导说:这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区,从我的电脑不能直连。

解决方案:

  1. 通过跳板机中转
  2. 或者用组网软件把所有服务器组到一个虚拟网络

我最后选了后者,用星空组网把所有服务器组到一起,直接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 整理文档

几个建议:

  1. 先能登上去 - 连不上啥都白搭
  2. 画架构图 - 别指望脑子记
  3. 尽快建监控 - 出问题了才知道
  4. 写文档 - 不然下一个接手的人还要再来一遍
  5. 多问 - 有些东西问一句能省几个小时

有接手服务器的经验欢迎评论区分享~


需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询