13-Chef配置
本章节下载: 13-Chef配置 (321.79 KB)
目 录
Chef是开源的配置管理工具,用户使用Ruby语言将需要对设备进行的配置写成脚本,并保存到服务器中,再通过服务器把配置脚本下发到各网络设备,实现对网络设备的集中配置管理。
图1-1 Chef网络架构
如图1-1所示,Chef采用“服务器端/客户端”网络架构,由Chef server、Chef client和Workstation构成。
Chef server用于对Chef client进行集中管理,其主要功能如下:
· 集中保存配置脚本(Cookbook),并根据用户要求将配置脚本下发到Chef client。
· 为Chef client和Workstation分别创建后缀为.pem的密钥文件。密钥文件分为用户密钥文件和组织密钥文件:
¡ 用户密钥文件:该文件用来保存Chef client/Workstation的用户认证信息,Chef client/Workstation与Chef server进行通信前,用户需要将该文件分别下载到Chef client/Workstation上,Chef server使用该文件验证Chef client/Workstation的合法性。
¡ 组织密钥文件:该文件用来保存用户所在组织的认证信息。用户需要将该文件分别下载到Chef client/Workstation中。为方便对不同的Chef client/Workstation设备进行区分管理,可以将具有同一类属性的Chef client/Workstation划分到同一个组织中。Chef client/Workstation与Chef server进行通信前,Chef server使用该文件验证用户所在组织的合法性。
关于Chef server的详细安装和配置,请参见Chef官方网站:https://www.chef.io。
Workstation提供了用户与Chef server交互的接口。用户需要在Workstation上创建、编辑配置脚本,并将配置脚本上传到Chef server。
Workstation可以与Chef server安装在同一台服务器上。
关于Workstation的详细安装和配置,请参见Chef官方网站:https://www.chef.io。
Chef client即为被Chef server管理的网络设备。Chef client从Chef server获取并运行配置脚本,配置脚本运行完成后,设备使用新下发的配置运行。
Chef以Chef client方式运行,版本为12.3.0。
Chef使用Ruby语言定义配置项,各配置项的集合即为一个配置脚本,在Chef中,配置项叫做资源。
Chef划分了多个不同类型的资源,每个类型的资源都由名称、属性和动作构成,每个属性对应功能的一个配置,属性值即为该配置应达到的状态。在对Chef资源进行配置时,通过为不同属性赋值,从而指定设备应该达到的最终状态,而不需要关心如何达到这些状态。例如:用户只需要指定创建哪一个VLAN,而不需要关心如何创建该VLAN。如下以创建VLAN 2,并为该VLAN配置描述信息为例介绍Chef资源的构成:
netdev_vlan 'vlan2' do
vlan_id 2
description 'chef-vlan2'
action :create
end
在该例中,各字段含义如下:
· netdev_vlan表示资源类型。
· do与end为Ruby语言中函数的固定语法,所有Chef资源配置都需要符合该语法要求。
· vlan2为资源名称,每个资源都有唯一的资源名称,用于标识该资源。
· vlan_id和description表示资源属性。
¡ vlan_id 2表示创建VLAN ID为2的VLAN。
¡ description 'chef-vlan2'表示VLAN2的描述信息为“chef-vlan2”。
· action表示资源动作,Chef仅支持create和delete两种动作。
¡ create表示如果该Chef资源不存在,则创建这个资源;如果该Chef资源已存在,则按照最新资源配置要求修改该资源。create为Chef资源的缺省动作,如果配置Chef资源时,不指定action,则表示action取值为create。
¡ delete表示需要删除该资源。
关于Chef支持的所有资源类型,请参见2 Chef资源列表。
Chef配置文件由用户手工配置,该文件中包含了Chef client执行Chef时输出日志的属性、Chef server和Chef client本地保存密钥文件的路径,以及Chef client本地保存资源文件的路径等。
启动Chef后,Chef client使用Chef配置文件中指定的本地密钥文件信息向Chef server发起认证请求。Chef server使用本地密钥文件与Chef client发送的密钥信息对比,如果双方密钥信息完全一致,则表示Chef client通过认证。Chef client通过认证后将把资源文件下载到Chef配置文件指定的本地资源文件保存路径中,并执行资源文件中的配置,同时输出相应的日志。
表1-1 Chef配置文件配置项描述表
配置项 |
值 |
说明 |
(可选)log_level |
:auto :debug :info :warn :error :fatal |
日志信息级别,缺省值为auto 日志严重等级由低到高依次为:debug、info、warn、error、fatal auto级别与warn级别相同 |
log_location |
STDOUT STDERR logfilepath |
日志输出方式: · STDOUT表示Chef标准日志输出方式。配置该参数后,通过third-part-process start命令下载资源时,将Chef配置过程中,配置执行成功的日志信息输出到指定文件中,执行失败的日志信息输出到配置终端 · STDERR表示Chef标准错误日志输出方式。配置该参数后,通过third-part-process start命令下载资源时,将Chef配置过程中,配置执行失败的日志信息输出到指定文件中,执行成功日志信息的输出到配置终端 · logfilepath表示将执行Chef过程中,所有配置日志都输出到设备指定的路径中。例如:将日志文件输出到flash:/cheflog/a.log 如果不指定任何参数,Chef标准日志和Chef标准错误日志都输出到配置终端 |
node_name |
client |
Chef client名称 在Chef中,该名称仅用于区别不同的Chef client,与设备名称(通过sysname命令配置)无关 |
chef_server_url |
https://localhost:port/organizations/ORG_NAME |
Chef server的URL以及Chef server上创建的组织的名称 localhost:port表示Chef server的名称或IP地址、以及端口号 ORG_NAME表示组织的名称 |
validation_key |
flash:/chef/validator.pem |
组织认证的密钥文件名称,以及设备本地保存密钥文件的路径 |
client_key |
flash:/chef/client.pem |
用户认证的密钥文件名称,以及设备本地保存密钥文件的路径 |
cookbook_path |
[ 'flash:/chef-repo/cookbooks' ] |
设备本地保存资源文件的路径 |
Chef server的Chef版本不能低于Chef client的Chef版本。
配置Chef功能前,用户必须先配置如下功能:
· 开启NETCONF over SSH功能:Chef server通过NETCONF over SSH方式向Chef client下发配置。关于NETCONF over SSH功能的详细配置请参见“网络管理和监控配置指导”中的“NETCONF”。
· 配置设备可以通过SSH登录:Chef server与Chef client使用SSH进行通信。关于SSH登录功能的详细配置请参见“基础配置指导”中的“登录设备”。
(1) 为Workstation和Chef client分别创建密钥文件。
(2) 创建并编辑Chef client的Chef配置文件。
关于Chef server的详细配置方法,具体请参见Chef server的安装和使用指导。
(1) 创建Workstation的本地工作目录。
(2) 创建保存Workstation Chef配置文件的目录
(3) 创建Workstation的Chef配置文件。
(4) 将Workstation的密钥文件从Chef server上下载到Workstation配置文件中指定的目录。
(5) 创建并编辑Chef资源文件。
(6) 将资源文件上传到Chef server。
关于Workstation的详细配置方法,具体请参见Workstation的安装和使用指导。
(1) 将Chef client的密钥文件从Chef server上下载到设备的本地目录。
设备本地保存密钥文件的目录必须与Chef配置文件中配置的目录相同。
(2) 将Chef配置文件从Chef server上下载到Chef client的本地目录。
设备本地保存Chef配置文件的目录必须与third-part-process start命令--config参数指定的目录相同。
(3) 启动Chef。
a. 进入系统视图。
system-view
b. 启动Chef。
third-part-process start name chef-client arg --config=filepath --runlist recipe[Directory]
缺省情况下,Chef处于关闭状态。
说明 |
|
--config=filepath |
设备中保存Chef配置文件的目录及名称 |
--runlist recipe[Directory] |
设备使用的资源目录的名称 |
关于third-part-process start命令的详细介绍,请参见“网络管理和监控”中的“进程监控和维护”。
执行display process all命令查看所有进程信息,“THIRD”字段标识为“Y”的进程为第三方进程,“PID”字段即为进程pid。“COMMAND”字段为“chef-client /opt/ruby/b”的进程为Chef进程。
(1) 进入系统视图。
system-view
(2) 关闭Chef。
third-part-process stop pid pid-list
关于third-part-process stop命令的详细介绍,请参见“网络管理和监控”中的“进程监控和维护”。
Chef client与Chef server相连,设备的IP地址和掩码如图1-2所示。
通过Chef在设备上创建ID为3的VLAN。
图1-2 Chef配置组网图
(1) 配置Chef server
# 创建Workstation的用户密钥文件admin.pem,具体参数如下:
¡ Workstation的用户名为Herbert George Wells。
¡ Email为abc@example.com。
¡ 密码为123456。
$ chef-server-ctl user-create Herbert George Wells abc@example.com 123456 –filename=/etc/chef/admin.pem
# 创建Workstation的组织密钥文件admin_org.pem,具体参数如下:
¡ 组织的简称为ABC,组织全称为ABC Technologies Co., Limited。
¡ 该组织与用户Herbert相关联。
$ chef-server-ctl org-create ABC_org "ABC Technologies Co., Limited" –association_user Herbert –filename =/etc/chef/admin_org.pem
# 创建Chef client的用户密钥文件client.pem,具体参数如下:
¡ Chef client用户名为Herbert George Wells。
¡ Email为abc@example.com。
¡ 密码为123456。
$ chef-server-ctl user-create Herbert George Wells abc@example.com 123456 –filename=/etc/chef/client.pem
# 创建Chef client的组织密钥文件validator.pem,具体参数如下:
¡ 组织的简称为ABC,组织全称为ABC Technologies Co., Limited。
¡ 该组织与用户Herbert相关联。
$ chef-server-ctl org-create ABC "ABC Technologies Co., Limited" –association_user Herbert –filename =/etc/chef/validator.pem
# 创建并编辑Chef client的Chef配置文件chefclient.rb。
log_level :info
log_location STDOUT
node_name 'Herbert'
chef_server_url 'https://1.1.1.2:443/organizations/abc'
validation_key 'flash:/chef/validator.pem'
client_key 'flash:/chef/client.pem'
cookbook_path [ 'flash:/chef-repo/cookbooks' ]
(2) 配置Workstation
# 创建Workstation的本地工作目录chef-repo。
$ mkdir /chef-repo
# 创建保存Workstation Chef配置文件的目录.chef。
$ mkdir –p /chef-repo/.chef
# 在/chef-repo/.chef目录下创建Workstation的Chef配置文件knife.rb,内容如下:
log_level :info
log_location STDOUT
node_name 'admin'
client_key '/root/chef-repo/.chef/admin.pem'
validation_key '/root/chef-repo/.chef/admin_org.pem'
chef_server_url 'https://chef-server:443/organizations/abc'
使用TFTP或FTP将Workstation的密钥文件从Chef server下载到Workstation配置文件中的/chef-repo/.chef目录。
# 执行如下命令,创建名为“netdev”的资源目录。
$ knife cookbook create netdev
该命令执行成功后,将在当前目录下创建netdev资源目录,并在netdev资源目录下生成多个与该资源目录相关的文件和目录,其中,recipes目录即为保存资源文件的目录。
编辑recipes目录下名称为default.rb的资源文件,内容如下:
netdev_vlan 'vlan3' do
vlan_id 3
action :create
end
# 执行如下命令,将资源文件上传到Chef server。
$ knife cookbook upload –all
(3) 配置Chef client
在Chef client上配置设备通过SSH登录,并开启NETCONF over SSH功能。
使用TFTP或FTP将Chef配置文件chefclient.rb从Chef server上下载到Chef client的Flash根目录(该文件的保存目录必须与third-part-process start命令--config参数指定的目录相同)。
使用TFTP或FTP将密钥文件validator.pem和client.pem从Chef server上下载到设备的指定目录。本例中,目录为flash:/chef/。
# 在设备上启动Chef,指定设备中Chef配置文件的路径为Flash的根目录,文件名称为chefclient.rb。资源名称为netdev。
<ChefClient> system-view
[ChefClient] third-part-process start name chef-client arg --config=flash:/chefclient.rb --runlist recipe[netdev]
该命令执行成功后,Chef client将获取Chef server中的资源到本地,并运行该资源,实现对设备各功能的配置。
该资源用来配置设备的名称,并指定设备与Chef server建立连接时使用的SSH用户名和密码。
表2-1 netdev_device资源属性描述表
列名 |
列描述 |
列类型 |
数据类型和限制 |
hostname |
设备名称 |
无 |
数据类型为字符串,取值为1~64个字符,不区分大小写 |
user |
SSH用户名 |
无 |
数据类型为字符串,取值为1~55个字符,区分大小写 |
passwd |
SSH用户密码 |
无 |
数据类型为字符串,区分大小写。非FIPS模式下,明文密码为1~63个字符;哈希密码为1~110个字符;密文密码为1~117个字符 |
action |
下发该资源时所执行的动作 |
无 |
数据类型为符号,取值包括: · create:表示建立设备与Chef server的NETCONF连接 · delete:表示建立设备与Chef server的NETCONF连接 该属性的缺省值为create,如果配置Chef资源时,不指定action,则表示action取值为create |
配置设备名称为ChefClient,并指定设备与Chef server建立连接时使用的SSH用户名为user,SSH用户密码为123456。
netdev_device 'device' do
hostname "ChefClient"
user "user"
passwd "123456"
end
该资源用来配置接口的属性。
表2-2 netdev_interfac资源属性描述表
列名 |
列描述 |
列类型 |
数据类型和限制 |
ifindex |
接口索引 |
索引 |
数据类型为整型 |
description |
接口的描述信息 |
无 |
数据类型为字符串,取值为1~255个字符,区分大小写 |
admin |
接口的管理状态 |
无 |
数据类型为字符串,取值包括: · up:接口的管理状态为开启 · down:接口的管理状态为关闭 |
speed |
接口速率 |
无 |
数据类型为字符串,取值包括: · auto:表示接口速率处于自协商状态 · 10m:表示接口速率为10Mbps · 100m:表示接口速率为100Mbps · 1g:表示接口速率为1Gbps · 10g:表示接口速率为10Gbps · 40g:表示接口速率为40Gbps · 100g:表示接口速率为100Gbps |
duplex |
以太网接口的双工模式 |
无 |
数据类型为字符串,取值包括: · full:全双工状态,接口在发送数据包的同时可以接收数据包 · half:半双工状态,接口同一时刻只能发送数据包或接收数据包 · auto:接口与对端接口的双工模式为自动协商 仅以太网接口支持该配置 |
linktype |
接口的链路类型 |
无 |
数据类型为字符串,取值包括: · access:配置接口的链路类型为Access类型 · trunk:配置接口的链路类型为Trunk类型 · hybrid:配置接口的链路类型为Hybrid类型 仅二层以太网接口支持该配置 |
portlayer |
以太网接口的工作模式 |
无 |
数据类型为字符串,取值包括: · bridge:配置以太网接口工作在二层模式 · route:配置以太网接口工作在三层模式 |
mtu |
三层以太网接口允许通过的MTU的大小 |
无 |
数据类型为整型,取值范围取决于接口的类型,单位为字节 仅三层以太网接口支持该配置 |
配置索引为2的以太网接口的如下属性:
· 接口的描述信息为ifindex2。
· 管理状态为开启。
· 接口速率为自动协商。
· 接口与对端接口的双工模式为自动协商。
· 端口的链路类型为Hybrid类型。
· 以太网接口工作在二层模式。
· 配置三层以太网接口允许通过的MTU的大小为1500。
netdev_interface 'ifindex2' do
ifindex 2
description 'ifindex2'
admin 'up'
speed 'auto'
duplex 'auto'
linktype 'hybrid'
portlayer 'bridge'
mtu 1500
end
该资源用来配置二层以太网接口的VLAN属性。
表2-3 netdev_l2_interface资源属性描述表
列名 |
列描述 |
列类型 |
数据类型和限制 |
ifindex |
接口索引 |
索引 |
数据类型为整型 |
pvid |
端口的缺省VLAN |
无 |
数据类型为整型,取值范围为1~4094 |
permit_vlan_list |
接口允许通过的VLAN列表 |
无 |
数据类型为字符串 VLAN的取值范围为1~4094 一次可以配置多个VLAN,各VLAN间使用逗号分隔。两个逗号之间可以是一个单独的VLAN,也可以是一个VLAN范围。例如:1,2,3,5-8,10-20 使用连字符“-”分隔一个VLAN范围的开始和结束 字符串的结尾不能含有逗号,连字符“-”或空格 |
untagged_vlan_list |
端口在转发指定的VLAN报文时将去掉VLAN Tag |
无 |
数据类型为字符串 VLAN的取值范围为1~4094 一次可以配置多个VLAN,各VLAN间使用逗号分隔。两个逗号之间可以是一个单独的VLAN,也可以是一个VLAN范围。例如:1,2,3,5-8,10-20 使用连字符“-”分隔一个VLAN范围的开始和结束 字符串的结尾不能含有逗号,连字符“-”或空格 同一个VLAN不能在untagged_vlan_list和tagged_vlan_list列中同时指定 |
转发指定的VLAN报文时将携带VLAN Tag |
无 |
数据类型为字符串 VLAN的取值范围为1~4094 一次可以配置多个VLAN,各VLAN间使用逗号分隔。两个逗号之间可以是一个单独的VLAN,也可以是一个VLAN范围。例如:1,2,3,5-8,10-20 使用连字符“-”分隔一个VLAN范围的开始和结束 字符串的结尾不能含有逗号,连字符“-”或空格 同一个VLAN不能在untagged_vlan_list和tagged_vlan_list列中同时指定 |
修改索引为5的接口的缺省VLAN为2,允许ID为2~6的VLAN通过,ID为2、4、5、6的VLAN需要保留tag,ID为3的VLAN不带tag。
netdev_l2_interface 'ifindex5' do
ifindex 5
pvid 2
permit_vlan_list '2-6'
tagged_vlan_list '2,4-6'
untagged_vlan_list '3'
end
该资源用来创建、修改或删除聚合组。
表2-4 netdev_lagg资源属性描述表
列名 |
列描述 |
列类型 |
数据类型和限制 |
group_id |
聚合组ID |
索引 |
数据类型为整型 二层聚合组的组ID范围为1~1024 三层聚合组的组ID范围为16385~17408 |
linkmode |
聚合模式 |
无 |
数据类型为字符串,取值包括: · static:表示静态聚合 · dynamic:表示动态聚合 |
addports |
加入聚合组的接口列表 |
无 |
数据类型为字符串 一次可以配置多个接口索引,各接口索引间使用逗号分隔。两个逗号之间可以是一个单独的接口索引,也可以是一个接口索引范围。例如:1,2,3,5-8,10-20 使用连字符“-”分隔一个接口索引范围的开始和结束 字符串的结尾不能含有逗号,连字符“-”或空格 同一个接口不能在addports和deleteports列中同时指定 |
deleteports |
从聚合组删除的接口列表 |
无 |
数据类型为字符串 一次可以配置多个接口索引,各接口索引间使用逗号分隔。两个逗号之间可以是一个单独的接口索引,也可以是一个接口索引范围。例如:1,2,3,5-8,10-20 使用连字符“-”分隔一个接口索引范围的开始和结束 字符串的结尾不能含有逗号,连字符“-”或空格 同一个接口不能在addports和deleteports列中同时指定 |
action |
下发该资源时所执行的动作 |
无 |
数据类型为符号,取值包括: · create:表示创建或修改聚合组 · delete:表示删除聚合组 该属性的缺省值为create,配置Chef资源时,如果不指定action,则表示action取值为create |
创建ID为16386的聚合组,设置聚合组的模式为static,并将接口1、2、3加入聚合组,从聚合组中删除索引为8的接口。
netdev_lag 'lagg16386' do
group_id 16386
linkmode 'static'
addports '1-3'
deleteports '8'
end
该资源用来创建、修改或删除VLAN,并配置VLAN的名称和描述信息。
表2-5 netdev_vlan资源属性描述表
列名 |
列描述 |
列类型 |
数据类型和限制 |
vlan_id |
VLAN的编号 |
索引 |
数据类型为无符号整型,取值范围为1~4094 |
description |
VLAN的描述信息 |
无 |
数据类型为字符串,取值为1~255个字符,区分大小写 |
vlan_name |
VLAN名称 |
无 |
数据类型为字符串,取值为1~32个字符,区分大小写 |
action |
下发该资源时所执行的动作 |
无 |
数据类型为符号,取值包括: · create:表示创建或修改VLAN · delete:表示删除VLAN 该属性的缺省值为create,如果配置Chef资源时,不指定action,则表示action取值为create |
创建VLAN2,并配置VLAN描述和VLAN名称为“vlan2”。
netdev_vlan 'vlan2' do
vlan_id 2
description 'vlan2'
vlan_name ‘vlan2’
end
该资源用来创建、修改或删除VSI。
表2-6 netdev_vsi资源属性描述表
列名 |
列描述 |
列类型 |
数据类型和限制 |
vsiname |
VSI的名称 |
索引 |
数据类型为字符串,取值为1~31个字符,区分大小写 |
admin |
开启或关闭VSI |
无 |
数据类型为字符串,取值包括: · up:表示开启VSI · down:表示关闭VSI 该属性的缺省值为up,如果配置Chef资源时,不指定admin,则表示取值为up |
action |
下发该资源时所执行的动作 |
无 |
数据类型为符号,取值包括: · create:表示创建或修改VSI · delete:表示删除VSI 该属性的缺省值为create,配置Chef资源时,如果不指定action,则表示action取值为create |
在设备上创建名为vsia的VSI,并设置为开启状态。
netdev_vsi 'vsia' do
vsiname 'vsia'
admin 'up'
end
该资源用来创建或删除隧道。
表2-7 netdev_vte资源属性描述表
列名 |
列描述 |
列类型 |
数据类型和限制 |
vte_id |
隧道 ID |
索引 |
数据类型为整型 |
mode |
隧道模式 |
无 |
数据类型为整型,取值包括: · 1:运行IPv4协议的GRE 隧道 · 2:运行IPv6协议的GRE 隧道 · 3:IPv4与IPv4之间的隧道 · 4:手动配置的IPv6到IPv4的隧道 · 6:IPv6到IPv4 的6to4隧道 · 7:IPv6到IPv4的ISATAP隧道 · 8:用IPv6封装IPv4报文 · 16:基于IPv4传输协议的IPsec隧道 · 17:基于IPv6传输协议的IPsec隧道 · 24:基于UDP passenger协议和IPv4传输协议的VXLAN隧道 创建隧道时必须指定隧道模式,且创建后不能再对该隧道模式进行修改 |
action |
下发该资源时所执行的动作 |
无 |
数据类型为符号,取值包括: · create:表示创建隧道 · delete:表示删除隧道 该属性的缺省值为create,配置Chef资源时,如果不指定action,则表示action取值为create |
创建ID为2、基于UDP passenger协议和IPv4传输协议的VXLAN隧道。
netdev_vte 'vte2' do
vte_id 2
mode 24
end
该资源用来创建、修改或删除VXLAN。
表2-8 netdev_vxlan资源属性描述表
列名 |
列描述 |
列类型 |
数据类型和限制 |
vxlan_id |
VXLAN ID |
索引 |
数据类型为整型,取值范围为0~16777215 |
vsiname |
VSI的名称 |
无 |
数据类型为字符串,取值为1~31个字符,区分大小写 创建VSI时必须指定该列,且该列在创建后不能修改 |
add_tunnels |
VXLAN与隧道接口关联 |
无 |
数据类型为字符串 隧道接口的编号 一次可以配置多个隧道接口编号,各接口编号间使用逗号分隔。两个逗号之间可以是一个单独的接口编号,也可以是一个接口编号范围。例如:1,2,3,5-8,10-20 使用连字符“-”分隔一个接口编号范围的开始和结束 字符串的结尾不能含有逗号,连字符“-”或空格 同一个隧道接口的编号不能在add_tunnels和delete_tunnels中同时指定 |
delete_tunnels |
取消VXLAN与隧道接口关联 |
无 |
数据类型为字符串 隧道接口的编号 一次可以配置多个隧道接口编号,各接口编号间使用逗号分隔。两个逗号之间可以是一个单独的接口编号,也可以是一个接口编号范围。例如:1,2,3,5-8,10-20 使用连字符“-”分隔一个接口编号范围的开始和结束 字符串的结尾不能含有逗号,连字符“-”或空格 同一个隧道接口的编号不能在add_tunnels和delete_tunnels中同时指定 |
action |
下发该资源时所执行的动作 |
无 |
数据类型为符号,取值包括: · create:表示创建或修改VXLAN · delete:表示删除VXLAN 该属性的缺省值为create,配置Chef资源时,如果不指定action,则表示action取值为create |
创建ID为10的VXLAN,加入名为vsia的VSI,并将隧道接口2、4加入VXLAN,从VXLAN中删除1、3隧道接口。
netdev_vxlan 'vxlan10' do
vxlan_id 10
visname 'vsia'
add_tunnels '2,4'
delete_tunnels '1,3'
end
不同款型规格的资料略有差异, 详细信息请向具体销售和400咨询。H3C保留在没有任何通知或提示的情况下对资料内容进行修改的权利!