连接到 Perl 客户端应用程序中的 NETCONF 服务器
以下部分介绍如何在 NET::Netconf::Manager Perl 客户端应用程序中使用对象连接到运行 Junos OS 的设备上的 NETCONF 服务器:
满足协议先决条件
NETCONF 服务器支持多种接入协议。对于运行 Junos OS 的设备上与 NETCONF 服务器的每次连接,应用程序必须指定其使用的协议。Perl 客户端应用只能通过 SSH 与 NETCONF 服务器通信。
应用程序必须满足 SSH 的先决条件,才能运行应用程序。这涉及到通过配置 set system services netconf ssh 语句在设备上启用 NETCONF。
组请求
在运行 Junos OS 的设备上建立与 NETCONF 服务器的连接是应用程序执行的一项更耗时和资源密集型功能。如果应用程序向设备发送多个请求,那么在一个连接的上下文中发送所有这些请求很有道理。如果应用程序向多个设备发送相同的请求,则可以对脚本进行结构,以便通过这组设备或请求集进行迭代。但请记住,您的应用一次只能向一台 NETCONF 服务器发送一个请求。这是因为,在 NET::Netconf::Manager 对象收到表示 NETCONF 服务器对当前请求响应结束的结束 </rpc-reply> 标记之前,该对象不会将控制返回到应用程序。
获取并记录 NET::Netconf::Manager 对象所需的参数
对象 NET::Netconf::Manager 使用以下必需的参数,这些参数指定为 Perl 散列中的密钥:
access- 与 NETCONF 服务器通信时使用的接入协议。应用程序运行之前,请满足 SSH 先决条件。hostname- 要连接的设备的名称。为获得最佳效果,请指定完全限定的主机名或 IP 地址。login- 建立与 NETCONF 服务器连接并发出请求的用户名。指定的设备上必须已存在用户名,并且具有发出应用程序调用的请求所需的权限位。password-与用户名对应的密码。
NETCONF Perl 分布中的示例脚本将参数记录在称为 Perl 的 %deviceinfo哈希中,声明如下:
my %deviceinfo = (
'access' => $access,
'login' => $login,
'password' => $password,
'hostname' => $hostname,
);
NETCONF Perl 客户端分配中包含的示例脚本从用户在命令行上输入的选项中获取参数。有关以交互方式收集参数值的详细信息,请参阅 在 NETCONF Perl 客户端应用程序中以交互方式收集参数。应用程序还可以从文件或数据库获取参数值,或者,如果一个或多个参数为常量,则可以将一个或多个参数硬编码到应用程序代码中。
获取应用程序特定的参数
除了对象所需的 NET::Netconf::Manager 参数外,应用程序还需要定义其他参数,例如将 NETCONF 服务器响应请求返回的数据写入其文件的名称。
与使用对象所需的 NET::Netconf::Manager 参数一样,客户端应用程序可以对应用程序代码中的值进行硬编码,从文件中获取值,或以交互方式获取这些值。示例脚本通过命令行选项获取这些参数的值,其方式与获取对象所需的 NET::Netconf::Manager 参数的方式相同。下面举几个例子。
如果用户包含 -d 命令行选项,则以下行将启用调试跟踪:
my $debug_level = $opt{'d'};
以下行将 $outputfile 变量设置为命令行选项指定的 -o 值。它会命名 NETCONF 服务器响应所写的本地文件。 -o 如果未提供选项,则变量将设置为空字符串。
my $outputfile = $opt{'o'} || "";
建立连接
获取对象所需 NET::Netconf::Manager 参数的值后,每个示例脚本都会将其记录在 %deviceinfo 散列中。
my %deviceinfo = (
'access' => $access,
'login' => $login,
'password' => $password,
'hostname' => $hostname,
);
然后,该脚本调用 NETCONF 特定的 new 子程序来创建一个 NET::Netconf::Manager 对象,并建立与指定路由、交换或安全平台的连接。如果连接尝试失败(由 ref 操作人员测试),脚本将退出。
my $jnx = new Net::Netconf::Manager(%deviceinfo);
unless (ref $jnx) {
croak "ERROR: $deviceinfo{hostname}: failed to connect.\n";
}