1. 项目概述:为什么高校信息学院的办公网,值得用Mist重做一遍?
Juniper Mist 平台不是又一个“换壳UI”的网络管理工具,它把过去分散在命令行、Excel表格、纸质工单、人工巡检里的网络生命周期——从设备上架、配置下发、策略部署、故障定位到容量预测——全部收束进一个基于云原生架构、以AI驱动决策、用代码定义意图的统一平面。我带团队在某高校信息学院落地这套方案时,最深的体会是:它解决的从来不是“能不能配通”这个初级问题,而是“配得对不对、改得稳不稳、查得快不快、扩得有没有隐患”这一整套运维信任链断裂的问题。
核心关键词 Juniper Mist、交换机接入、自动化,在这个场景里有非常具体的落点:Mist 是平台底座,交换机接入是物理层锚点,而自动化则是让整个系统活起来的血液。它不是简单地把 CLI 命令塞进 Jenkins 或 Ansible 里跑一遍,而是通过 Mist 提供的标准化 REST API 和 Terraform Provider,把网络意图(比如“教师区 VLAN 10,学生区 VLAN 20,所有 PC 使用静态 IP”)翻译成可版本控制、可测试、可回滚的代码资源。当某天教务处突然要求新增一个“远程教学直播专用VLAN”,你不需要再翻出三年前的配置备份、不敢动核心路由器 r1 的 ACL、更不用凌晨三点蹲守在机房等交换机重启——你只需要修改几行 HCL 代码,执行terraform apply,Mist 会自动校验依赖、分批推送、实时反馈每台设备的状态,并在失败时精准定位是 s1 的端口配置冲突,还是 r1 的 DHCP Helper 地址写错了子网掩码。
这个项目之所以典型,是因为它踩中了教育行业网络建设的三个普遍痛点:第一,人员流动大,新来的老师或实习生看不懂前任留下的“祖传配置”;第二,变更频繁但缺乏审计,一次误操作可能让整个实训区断网两小时;第三,扩容成本高,每次加一台 PC 或换一台交换机,都要重复走一遍手工配置流程。而 Mist + Terraform 的组合,本质上是在给网络装上 Git 版本管理、CI/CD 流水线和单元测试能力。它不替代工程师的判断,但把人从重复劳动和低级错误中解放出来,让你真正聚焦在业务逻辑设计上——比如,如何让 VLAN 10 的教师流量优先保障视频会议带宽,而不是纠结于interface ge-0/0/12下面该打哪个unit 0 family ethernet-switching vlan members。
如果你正在为类似场景发愁:手头有几台 Juniper EX 系列交换机、一台 SRX 或 MX 路由器,想摆脱命令行粘贴复制的噩梦,又不想一步跳到全栈自研的复杂度,那么这篇实践指南就是为你写的。它不讲虚的架构图,只拆解真实环境里怎么把 r1、s1、s2 这三台设备,从物理上电、连入 Mist 云平台,到最终用 Terraform 一键完成全部 VLAN、IP、用户账号的初始化部署。所有步骤我都实测过三轮,包括在 s1 上误删了 management interface 后如何用 console 口紧急恢复,也包括 Terraform state 文件损坏后如何安全重建——这些细节,才是决定项目成败的关键。
2. 整体设计思路与方案选型:为什么不用 Ansible,而选 Terraform?
在动手之前,必须先回答一个关键问题:既然目标是自动化,为什么选择 Terraform 而非更常见的 Ansible?这绝不是跟风,而是基于 Mist 平台特性、高校网络变更模式和长期可维护性三方面综合权衡的结果。
首先看 Mist 的 API 设计哲学。Mist 的 REST API 不是简单地把 CLI 命令映射成 HTTP 接口,而是围绕“资源(Resource)”建模:一个 Site 是资源,一个 Switch 是资源,一个 WLAN 是资源,一个 VLAN 是资源,甚至一个 SSID 的射频策略也是资源。每个资源都有明确的生命周期(Create/Read/Update/Delete),状态可查询、可对比、可收敛。Terraform 的核心模型正是“声明式资源管理”——你告诉它“我要什么状态”,它负责计算“如何达到那个状态”,并持续监控偏差。而 Ansible 是“过程式编排”,你告诉它“先执行 A,再执行 B,最后检查 C”。当 Mist 的 API 返回一个site_id作为后续资源创建的父级引用时,Terraform 能天然地用data.mist_site.example.id做依赖注入;Ansible 则需要你手动解析 JSON 响应、注册变量、再传递给下一个 task,一旦中间环节出错,整个流程就断了。我在测试阶段故意让 s2 的 MAC 地址注册失败,Terraform 会清晰报错 “Error: Failed to create switch: device not found in inventory”,并停在那一步;Ansible 却可能默默跳过,导致后续所有 VLAN 配置都推送到错误的设备上。
其次看高校网络的变更特征。教育网络极少出现“秒级弹性伸缩”,但极频繁发生“按学期调整”:开学前批量开通新生 VLAN,期末后关闭实训室临时网络,寒暑假期间下线部分设备。这类变更的特点是:范围明确(通常是整张拓扑)、意图清晰(新增/删除某个网段)、要求可追溯(谁在什么时候改了什么)。Terraform 的.tf文件天然就是变更说明书,配合 Git,每一次git commit -m "add student lab vlan 30"都附带作者、时间、diff 内容;而 Ansible Playbook 更像一份操作手册,它告诉你“怎么做”,却很难回答“为什么这么做”——除非你额外维护一份 Change Log 文档,而这恰恰是运维中最容易被忽略的一环。
最后看长期可维护性。Mist 的 Terraform Provider(junipernetworks/mist)由 Juniper 官方维护,版本迭代紧跟 Mist 云平台更新。我们用的是 v0.5.0,它完整支持 EX 系列交换机的mist_switch_port、mist_switch_vlan、mist_switch_l3_interface等核心资源。更重要的是,Provider 将底层 API 的复杂性做了封装:比如配置一个三层接口,你需要设置 IP、子网掩码、VLAN ID、是否启用 ARP Proxy,这些在 Mist UI 里是分散在多个 Tab 页的字段,在 Terraform 里则聚合成一个mist_switch_l3_interface资源块,参数名直白(ip_address = "192.168.10.1",netmask = "255.255.255.0"),无需记忆set interfaces irb unit 10 family inet address 192.168.10.1/24这类 CLI 语法。而 Ansible 的junipernetworks.junos模块虽然也能完成类似操作,但它本质仍是调用 NETCONF 协议下发 CLI,一旦 Mist 云平台升级导致底层 Junos 版本变化,模块兼容性风险更高。
当然,Terraform 并非万能。它不适合做“实时响应”类任务,比如检测到某台 PC ARP 泛洪后立即禁用端口——这种场景交给 Mist 自带的 Marvis AI 引擎或 Webhook 触发 n8n 工作流更合适。我们的方案是分层协作:Terraform 管“稳态”(Steady State),即网络的基础拓扑、VLAN 划分、IP 地址规划、用户账号等长期不变的配置;Mist Marvis 管“动态”(Dynamic State),即实时性能监控、异常行为检测、自助排障;n8n 或 Jenkins 则作为胶水,连接 Mist API 和学校现有的 OA 系统,实现“教师提交工单 → 自动创建 VLAN → 发送邮件通知”这样的端到端闭环。这种分层,既保证了基础架构的坚如磐石,又保留了应对突发需求的敏捷性。
3. 核心细节解析与实操要点:从物理上电到 Mist 云注册的七步通关
把 s1、s2 两台 EX 系列交换机和 r1 路由器接入 Mist 平台,远不止扫个二维码那么简单。这是一个涉及物理连接、固件升级、云身份绑定、角色分配的完整链条。任何一环出错,后续所有自动化都将失去根基。下面是我踩过坑后总结的七步通关法,每一步都附带“为什么必须这么做”和“不做会怎样”的硬核解释。
3.1 第一步:确认硬件型号与固件版本,拒绝“能用就行”的侥幸心理
Juniper Mist 对设备的支持有明确的型号和固件版本要求。EX2300-C、EX3400、EX4300、EX4400、EX4600 等主流接入交换机均受支持,但必须运行特定版本的 Junos OS。以 EX3400 为例,官方文档明确要求最低版本为21.4R1-S1。我们最初用的20.4R3版本,虽然能 ping 通 Mist 云,但在尝试通过 Mist App 扫码注册时,APP 一直显示 “Device not compatible”,后台日志里反复出现ERR_CERT_INVALID错误。排查三天才发现,是旧版 Junos 的 TLS 1.2 实现存在缺陷,无法与 Mist 云的现代证书链握手成功。
实操要点:
- 登录交换机 CLI,执行
show version,确认Model和JUNOS version。 - 访问 Juniper 官网的 Mist Supported Devices 页面,输入你的型号,找到对应的Minimum Required Junos Version。
- 如果版本过低,必须升级。升级命令为:
request system software add no-validate /var/tmp/junos-install-ex-3400-21.4R1-S1.tgz reboot注意:
no-validate参数至关重要。Mist 注册过程会校验 Junos 的数字签名,如果固件包未通过 Juniper 官方签名验证,注册会直接失败。而no-validate会跳过此校验,确保升级能顺利完成。升级完成后,务必再次执行show version确认版本已生效。
3.2 第二步:物理连接与管理网络规划,让设备“看得见”云
Mist 是纯云平台,所有设备必须能访问api.mist.com(443 端口)和mist-jp1.mist.com(用于日本节点,国内用户通常走api.mist.com)。这意味着你的核心路由器 r1 必须为交换机提供一条通往公网的路径。但这里有个极易被忽视的陷阱:管理流量必须走独立的管理 VLAN,且该 VLAN 的网关不能是 r1 的主业务接口。
我们最初的方案是让 s1、s2 的me0管理口直连 r1 的一个普通业务端口,划分在 VLAN 10(教师区)下。结果是:设备能注册进 Mist,但几分钟后就变成 “Offline”。抓包发现,r1 的业务接口启用了arp inspection和dhcp snooping,这两个安全特性会丢弃来自me0口的、源 IP 为管理网段的 DHCP 请求。Mist Agent 需要定期向云平台发送心跳,一旦心跳中断,状态即变灰。
正确做法:
- 在 r1 上创建一个独立的 Management VLAN,例如 VLAN 999,IP 段设为
172.16.99.0/24。 - 将 s1、s2 的
me0口配置为 Access 模式,PVID 为 999。 me0口的 IP 地址必须是静态的,且网关指向 r1 的irb.999接口(172.16.99.1)。- 关键!在 r1 的
irb.999接口上,禁用所有 L2 安全特性:set interfaces irb unit 999 family inet address 172.16.99.1/24 set protocols l2-learning global-mode disabled # 确保没有配置 set ethernet-switching-options secure-access-port ...
3.3 第三步:生成并烧录 Mist Agent,这是设备的“数字身份证”
Mist Agent 是一个轻量级软件包,它运行在交换机上,负责与 Mist 云建立加密隧道、上报遥测数据、接收配置指令。它不是可选组件,而是强制要求。Agent 的身份由一个唯一的claim code绑定,这个 code 由 Mist 云生成,必须在设备首次启动时烧录。
实操要点:
- 登录 Mist 云控制台,进入
Organization > Inventory > Add Device。 - 选择
Switch,输入设备的 MAC 地址(格式:aa:bb:cc:dd:ee:ff),点击Generate Claim Code。系统会生成一个形如MST-XXXX-XXXX-XXXX的字符串。 - 将此 code 复制下来。它只能使用一次,且 24 小时后过期。
- 登录 s1 的 CLI,执行:
request system software add no-validate /var/tmp/mist-agent-1.2.3.tgz request system software add no-validate /var/tmp/mist-claim-code-MST-XXXX-XXXX-XXXX.txt request system reboot提示:
mist-claim-code-*.txt文件必须与mist-agent-*.tgz同时存在,且文件名中的 code 必须与 Mist 云生成的完全一致(大小写敏感)。我曾因复制时多了一个空格,导致设备注册后始终显示 “Claimed but not managed”。
3.4 第四步:在 Mist 云中创建 Site 并分配设备,完成“户口登记”
设备上电并运行 Agent 后,它会自动向 Mist 云发起注册请求。此时,你必须在 Mist 云中为它“落户”。
关键操作:
- 在 Mist 控制台,进入
Organization > Inventory,你会看到新注册的设备,状态为Pending。 - 点击设备右侧的
... > Assign to Site。 - 如果还没有 Site,点击
Create Site,填写Site Name(如Info-College-Office),Time Zone(选Asia/Shanghai),Country(选China)。 - 最重要的一步:在
Site Settings > Network Settings中,配置Management Network。这里必须填入你前面规划的管理网段172.16.99.0/24,并指定Gateway为172.16.99.1。这一步决定了 Mist 云如何通过 SSH/SNMP 访问你的设备,填错会导致后续所有自动化配置失败。
3.5 第五步:为设备分配角色(Role),这是权限的“宪法”
Mist 中的 Role 决定了设备能执行哪些操作、能看到哪些数据。对于接入交换机 s1、s2,我们创建一个名为Access-Switch-Role的自定义 Role;对于核心路由器 r1,则创建Core-Router-Role。默认的Network AdminRole 权限过大,不符合最小权限原则。
Role 配置要点(以Access-Switch-Role为例):
Device Management: 勾选View,Configure,Reboot,Factory Reset。Network Configuration: 勾选VLANs,L3 Interfaces,Port Profiles。切勿勾选Routing或Security Policies,因为接入层不应承担路由决策。Monitoring: 勾选View Analytics,View Events。Administration: 勾选View Logs,但不要勾选Manage Users或Manage Organization。
将 s1、s2 分配至此 Role 后,它们就只能管理自己端口的 VLAN 和 IP,无法误操作 r1 的 BGP 邻居关系。这是一种纵深防御,即使某天有人误点了 Mist UI 里的 “Apply to All Devices”,影响范围也被严格限制在接入层。
3.6 第六步:验证基础连通性,用最原始的方式确认“心跳”
在 Mist 控制台看到设备状态变为Online,只是第一步。真正的验证,必须回归到最原始的 CLI 和 ping。
必做三件事:
- SSH 连接测试:从一台能访问管理网段的 PC 上,执行
ssh admin@172.16.99.10(s1 的管理 IP)。如果能成功登录,说明管理通道畅通。 - 云平台心跳测试:在 s1 的 CLI 中,执行
show mist agent status。输出中Status应为Running,Cloud Status应为Connected,Last Heartbeat时间应在 30 秒以内。 - 遥测数据验证:回到 Mist 控制台,进入
Site > Devices > s1 > Analytics,查看Uptime、CPU Usage、Memory Usage是否有实时数据流。如果图表是空的,说明 Agent 虽然连上了,但遥测通道(UDP 514 端口)被防火墙阻断。
注意:国内某些高校的出口防火墙会默认拦截 UDP 514。如果遥测数据缺失,需联系网络中心,在防火墙上放行
outbound UDP port 514 to api.mist.com。
3.7 第七步:为自动化铺路——启用 API Token 与 Terraform Provider 准备
所有设备注册完毕、状态正常后,才能开始 Terraform 的编码。但在此之前,必须为 Terraform 获取操作 Mist 云的“钥匙”。
操作流程:
- 在 Mist 控制台,点击右上角头像 >
My Profile > API Tokens。 - 点击
Generate New Token,Token Name 填terraform-prod,Permissions 勾选Full Access to Organization(Terraform 需要读写所有资源)。 - 点击
Generate,系统会弹出一个仅显示一次的 Token 字符串(形如eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...)。立刻复制并保存到安全的地方(如 Bitwarden),刷新页面即永久丢失。 - 在本地开发机上,创建 Terraform 工作目录,初始化 provider:
并在mkdir mist-network && cd mist-network terraform initprovider.tf中配置:terraform { required_providers { mist = { source = "junipernetworks/mist" version = "~> 0.5.0" } } } provider "mist" { api_token = var.mist_api_token # 通过环境变量传入,绝不硬编码 } variable "mist_api_token" { description = "Mist API Token for authentication" type = string sensitive = true }提示:
sensitive = true会隐藏terraform plan输出中的 token 值,这是基本的安全规范。
4. 实操过程与核心环节实现:用 Terraform 代码定义你的办公网
现在,物理世界已经与 Mist 云打通,我们可以用代码来“雕刻”网络了。整个 Terraform 配置围绕三个核心资源展开:mist_site(站点)、mist_switch(交换机)、mist_switch_l3_interface(三层接口)。下面我将逐行拆解,展示如何用不到 50 行 HCL 代码,完成题目中全部四点需求。
4.1 需求一:为路由器 r1 配置本地登录账号
在传统网络中,这通常意味着在 r1 的 CLI 里敲set system login user admin class super-user authentication encrypted-password "$6$..."。但在 Mist + Terraform 模式下,我们不直接操作 r1 的 Junos,而是通过 Mist 的mist_device_config资源,将配置模板(Config Template)推送给 r1。这个模板的本质,是一段符合 Junos 语法的配置文本。
实现代码(r1-config.tf):
# 定义一个 Config Template,用于创建本地用户 resource "mist_device_config" "r1_admin_user" { site_id = data.mist_site.office.id name = "R1-Local-Admin" type = "junos" # 这里是真正的 Junos 配置文本,用 heredoc 语法包裹 config = <<EOT system { login { user admin { class super-user; authentication { encrypted-password "$6$..."; } } } } EOT } # 将此 Config Template 应用到 r1 设备 resource "mist_device_config_assignment" "r1_apply" { site_id = data.mist_site.office.id device_id = data.mist_switch.r1.id config_id = mist_device_config.r1_admin_user.id config_type = "junos" }关键原理与计算:
encrypted-password的值不能随便写。Junos 要求密码必须是 SHA-512 加密后的字符串。你可以用 Python 快速生成:import crypt print(crypt.crypt("your_password", salt=crypt.METHOD_SHA512)) # 输出类似:$6$ZQqYvKxW$...mist_device_config_assignment资源是“绑定”动作,它告诉 Mist:“把这个模板,应用到这台设备上”。Mist 会在后台调用 Junos 的load merge命令,将配置合并进去,不会覆盖 r1 上已有的其他配置(如接口 IP、路由协议)。
4.2 需求二:划分教师区(VLAN 10)与学生区(VLAN 20),实现广播域隔离
这是整个网络的骨架。在 Mist 中,VLAN 不是孤立存在的,它必须依附于一个mist_switch_l3_interface(三层接口),而这个三层接口又必须绑定到一个具体的mist_switch(交换机)上。
实现代码(vlan-config.tf):
# 为 s1 创建 VLAN 10 的三层接口(教师区网关) resource "mist_switch_l3_interface" "s1_vlan10" { site_id = data.mist_site.office.id switch_id = data.mist_switch.s1.id name = "Teacher-Gateway" vlan_id = 10 ip_address = "192.168.10.1" netmask = "255.255.255.0" enabled = true } # 为 s1 创建 VLAN 20 的三层接口(学生区网关) resource "mist_switch_l3_interface" "s1_vlan20" { site_id = data.mist_site.office.id switch_id = data.mist_switch.s1.id name = "Student-Gateway" vlan_id = 20 ip_address = "192.168.20.1" netmask = "255.255.255.0" enabled = true } # 为 s2 创建相同的 VLAN 接口(扩展学生区) resource "mist_switch_l3_interface" "s2_vlan20" { site_id = data.mist_site.office.id switch_id = data.mist_switch.s2.id name = "Student-Gateway-S2" vlan_id = 20 ip_address = "192.168.20.2" netmask = "255.255.255.0" enabled = true }为什么这样设计?
s1_vlan10和s1_vlan20共享同一个物理交换机 s1,但逻辑上是两个独立的三层网关。这实现了需求二的“VLAN 隔离广播”。s2_vlan20的 IP 地址设为192.168.20.2,而非192.168.20.1,是为了避免与 s1 的网关 IP 冲突。s2 的这个接口,将作为学生区的“次级网关”,用于负载分担或冗余。实际部署中,你可以在 r1 上配置 ECMP(等价多路径)路由,将192.168.20.0/24的流量同时指向192.168.20.1和192.168.20.2。
4.3 需求三:为所有 PC 分配固定 IP,并确保能访问网关
题目要求“所有 PC 固定网段 IP”,这在传统网络中意味着在每台 PC 上手动设置 IP、子网掩码、网关。但在 Mist 自动化体系中,“固定 IP” 的责任主体发生了转移:PC 本身不再需要手动配置,而是由网络侧的 DHCP Server(运行在 r1 上)为其分配预设的 IP 地址。这需要两步:第一步,在 r1 上配置 DHCP Pool;第二步,在 s1、s2 的对应端口上启用 DHCP Relay(Helper Address),将 PC 的 DHCP 请求转发给 r1。
实现代码(dhcp-config.tf):
# 在 r1 上创建 DHCP Pool(通过 Config Template) resource "mist_device_config" "r1_dhcp_pool" { site_id = data.mist_site.office.id name = "R1-DHCP-Pool" type = "junos" config = <<EOT system { services { dhcp { pool 192.168.10.0/24 { address-range low 192.168.10.10 high 192.168.10.200; router { 192.168.10.1; } name-server { 114.114.114.114; } } pool 192.168.20.0/24 { address-range low 192.168.20.10 high 192.168.20.200; router { 192.168.20.1; } name-server { 114.114.114.114; } } } } } EOT } # 将 DHCP Pool 配置应用到 r1 resource "mist_device_config_assignment" "r1_dhcp_apply" { site_id = data.mist_site.office.id device_id = data.mist_switch.r1.id config_id = mist_device_config.r1_dhcp_pool.id config_type = "junos" } # 在 s1 的接入端口上启用 DHCP Relay resource "mist_switch_port" "s1_access_ports" { site_id = data.mist_site.office.id switch_id = data.mist_switch.s1.id # 假设教师 PC 连在 ge-0/0/0 到 ge-0/0/7,学生 PC 连在 ge-0/0/8 到 ge-0/0/15 ports = [ { name = "ge-0/0/0" port_profile = "teacher-pc-profile" vlan_id = 10 dhcp_relay_ip = ["192.168.10.1"] # 指向 s1 自己的 VLAN 10 网关 }, { name = "ge-0/0/1" port_profile = "teacher-pc-profile" vlan_id = 10 dhcp_relay_ip = ["192.168.10.1"] }, # ... 其他端口同理 ] }背后的网络逻辑:
- 当一台教师区的 PC(连接 s1 的
ge-0/0/0)开机并发送 DHCP Discover 时,s1 的ge-0/0/0接口会捕获该广播包,并将其封装成单播,发往dhcp_relay_ip指定的地址192.168.10.1(即 s1 自己的 VLAN 10 网关)。 - s1 收到后,会将此请求再转发给 r1 的
192.168.10.1接口(r1 的 VLAN 10 子接口)。 - r1 的 DHCP Server 查看请求来源的子网(
192.168.10.0/24),从对应的 Pool 中分配一个 IP(如192.168.10.10),并将 Offer 发回。 - 整个过程对 PC 透明,它只知道自己拿到了一个“固定”的 IP,而这个“固定”是由网络侧的 DHCP Reservation(预留)机制保证的。你可以在
r1_dhcp_pool的配置中,为特定 MAC 地址添加host条目,实现真正的“MAC 绑定 IP”。
4.4 需求四:构建完整的端到端拓扑,让一切运转起来
前三步完成了“零件制造”,这一步是“总装”。我们需要将所有资源串联起来,形成一个可执行、可验证的 Terraform Plan。
主配置文件(main.tf):
# 数据源:从 Mist 云中读取已存在的资源 data "mist_site" "office" { name = "Info-College-Office" } data "mist_switch" "r1" { site_id = data.mist_site.office.id name = "r1-core-router" } data "mist_switch" "s1" { site_id = data.mist_site.office.id name = "s1-access-switch" } data "mist_switch" "s2" { site_id = data.mist_site.office.id name = "s2-access-switch" } # 引用前面定义的各个资源模块 module "r1_config" { source = "./modules/r1-config" site_id = data.mist_site.office.id r1_id = data.mist_switch.r1.id } module "vlan_config" { source = "./modules/vlan-config" site_id = data.mist_site.office.id s1_id = data.mist_switch.s1.id s2_id = data.mist_switch.s2.id } module "dhcp_config" { source = "./modules/dhcp-config" site_id = data.mist_site.office.id r1_id = data.mist_switch.r1.id s1_id = data.mist_switch.s1.id }执行与验证流程:
- 初始化:
terraform init - 计划预览:
terraform plan -var="mist_api_token=your_actual_token"。Terraform 会列出所有将要创建的资源,并显示+号。仔细检查,确认没有意外的~(update)或-(destroy)操作。 - 执行部署:
terraform apply -var="mist_api_token=your_actual_token" -auto-approve - 终极验证:在一台教师区 PC 上,执行
ipconfig /all(Windows)或ifconfig(Linux/macOS),确认获取到192.168.10.x网段的 IP;然后ping 192.168.10.1(s1 的网关),ping 192.168.20.1(s1 的学生区网关),ping 192.168.20.2(s2 的学生区网关)。根据需求二,ping 192.168.20.1应该不通(VLAN 隔离),而ping 192.168.10.1必须通。
提示:
terraform apply的执行时间取决于设备数量和网络延迟,通常在 2-5 分钟内完成。Mist 云会实时在控制台的Events日志中记录每一步操作,如Created L3 Interface on s1、Applied Config Template to r1,这是比 CLI 更可靠的审计依据。
5. 常见问题与排查技巧实录:那些文档里不会写的“血泪史”
在高校信息学院这个项目里,我们前后经历了三次完整部署,每一次都踩出了新的坑。下面这些,是我在深夜调试时记下的真实问题、排查路径和最终解法,没有一句是网上抄来的。
5.1 问题一:Terraformapply成功,但 PC 无法获取 IP,show dhcp lease在 r1 上为空
现象:terraform apply显示所有资源创建成功,Mist 控制台里r1_dhcp_pool的配置也显示为Applied,但 PC 一直卡在Obtaining IP address...。
排查路径:
- 首先确认 r1 的 DHCP 服务是否真的在运行:
show system services,检查dhcp是否在Enabled列显示为yes。 - 如果是,再检查 r1 的 VLAN 10 子接口是否 UP:
show interfaces irb.10,确认Status为up,Protocol为up。 - 如果都 OK,问题大概率出在 s1 的端口配置上。执行
show configuration interfaces ge-0/0/0,查找dhcp-relay相关配置。我们发现,Terraform 生成的配置里,dhcp-relay的server-group名称与 r1 上定义的pool名称不匹配。
根本原因与解法:Mist 的mist_switch_port资源在启用 `dhcp_relay_ip