ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

多品牌交换机配置命令差异与一键生成脚本实战

多品牌交换机配置命令差异与一键生成脚本实战 干这行久了都会遇到一个场景项目割接前夜几十台接入交换机等着下配置华为、思科、H3C、锐捷四家混在一张拓扑图里命令行敲得手指发酸还生怕哪台设备的VLAN划错、trunk放通漏了。做了快十年网络运维我最大的体会是交换机配置命令本身并不难难的是在多个品牌之间来回切换时保持“一致性”。后来我干脆把整个配置过程做成了一键生成脚本输入设备信息和规划数据脚本自动输出对应品牌的配置命令人工审核后再下发。这篇文章就从这里说起把主流品牌的命令差异拆开讲透再给出一套可以直接借鉴的脚本方案。1. 为什么需要“一键生成脚本”批量配置背后的真实痛点1.1 几十台交换机真正的难点是“一致”单独给一台交换机配命令谁都能上手。但一旦数量上到几十台问题就变了。人不是机器连续复制粘贴两小时之后很容易把一台设备的VLAN规划套到另一台上或者在一个接口上敲了两次不同命令现场越改越乱。我见过不止一次因为某台接入交换机的trunk口被写成access口上线后整个下行网络直接瘫痪。更麻烦的是团队协作的差异。同样一个需求有人习惯先建VLAN再配接口有人喜欢在接口视图里顺手把描述也写了生成出的配置风格五花八门。后续运维的人接到手看配置像看考古现场排查问题要花额外时间。这种场景下一键生成脚本的价值不是省几十分钟而是把所有设备的配置拉到一个标准线上。1.2 多品牌命令差异不只是单词不一样很多人以为华为、H3C同源命令应该差不多思科和锐捷也有“教科书式”的相似。但实际落到命令行差异全是细节。比如同是“进入系统视图”华为用system-view思科用configure terminal同是“保存配置”华为敲save思科敲writeH3C要用save force锐捷可能两种都认也可能认copy running-config startup-config。这些差异平时不痛不痒但写脚本统一生成时任何一个细节错了整批配置就可能废掉。我整理了一个四家品牌高频操作的对照表基本覆盖日常接入交换机的常见配置操作华为思科H3C锐捷进入系统视图system-viewconfigure terminalsystem-viewconfigure terminal进入接口interface GigabitEthernet0/0/1interface GigabitEthernet0/1interface GigabitEthernet0/0/1interface GigabitEthernet0/0/1创建VLANvlan 10vlan 10vlan 10vlan 10接口划入VLANport link-type accessport default vlan 10switchport mode accessswitchport access vlan 10port link-type accessport default vlan 10switchport mode accessswitchport access vlan 10配置Trunkport link-type trunkport trunk allow-pass vlan allswitchport mode trunkswitchport trunk allowed vlan allport link-type trunkport trunk permit vlan allswitchport mode trunkswitchport trunk allowed vlan all配置管理IPinterface Vlanif 10ip address 192.168.10.2 24interface Vlan10ip address 192.168.10.2 255.255.255.0interface Vlan-interface 10ip address 192.168.10.2 24interface Vlan 10ip address 192.168.10.2 255.255.255.0删除配置undonoundono保存配置savewritesave forcewrite这张表是脚本生成命令的核心依据。别看命令就几个单词背后是每家厂商对配置视图、接口命名、VLAN接口实现方式的不同理解。把这些差异吃透才有资格谈“一键生成”。2. 四家主流品牌的配置命令差异拆解2.1 华为视图层级和undo是灵魂华为交换机的命令行是典型的分层视图模型。登录后先在system-view进入系统视图然后逐层进入接口视图、VLAN视图等子视图配置命令只对当前视图有效。这种模式的好处是层次清晰不容易误操作其他对象。华为命令里最值得说的是undo。任何一条配置前面加undo就是删除比如配置错了undo port default vlan 10就能把接口从VLAN 10移出来。这对脚本生成非常友好因为如果要在已有配置的设备上做增量调整只要针对字段生成undo或正命令即可。接入交换机的典型华为配置片段长这样sysname ACC-SW01 vlan batch 10 20 interface GigabitEthernet0/0/1 port link-type access port default vlan 10 undo shutdown interface GigabitEthernet0/0/23 port link-type trunk port trunk allow-pass vlan 10 20 undo shutdown interface Vlanif 10 ip address 192.168.10.2 255.255.255.0配置管理IP时华为用的是三层VLAN接口Vlanif如果VLAN 10不存在这个接口是起不来的。批量生成时要先创建VLAN再配置VLANIF。很多新手在这里翻车管理VLAN明明写在规划里结果设备上线后ping不通网关一看VLANIF没生效。保存配置时华为的save命令默认会询问是否确认交互式确认在脚本执行时很烦人。所以自动化场景下要么用save配合Y的应答要么用save force跳过确认。不同版本的华为设备对save force支持情况略有差异建议在真实设备上先验证。2.2 思科IOS风格直给且全面思科交换机的命令行风格影响了大量后续厂商很多人上手思科会觉得逻辑直接enable进入特权模式configure terminal进入全局配置接口视图下用switchport系列命令控制二层属性。没有undo统一用no前缀做删除。思科接口编号和华为差异很大常见的是GigabitEthernet0/1没有华为那种“槽位/板卡/端口”的三段式结构。不同型号、不同堆叠模式下接口编号还会变批量生成脚本时千万不能凭感觉硬写接口名必须基于设备真实的接口表。下面是一个思科接入交换机的典型配置hostname ACC-SW01 vlan 10 name Office vlan 20 name Camera interface GigabitEthernet0/1 switchport mode access switchport access vlan 10 no shutdown interface GigabitEthernet0/23 switchport mode trunk switchport trunk allowed vlan 10,20 no shutdown interface Vlan10 ip address 192.168.10.2 255.255.255.0注意思科默认开启VLAN 1而且接口默认状态经常是no shutdown。另外思科的switchport trunk allowed vlan默认是all如果你希望只放通指定VLAN必须写清楚。如果脚本里漏了这行配置下发后trunk会放通所有VLAN这在有些安全要求高的环境里算事故。思科保存配置用write memory或者copy running-config startup-config。脚本里统一用write memory简短且通用但如果设备没有完整IOS命令集可能不支持简写所以生成命令时不要用缩写保持完整单词最稳妥。2.3 H3C华为“近亲”但命令细节别想当然H3C和华为在命令行形态上很像都是system-view进入系统视图配置接口、创建VLAN的方式也接近。但如果你直接把华为脚本套到H3C上大概率会碰到命令不识别。最典型的差异有三个。第一trunk命令华为是port trunk allow-pass vlan allH3C是port trunk permit vlan all一个allow-pass一个permit看起来都能懂但命令解析器只认自己那套。第二管理接口华为是interface Vlanif 10H3C是interface Vlan-interface 10多了个连接符。第三保存H3C的save在部分版本需要加force参数否则会交互确认。H3C接入交换机的例子sysname ACC-SW01 vlan 10 vlan 20 interface GigabitEthernet0/0/1 port link-type access port default vlan 10 undo shutdown interface GigabitEthernet0/0/23 port link-type trunk port trunk permit vlan 10 20 undo shutdown interface Vlan-interface 10 ip address 192.168.10.2 255.255.255.0H3C的接口命名同样常见GigabitEthernet0/0/1与华为接近但少量框式设备、无线交换机、汇聚设备的命名会不同。我的做法是在脚本里把接口名作为设备数据的一部分传入而不是写死在模板中这样换型号时只改数据不改代码。2.4 锐捷兼容思科又比思科更“亲民”锐捷交换机面向国内项目命令行有鲜明的“思科影子”。它支持configure terminal、switchport mode access、switchport access vlan这一套老网工上手很顺。但锐捷同时吸收了一些国内用户习惯比如接口下可能直接支持switchport interface vlan这类快捷命令不同版本差异较大。锐捷接入交换机常见配置hostname ACC-SW01 vlan 10 vlan 20 interface GigabitEthernet0/0/1 switchport mode access switchport access vlan 10 no shutdown interface GigabitEthernet0/0/23 switchport mode trunk switchport trunk allowed vlan 10,20 no shutdown interface Vlan 10 ip address 192.168.10.2 255.255.255.0锐捷的接口编号在不同系列上很“自由”老款可能GigabitEthernet0/1新款可能GigabitEthernet0/0/1还有TenGigabitEthernet这类万兆口命名。批量生成脚本时接口名这一列必须从设备真机或官方文档里来。保存配置时锐捷支持write部分版本也支持copy running-config startup-config。我习惯在脚本模板里把保存命令设为可配置项默认写write如果设备不支持再单独改模板而不是全局替换。3. 一键生成脚本的设计思路与实现3.1 先把“数据”和“命令”分开做脚本之前要先想清楚一个核心问题什么样的东西适合“一键生成”答案不是把命令写死在代码里而是把“设备数据”和“命令模板”彻底分离。所谓设备数据就是这台设备叫什么、什么品牌、管理IP是多少、有哪些VLAN、哪些接口划到哪些VLAN、哪些口做trunk。这些是“事实”会随着项目变化而变化。命令模板则是固定的、针对某个品牌的配置命令序列。只要把数据和模板分开新增一台设备时只需改数据模板完全不动。这就像一个“配置翻译器”你告诉它“这台交换机有VLAN 10和201口划到VLAN 10”它输出对应品牌的命令行。如果项目里用的是华为模板输出华为命令换成思科模板换成思科命令。逻辑简单但非常管用。3.2 确定输入方式JSON/YAML还是Excel设备数据的承载方式决定了脚本好不好用。我试过几种最简单的是在Python代码里写死字典适合一次性小批量稍微正式一点的是用JSON或YAML文件存设备清单适合版本管理如果团队里有非技术同事参与也可以用Excel表脚本读Excel后转成内部结构。我比较推荐YAML或JSON因为可以直接用版本管理工具追踪变更。下面是一个设备数据的JSON示例{ device_name: ACC-SW01, brand: huawei, mgmt_vlan: 10, mgmt_ip: 192.168.10.2, mgmt_mask: 255.255.255.0, gateway: 192.168.10.254, vlans: [ {id: 10, name: Office}, {id: 20, name: Camera} ], access_ports: { GigabitEthernet0/0/1: 10, GigabitEthernet0/0/2: 10, GigabitEthernet0/0/3: 20 }, trunk_ports: [GigabitEthernet0/0/23, GigabitEthernet0/0/24] }这套数据里没有一条命令只有规划信息。真正的命令生成由模板完成。这样做的另一个好处是数据类型可以根据项目扩展。比如增加“端口描述”“PoE开关”“STP优先级”等字段模板和代码只需做小幅扩展。3.3 用Jinja2模板把数据变成配置模板引擎我选择Jinja2因为它能在纯文本模板里做循环和条件判断这正是网络配置生成需要的。Jinja2不是只能写HTML它处理任何文本都可以。生成配置时我针对每个品牌写一个模板文件模板里用变量接收设备数据。一个简单的华为模板长这样sysname {{ device_name }} {% for vlan in vlans %} vlan {{ vlan.id }} name {{ vlan.name }} {% endfor %} {% for port, vlan_id in access_ports.items() %} interface {{ port }} port link-type access port default vlan {{ vlan_id }} undo shutdown {% endfor %} {% for port in trunk_ports %} interface {{ port }} port link-type trunk port trunk allow-pass vlan {% for vlan in vlans %}{{ vlan.id }}{% if not loop.last %} {% endif %}{% endfor %} undo shutdown {% endfor %} interface Vlanif {{ mgmt_vlan }} ip address {{ mgmt_ip }} {{ mgmt_mask }}有人可能觉得这比直接写命令还复杂但模板的价值在于复用。如果现场需要调整比如增加一个VLAN只需改JSON数据重新执行脚本所有接入交换机配置都会自动更新。同一套模板还可以生成不同品牌的变体只要把模板文件替换成对应的品牌版本。3.4 脚本主体读取数据、渲染模板、输出文件脚本本身不复杂。我用Python实现大致流程是读取JSON/YAML文件解析出设备列表遍历每台设备根据品牌选择模板传入数据渲染最后把结果写入单独的文件。核心代码大致长这样import json import argparse from pathlib import Path from jinja2 import Environment, FileSystemLoader, select_autoescape def load_template(brand: str): env Environment( loaderFileSystemLoader(templates), autoescapeselect_autoescape() ) return env.get_template(f{brand}.j2) def generate_config(device: dict) - str: template load_template(device[brand]) return template.render(**device).strip() \n def main(): parser argparse.ArgumentParser(descriptionGenerate switch configs) parser.add_argument(--inventory, requiredTrue, helpPath to JSON inventory) parser.add_argument(--output, defaultoutput, helpOutput directory) args parser.parse_args() with open(args.inventory, r, encodingutf-8) as f: devices json.load(f) out_dir Path(args.output) out_dir.mkdir(parentsTrue, exist_okTrue) for device in devices: config generate_config(device) out_file out_dir / f{device[device_name]}_{device[brand]}.conf out_file.write_text(config, encodingutf-8) print(f[OK] {device[device_name]} - {out_file}) if __name__ __main__: main()这不是一个完整的生产级脚本但骨架已经立起来了。真正在工作中我会加上日志、校验、备份等环节比如生成后立刻在配置里检查是否包含“VLAN”和“interface”避免模板渲染出错导致空文件。脚本的价值不是替代人而是把所有重复性劳动压缩到几秒内让人有精力去关注规划本身。4. 实操过程从一份设备清单到全套配置4.1 步骤一盘点设备信息把规划变成数据真正动手前先要把网络规划整理成结构化数据。别嫌这一步啰嗦它直接决定脚本生成出来的配置是否可用。需要收集的信息包括设备名称、品牌型号、管理IP、管理VLAN、网关地址、VLAN列表及名称、access端口与VLAN的对应关系、trunk端口列表以及是否需要生成端口描述等附加信息。以一个小型办公网络为例设备规划可能是这样的设备名品牌管理IP管理VLAN备注ACC-SW01huawei192.168.10.210一层接入ACC-SW02cisco192.168.10.310一层接入ACC-SW03h3c192.168.10.410二层接入ACC-SW04ruijie192.168.10.510二层接入VLAN规划统一为10就是办公网段20就是摄像头网段。接口规划按接入设备的物理位置来定比如1-16口办公17-24口摄像头23-24口做trunk上联。整理成数据后填进JSON清单。这一步大概花二十分钟但能节省后续几个小时。4.2 步骤二编写模板先在一台设备上验证编辑模板时不要同时生成几百份配置应该先拿一台设备做小规模验证。比如先用ACC-SW01的数据跑一遍脚本输出生成的华为配置然后对照华为官方命令手册或已有设备的running-config逐行核对。这里要特别留意接口命名是否匹配真实设备VLANIF是否建到了正确的VLAN上trunk放通的VLAN列表是否完整。验证通过的模板再用于其他品牌。先把其他品牌的单台设备数据准备好分别生成一份配置逐台对照。如果某个品牌命令有出入只改对应模板不改代码。这个过程在项目初期会重复几次但一旦模板稳定下来后续就是纯粹的数据活。4.3 步骤三批量生成并保留生成日志单台验证通过后就可以正式批量生成。建议脚本把每次生成的配置文件加上时间戳或者放到独立目录避免和上一轮混淆。我习惯在输出目录里同时生成一个manifest文件记录每台设备的生成时间、所用模板版本、数据文件版本这样以后出问题能回溯“这份配置是用什么数据生成出来的”。如果是在网络割接前用脚本我会额外做一步把生成的文件打包扔到测试环境或模拟器里加载一遍确认语法无误。华为有eNSP思科有CML等模拟平台虽然不能完全替代真机但能提前发现大部分模板错误。4.4 步骤四下发前的人工核对与变更管理一键生成不等于无人审核。脚本负责把命令写对人负责确认“命令表达的是不是自己的真实意图”。下发给设备前我至少会抽样看两三份配置重点检查管理IP、VLAN规划、trunk放通范围、保存命令。前面容易出错的地方在这一步基本能拦截掉。下发方式也要想清楚。如果只是几台设备用SecureCRT或Xshell粘贴执行还好如果数量多建议用TFTP或FTP先把配置文件传到设备再用命令加载。用脚本直接SSH下发也可以但要注意不同品牌命令的交互差异比如华为save会弹出确认脚本里要处理。5. 常见问题与排查技巧实录5.1 接口编号不统一导致配置“对不上设备”批量生成脚本最常见的问题是设备数据里的接口名和真实设备不一致。同一品牌的同型号设备可能因为板卡或堆叠模式不同接口编号格式变化很大。华为普通盒式交换机常见GigabitEthernet0/0/1思科一些设备是GigabitEthernet0/1锐捷不同系列可能GigabitEthernet0/0也可能GigabitEthernet4/0。排查办法是先在一台真机上执行display interface brief或show ip interface brief把真实接口列表拉出来再维护一份“接口映射数据”。脚本里不要硬编码接口名而是把它作为设备数据字段传入。数据模型里甚至可以把逻辑口名如“Uplink1”“PC1”和物理接口名分开模板负责翻译逻辑更清晰。5.2 管理VLAN和默认VLAN的坑几乎所有交换机默认都工作在VLAN 1但实际项目中管理VLAN通常不是1。脚本生成配置时如果只创建了VLAN 10却没有把管理接口放在VLAN 10或者创建了VLANIF但没有配置IP设备上线后网络管理员就无法远程登录。我曾经遇到过某台H3C设备管理VLAN写成10但trunk放通列表里漏了VLAN 10结果上联口把管理VLAN隔离在本地导致全网都ping不通这台交换机。所以脚本模板里要建立一条规则管理VLAN必须同时存在于VLAN列表、VLAN接口、trunk放通列表三个地方。生成配置后脚本可以做一次简单检查统计每个管理VLAN是否在trunk的allow列表中如果没有直接抛警告。5.3 保存命令不一致重启后配置全丢这是个最隐蔽的问题。设备配置完成后如果忘记保存或保存命令不对一重启配置恢复出厂。华为设备执行save后默认询问是否保存脚本如果没处理这个交互配置可能根本没存上。H3C的save命令在某些版本也会交互。思科和锐捷相对好一些write直接保存但有些锐捷型号不支持简写必须用完整命令。我的做法是在模板里把保存命令抽成一个变量不同品牌模板填写不同的值。华为模板里填save forceH3C模板里填save force思科和锐捷模板里填write。如果某些版本不支持force参数再针对该型号做单独模板。生成配置后还要在配置文件的最后一行检查保存命令是否存在避免遗漏。5.4 换行符、编码和复制粘贴的隐形问题Windows下编辑的配置文件默认换行符是\r\nLinux下是\n。大部分交换机都能接受但个别设备对格式敏感可能导致粘贴时命令被截断或报错。我在脚本中统一用UTF-8编码并在写入文件时把换行符强制为\n然后再根据目标设备调整。如果遇到必须在Windows下用的同事我会在交付前用脚本做一次格式转换。另一个常见问题是从PDF或网页复制命令时引号被改成中文全角引号或者空格被替换成不间断空格。设备命令行解析器不认这些字符一旦粘贴进去就是语法错误。所以脚本生成的文件必须由脚本直接输出不能经过人手复制中转。如果一定要用文本传递至少在文本编辑器里开启“显示所有字符”检查一遍。问题常见原因排查思路接口配置没生效接口名与真实设备不符拉接口列表替换数据管理IP ping不通管理VLAN不在trunk放通列表检查VLAN和trunk一致性重启后配置丢失保存命令不对或未执行检查配置末尾保存命令命令行粘贴报错全角符号或换行符问题用脚本直出文件避免中转生成文件为空模板变量名与数据不匹配检查Jinja2变量打印调试这些坑不是一次踩完的我每一轮项目都会多踩一两个新的。但有趣的是只要把问题沉淀成检查规则写进脚本它就会变成自动防线。比如我现在生成完配置后会自动检查每个文件的行数、是否含保存命令、是否包含设备名任何一项异常都会红字提示。这样人工复核的压力小了很多。6. 最后说几句实在话折腾这个脚本方案我最深的感触是网络自动化不一定要上多复杂的平台把每天的重复劳动拆成“数据 模板 脚本”就已经能解决大半问题。关键在于不要试图在一个脚本里塞进所有品牌、所有型号、所有情况而是先覆盖80%的高频场景剩下的特殊命令留给人工补充。另外脚本生成的配置一定要有人看、有人审。自动化工具不是用来替代判断的而是用来把时间省下来做判断。我在项目里始终保留一个环节生成后抽样对比真机配置至少看完两台再批量执行。这样既发挥了脚本的效率也守住了配置质量的底线。如果你刚开始做这件事可以从一台设备、一个品牌、几个核心命令开始逐步扩展。等模板稳定了再纳入第二个品牌、第三个品牌。网络配置这件事没有什么玄学只有把细节抠到位才能在半夜割接的时候睡个安稳觉。
返回列表