新人入职,我是怎么快速接手20台服务器的

刚入职新公司,领导说:这20台服务器你来管。

然后甩给我一个Excel表格,里面就写了IP和密码,其他啥都没有。

前任留下的文档?不存在的。

分享一下我是怎么快速上手的。

Day 1:摸清家底

第一步:能登上去

先确认所有服务器都能SSH上去。

# 写个脚本批量测试
for ip in $(cat servers.txt); do
    echo -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.sh

echo "主机名: $(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); do
    echo "========== $ip =========="
    ssh root@$ip 'bash -s' < collect_info.sh
    echo ""
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); do
    echo "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.sh

SERVERS="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
    # 检测SSH
    if ! timeout 5 ssh root@$ip "echo" &>/dev/null; then
        curl -s -H "Content-Type: application/json" -d "{\"msgtype\":\"text\",\"text\":{\"content\":\"[告警] $ip SSH连接失败\"}}" $WEBHOOK
        continue
    fi
    
    # 检测磁盘
    DISK=$(ssh root@$ip "df / | tail -1 | awk '{print \$5}' | tr -d '%'")
    if [ $DISK -gt 80 ]; then
        curl -s -H "Content-Type: application/json" -d "{\"msgtype\":\"text\",\"text\":{\"content\":\"[告警] $ip 磁盘使用率 ${DISK}%\"}}" $WEBHOOK
    fi
    
    # 检测内存
    MEM=$(ssh root@$ip "free | grep Mem | awk '{print int(\$3/\$2*100)}'")
    if [ $MEM -gt 90 ]; then
        curl -s -H "Content-Type: application/json" -d "{\"msgtype\":\"text\",\"text\":{\"content\":\"[告警] $ip 内存使用率 ${MEM}%\"}}" $WEBHOOK
    fi
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); do
    ssh-copy-id -i ~/.ssh/id_ed25519.pub root@$ip
done

SSH Config配置

# ~/.ssh/config
Host web1
    HostName 192.168.1.10
    User root
    
Host web2
    HostName 192.168.1.11
    User root
    
Host db
    HostName 192.168.1.20
    User root
    
Host redis
    HostName 192.168.1.30
    User 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. 多问 - 有些东西问一句能省几个小时

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


posted @ 2025-12-22 14:53  花宝宝  阅读(12)  评论(0)    收藏  举报