3. 自动化运维环境搭建

在批量管理数十台甚至上百台 EPYC 服务器之前,必须先解决一个前置问题:运维流量从哪里发起、经过谁、以什么身份、用什么工具到达目标节点。如果直接在办公网逐台 SSH,会同时面临三个风险:管理面暴露面过大、凭据分散难以轮换、批量任务缺少统一入口。本章围绕这四点展开:管理网络规划、跳板机与配置管理节点部署、SSH 密钥体系、Ansible/SaltStack 基础环境安装。

一、管理网络规划:先定平面,再定地址

EPYC 平台通常具备多个网络接口,其中 BMC(如 ASPEED 集成的 IPMI/Redfish 接口)与业务网口物理分离。规划的第一步是把网络划分为三个平面:业务平面承载生产流量;管理平面承载 BMC、SSH 运维与配置管理流量;带外平面可与管理平面合并,也可独立,用于远程开关机、重装和固件升级。对于中小规模集群,常见做法是管理平面与带外平面共用一台管理交换机,但通过 VLAN 隔离。

地址规划建议按“角色分段”,便于后续防火墙策略和 Ansible 主机清单维护。以下是一个 60 节点集群的示例规划(示例参数,非实测):

用途网段示例VLAN说明
管理节点/跳板机10.20.0.0/2420固定 IP,仅允许运维终端访问
计算节点 BMC10.20.10.0/2420每节点 1 个,Redfish 端口 443
计算节点 OS 管理口10.20.20.0/2420SSH 22、Salt 4505/4506
业务数据网10.30.0.0/1630与本章运维流量隔离

规划完成后,应在管理交换机上配置 ACL:仅允许跳板机所在网段访问 BMC 的 443/623 端口和节点 OS 的 22 端口,禁止管理网段主动访问业务网。这样即使某台计算节点被入侵,也无法横向扫描 BMC。

EPYC 集群管理网络拓扑与流量路径 运维终端 笔记本 / 办公网 跳板机 / 配置管理节点 10.20.0.10 Ansible + SaltStack 管理交换机 VLAN 20 + ACL EPYC 计算节点集群(示例 60 台) 节点 OS 管理口 10.20.20.0/24 SSH 22 / Salt 节点 BMC 10.20.10.0/24 Redfish 443 业务数据网 10.30.0.0/16 与运维流量隔离,禁止管理网主动访问 SSH 跳转 管理流量 流量路径说明 运维终端 → 跳板机(仅此一跳暴露) 跳板机 → 管理交换机(Ansible/Salt 下发) 管理交换机 → 节点 OS 管理口(SSH 22) 管理交换机 → 节点 BMC(Redfish 443)

二、跳板机与配置管理节点部署

跳板机与配置管理节点可以合并为一台,也可以分离。合并的优点是链路短、维护简单;分离的优点是跳板机只做访问代理,配置管理节点可以放在更受控的网段。对于 60 节点以内的集群,建议合并部署,规格参考:8 vCPU、16 GB 内存、200 GB SSD,操作系统选择与计算节点一致的发行版(如 Rocky Linux 9 或 Ubuntu 22.04),避免 Ansible 模块因 Python 版本差异出现兼容问题。

部署时先完成基础加固:关闭 root 直接登录、启用防火墙并只放行 22/4505/4506、配置 NTP 同步、设置主机名与 hosts 解析。随后创建运维专用账户,例如 opsadmin,并赋予 sudo 权限。以下为跳板机初始化示例命令:

# 创建运维账户并配置 sudo
useradd -m -s /bin/bash opsadmin
echo "opsadmin ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/opsadmin
chmod 440 /etc/sudoers.d/opsadmin

# 防火墙放行 SSH 与 Salt 端口
firewall-cmd --permanent --add-service=ssh
firewall-cmd --permanent --add-port=4505-4506/tcp
firewall-cmd --reload

