示例:配置服务模板自动化
此示例说明如何使用服务模板自动化跨运行 Junos OS 的类似平台提供服务。
要求
两台运行 Junos OS 12.3 或更高版本的 MX 系列设备。
概述
此示例使用服务模板自动化在 MX 系列路由器上调配服务。要使用服务模板自动化 service-builder.slax 脚本,必须先将脚本复制到 /var/db/script/op 或 /config/script/op 目录,并在设备上启用脚本。
以下过程概述了如何使用服务模板自动化来提供服务:
创建服务模板定义。
执行 service-builder.slax 脚本,并定义特定于服务的实例参数。
生成服务接口。
在需要该服务的每台设备上启用服务接口。
通过使用 NETCONF 调用服务接口并提供服务参数值来配置系统。
此示例在运行 Junos OS 12.3 版的 MX 系列设备上创建新的 VPN 服务接口,并在运行 Junos OS 12.3 版的第二个 MX 系列设备上配置该服务。您可以在层次结构级别下 [edit groups]
配置服务模板定义。此示例的服务名称为 vpn-service
,模板组名称为 vpn-service-template-group
。配置 load merge terminal
模式命令会将服务模板配置层次结构加载到候选配置中,然后提交。
创建初始服务模板后,请执行 service-builder.slax 脚本。脚本会提示输入服务名称和模板组名称,然后从提交的配置中读取服务模板配置。
service-builder.slax 脚本界面由两个菜单组成:Main Menu
和Hierarchies Menu
。在中Main Menu
,您可以查看在服务模板配置中定义的变量,也可以构建或启用服务 API。menu Build Service API
选项显示 ,Hierarchies Menu
它可引导您完成变量参数化。默认设置是参数化每个变量,也可以选择参数化所选变量。如果在构建服务 API 时必须退出 service-builder.slax 脚本,则必须完成对当前层次结构的所有参数的配置,以便在使用Quit
选项退出时保存该层次结构配置。然后,您可以在以后完成任何不完整的层次结构配置。此示例参数化两个变量:接口名称和接口说明。指定参数后,服务构建器脚本将生成服务脚本。
menu Enable Service API
选项可启用本地设备上的服务脚本。要在第二台 MX 系列设备上启用服务脚本,会将生成的服务脚本复制到第二个设备上的 /var/db/script/op 目录,并在配置中启用该脚本。如果配置了语句 load-scripts-from-flash
,则必须将脚本复制到闪存驱动器上的相应目录。
NETCONF 用于在远程 MX 系列设备上调配服务。NETCONF 远程过程调用 (RPC) 操作取决于服务是新服务还是现有服务。支持的操作包括 create
、 update
和 delete
。此示例将创建一个新服务。如果设备上已配置给定服务,并且您要更新或删除服务参数,则可以更改 RPC 以执行这些操作。
配置
存储和启用 Service Builder 脚本
逐步过程
Junos OS 安装包括 service-builder.slax 脚本,该脚本存储在设备上的 /usr/libexec/script/op/ 目录中。要使用 service-builder.slax 脚本,必须先将其复制到操作脚本目录并在配置中启用。只有 Junos OS 超级用户登录类中的用户才能访问和编辑这些目录中的文件。
将 service-builder.slax 脚本复制到硬盘上的 /var/db/script/op 目录或闪存驱动器上的 /config/script/op 目录。
user@host> file copy /usr/libexec/scripts/op/service-builder.slax /var/db/scripts/op
使用
file list
操作模式命令验证脚本是否在正确的目录中。user@host> file list /var/db/scripts/op /var/db/scripts/op: service-builder.slax*
在配置中启用脚本。
[edit] user@host# set system scripts op file service-builder.slax
如果将脚本存储到内部并从闪存加载,请
load-scripts-from-flash
配置语句(如果尚未配置)。[edit] user@host# set system scripts load-scripts-from-flash
提交配置。
[edit] user@host# commit
配置服务模板定义
逐步过程
在运行 Junos OS 的设备上创建新服务模板:
选择服务名称。
此示例使用
vpn-service
。在配置模式下,创建一个新组,其中包含要调配的实际服务的层次结构。
[edit] user@host# set groups vpn-service-template-group
配置服务的层次结构。
对于此示例,使用命令将预先构建的配置层次结构加载到候选配置中
load merge terminal
。[edit] user@host# load merge terminal groups { vpn-service-template-group { interfaces { ge-2/2/6 { description "connected to customer3-site-1"; unit 0 { family bridge { interface-mode access; vlan-id 300; } } } } protocols { rstp { interface ge-2/3/0; } mvrp { interface ge-2/3/0; } } bridge-domains { bd { vlan-id-list 100; } } } } [Ctrl+D]
验证配置语法是否正确。
[edit] user@host# commit check configuration check succeeds
提交配置。
[edit] user@host# commit
配置和生成服务接口
逐步过程
要配置和生成服务接口,请执行以下操作:
在操作模式下,执行 service-builder.slax 脚本,以启动交互式服务生成器会话。
user@host> op service-builder Welcome to Service Builder Script: (v1.0) - Enter the service name :
输入在 配置服务模板定义中定义的服务名称。
Enter the service name : vpn-service
输入配置服务层次结构的组名称。
此示例使用组名称
vpn-service-template-group
。该脚本会读取层次结构中vpn-service-template-group
指定的配置,然后显示主菜单。Enter the group name : vpn-service-template-group .. reading [edit group vpn-service-template-group] .. [Op Script Builder - Main Menu] ----------------------------------- 1. Show Variables 2. Build Service API 3. Enable Service API Q. Quit ----------------------------------- Enter Selection:>
(可选)要查看可参数化的服务模板变量,请选择
Show Variables
选项。该脚本将候选配置中的模板定义转换为按层次结构级别分组的常规参数列表。
[Op Script Builder - Main Menu] ----------------------------------- 1. Show Variables 2. Build Service API 3. Enable Service API Q. Quit ----------------------------------- Enter Selection:> 1 List of variables under each hierarchy to parameterize: - 1. [ edit groups vpn-service-template-group interfaces ] 1.1. interface/name 1.2. interface/description 1.3. interface/unit/name 1.4. interface/unit/family/bridge/interface-mode 1.5. interface/unit/family/bridge/vlan-id - 2. [ edit groups vpn-service-template-group protocols ] 2.1. rstp/interface/name 2.2. mvrp/interface/name - 3. [ edit groups vpn-service-template-group bridge-domains ] 3.1. domain/name 3.2. domain/vlan-id-list -
要构建服务 API,请选择选项
Build Service API
。[Op Script Builder - Main Menu] ----------------------------------- 1. Show Variables 2. Build Service API 3. Enable Service API Q. Quit ----------------------------------- Enter Selection:> 2
从中
Hierarchies Menu
输入包含要参数化的变量的层次结构的菜单选项,或者按 Enter 选择所有层次结构。[Op Script Builder - Hierarchies Menu] ----------------------------------- 1. interfaces 2. protocols 3. bridge-domains Q. Quit ----------------------------------- Please enter multiple selections separated by a comma (,) only. ----------------------------------- Enter Selection:> [default:all] 1
从变量列表中,输入要为服务接口参数化的变量的菜单选项,或者按 Enter 以参数化该层次结构中的所有变量。
List of variables to parameterize: ... [ edit groups vpn-service-template-group interfaces ] ----------------------------------- 1. interfaces/interface/name 2. interfaces/interface/description 3. interfaces/interface/unit/name 4. interfaces/interface/unit/family/bridge/interface-mode 5. interfaces/interface/unit/family/bridge/vlan-id Q. Quit Please enter multiple selections separated by a comma (,) only. ----------------------------------- Enter Selection:> [default:all] 1,2
配置所选参数。
系统提示输入所需信息。此示例将接口名称参数配置为
ifname
,将接口描述参数配置为ifdesc
。Enter parameter name for: 1.interfaces/interface/name **************************** [ edit groups vpn-service-template-group interfaces ] Name for this parameter? ifname Do you want to revise 'ifname'? (yes/no)[no]: no Enter parameter name for: 2.interfaces/interface/description **************************** [ edit groups vpn-service-template-group interfaces ] Name for this parameter? ifdesc Do you want to revise 'ifdesc'? (yes/no)[no]: no
在每个层级配置所选参数。
该脚本会针对每个选定层次结构和指定参数进行迭代。如果在构建服务 API 时必须退出 service-builder.slax 脚本,则必须完成对当前层次结构的所有参数的配置,以便在使用
Quit
选项退出时保存该层次结构配置。生成服务接口,用于创建服务脚本。
配置所有参数后,脚本会自动提示您生成服务接口。按 Enter 或键入 yes 以生成服务接口。
Do you want to commit the previously selected options to create vpn-service script? (yes/no)[yes]: yes Created service script: /var/db/scripts/op/vpn-service.slax
验证服务接口
目的
验证创建服务脚本。如果配置了语句 load-scripts-from-flash
,则生成的文件存储在闪存内存中。否则,生成的文件会存储在硬盘上。
行动
发出file list
操作模式命令。对于此示例,vpn-service.slax 脚本应存在于 /var/db/script/op 目录中。service-builder.slax 脚本还会在 /var/db/script/op 目录中生成 utility.slax 脚本,并在 /var/db/script/lib 目录中生成 vpn-service-builder-info.xml 文件。service-builder.slax 脚本会使用这些文件,不应删除。
user@host> file list /var/db/scripts/op /var/db/scripts/op: service-builder.slax utility.slax vpn-service.slax user@host> file list /var/db/scripts/lib /var/db/scripts/lib: vpn-service-builder-info.xml
启用服务接口
逐步过程
要启用远程设备上的服务接口,请执行以下操作:
将生成的服务脚本复制到要调配新服务的设备。
如果未配置语句
load-scripts-from-flash
,请将服务脚本复制到第二个设备上的 /var/db/script/op 目录中。否则,必须将脚本复制到闪存驱动器上的相应目录。在配置中启用操作脚本。
[edit] user@host2# set system scripts op file vpn-service.slax
提交配置。
[edit] user@host2# commit commit complete
在操作模式下,验证脚本是否已启用,以及服务参数是否显示为脚本参数。
user@host2> op vpn-service ? Possible completions: <[Enter]> Execute this command <name> Argument name action Please enter either create/delete/update detail Display detailed output ifdesc Text description of interface ifname Name of interface service-id Service Name | Pipe through a command
使用 NETCONF 配置服务
逐步过程
要配置服务:
如果尚未配置,请在要调配新服务的任何设备上通过 SSH 配置 NETCONF 服务。
[edit] user@host2# set system services netconf ssh user@host2# commit
从配置管理服务器,与调配服务的设备建立 NETCONF 会话。
%ssh -p 830 -s user@host2 netconf user@host2's password: <!-- user user, class super-user --> <hello> <capabilities> <capability>urn:ietf:params:xml:ns:netconf:base:1.0</capability> <capability> urn:ietf:params:xml:ns:netconf:capability:candidate:1.0 </capability> <capability> urn:ietf:params:xml:ns:netconf:capability:confirmed-commit:1.0 </capability> <capability> urn:ietf:params:xml:ns:netconf:capability:validate:1.0 </capability> <capability> urn:ietf:params:xml:ns:netconf:capability:url:1.0?protocol=http,ftp,file </capability> <capability>http://xml.juniper.net/netconf/junos/1.0</capability> <capability>http://xml.juniper.net/dmi/system/1.0</capability> </capabilities> <session-id>28898</session-id> </hello> ]]>]]>
如果要在设备上配置新服务,请使用操作输入远程过程调用 (RPC),该调用服务操作脚本
create
,并包括需要配置的所有参数的值。参数的值
service-id
应与服务名称相同。<rpc> <op-script> <script>vpn-service</script> <action>create</action> <service-id>vpn-service</service-id> <ifname>ge-2/0/5,ge-2/0/6</ifname> <ifdesc>connected to customer1-site-1,connected to customer3-site-2</ifdesc> </op-script> </rpc>
使用 NETCONF 更新或删除服务
逐步过程
要更新或删除现有服务:
如果尚未配置,请在更新或删除服务的任何设备上通过 SSH 配置 NETCONF 服务。
[edit] user@host2# set system services netconf ssh user@host2# commit
从配置管理服务器,与调配服务的设备建立 NETCONF 会话。
%ssh -p 830 -s user@host2 netconf user@host2's password: <!-- user user, class super-user --> <hello> <capabilities> <capability>urn:ietf:params:xml:ns:netconf:base:1.0</capability> <capability> urn:ietf:params:xml:ns:netconf:capability:candidate:1.0 </capability> <capability> urn:ietf:params:xml:ns:netconf:capability:confirmed-commit:1.0 </capability> <capability> urn:ietf:params:xml:ns:netconf:capability:validate:1.0 </capability> <capability> urn:ietf:params:xml:ns:netconf:capability:url:1.0?protocol=http,ftp,file </capability> <capability>http://xml.juniper.net/netconf/junos/1.0</capability> <capability>http://xml.juniper.net/dmi/system/1.0</capability> </capabilities> <session-id>28898</session-id> </hello> ]]>]]>
如果设备上已配置给定服务,并且您要更新服务,请输入使用操作调用服务操作脚本的
update
RPC,并包括需要更新的所有参数的值。<rpc> <op-script> <script>vpn-service</script> <action>update</action> <service-id>vpn-service</service-id> <ifname>ge-2/0/5</ifname> <ifdesc>connected to customer1-site-2</ifdesc> </op-script> </rpc>
如果设备上已配置给定服务,而您要删除部分或全部服务参数,请输入使用
delete
操作调用服务操作脚本的 RPC,并包括需要删除的所有参数。<rpc> <op-script> <script>vpn-service</script> <action>update</action> <service-id>vpn-service</service-id> <ifname>ge-2/0/6</ifname> </op-script> </rpc>
验证
确认配置已更新。
验证提交
目的
验证提交是否成功。
行动
发出show system commit
操作模式命令以查看最近的提交。最近的提交条目显示,通过 NETCONF 服务器提交。user
user@host2> show system commit 0 2012-05-21 12:15:08 PDT by user via junoscript 1 2012-05-18 09:47:40 PDT by user via other ...
验证服务配置
目的
验证活动配置中是否存在服务配置。
行动
发出 show configuration | compare rollback num
操作模式命令以查看配置更改。
user@host2> show configuration | compare rollback 1 [edit interfaces] + ge-2/0/5 { + description "connected to customer1-site-1"; + } + ge-2/0/6 { + description "connected to customer3-site-2"; + }
意义
将当前配置与之前的配置进行比较后,已将接口和接口说明添加到配置中。
故障 排除
对失败的提交进行故障排除
问题
通过 NETCONF 会话在设备上创建、更新或删除服务时,您将看到以下消息:
<output> configuration database modified </output>
配置之前未提交的更改,服务脚本无法提交服务配置更改。
解决 方案
提交之前的更改或根据需要回滚配置,然后重新提交服务配置更改。
尝试删除服务参数失败时进行故障排除
问题
通过 NETCONF 在设备上删除服务参数时,您将看到以下消息:
<xnm:error xmlns:xnm="http://xml.juniper.net/xnm/1.1/xnm"> <source-daemon> op-script </source-daemon> <message> xsl:attribute: Cannot add attributes to an element if children have been already added to the element. </message> </xnm:error>
解决 方案
RPC 可能包含参数和子元素。从 RPC 中移除子元素。