# 时间同步
timedatectl set-timezone Asia/Shanghai
chronyc sources -v

部署完成后,从运维终端验证:ssh opsadmin@10.20.0.10 能登录,sudo -l 显示免密,chronyc tracking 显示已同步。这三项是后续批量任务可信执行的基础。

三、SSH 密钥体系:从“能登录”到“可审计”

批量运维不建议使用密码登录。正确做法是:在跳板机上为 opsadmin 生成一对密钥,私钥留在跳板机并设置口令保护,公钥通过 ssh-copy-id 分发到各计算节点。更规范的做法是使用证书签名:由一台离线 CA 签发短期用户证书,节点只信任 CA 公钥,这样新增或离职人员无需逐台改 authorized_keys。

对于本章的入门环境,先用密钥对方式即可。生成与分发示例:

# 在跳板机上生成密钥(示例使用 ed25519)
ssh-keygen -t ed25519 -C "opsadmin@jump01" -f ~/.ssh/id_ed25519

# 分发公钥到单台节点(示例 IP)
ssh-copy-id -i ~/.ssh/id_ed25519.pub opsadmin@10.20.20.11

# 批量分发可借助 for 循环或 Ansible
for ip in $(seq 11 70); do
  ssh-copy-id -o StrictHostKeyChecking=no -i ~/.ssh/id_ed25519.pub opsadmin@10.20.20.$ip
done

分发后必须验证两件事:一是免密登录成功,二是密码登录已被禁用。在节点上修改 /etc/ssh/sshd_config:PasswordAuthentication no、PermitRootLogin no,然后 systemctl reload sshd。验证命令:ssh -o PreferredAuthentications=password opsadmin@10.20.20.11 应被拒绝。这一步不做,密钥体系只是“方便”,不是“安全”。

四、Ansible 与 SaltStack 基础环境安装

两者定位不同:Ansible 无代理、基于 SSH,适合配置下发和一次性任务;SaltStack 有 Minion 常驻,基于消息队列,适合高频状态采集和实时命令。建议在跳板机上同时安装,按场景选用。

Ansible 安装与验证:

# Rocky Linux 9 示例
dnf install -y epel-release
dnf install -y ansible-core

# 配置主机清单
mkdir -p /etc/ansible
cat > /etc/ansible/hosts <<'EOF'
[epyc_nodes]
10.20.20.[11:70]

[epyc_nodes:vars]
ansible_user=opsadmin
ansible_ssh_private_key_file=/home/opsadmin/.ssh/id_ed25519
EOF

# 连通性测试
ansible epyc_nodes -m ping

预期输出中每台节点返回 "ping": "pong"。若出现 UNREACHABLE,优先检查管理交换机 ACL、节点 sshd 状态和密钥权限(chmod 600)。

SaltStack 安装与验证:跳板机作为 Master,计算节点作为 Minion。Master 端安装 salt-master,Minion 端安装 salt-minion 并指向 Master 的 10.20.0.10。Minion 首次启动后会在 Master 上产生待认证密钥,使用 salt-key -L 查看,salt-key -A 批量接受。验证命令:salt '*' test.ping 应返回所有 Minion 的 True。

Ansible 与 SaltStack 可共存,但 Salt Minion 会常驻占用少量内存(约 80–120 MB/节点)。若节点内存紧张,可只保留 Ansible,Salt 仅用于临时排障。

五、环境验收清单

完成以上四步后,用下表逐项确认,全部通过才进入后续批量配置阶段:

检查项命令/方法通过标准
跳板机可达ssh opsadmin@10.20.0.10免密登录成功
节点免密ssh opsadmin@10.20.20.11无需输入密码
密码登录关闭ssh -o PreferredAuthentications=password ...Permission denied
Ansible 连通ansible epyc_nodes -m ping全部 pong
Salt 连通salt '*' test.ping全部 True
时间同步chronyc trackingLeap status: Normal