在此页面上
示例:使用 Jsnapy 作为 Python 模块
此示例说明如何在 Python 脚本或程序中使用 Python 中的 Junos Snapshot Administrator (jsnapy) 功能。当此脚本中需要用户名和密码条目时,请将<用户名>和<密码>替换为适当的值。
jsnapy 的默认安装包括目录中的许多示例配置和测试文件/etc/jsnapy/samples/,包括几个名为 、module_data.pymodule_device.py、 和 module_snapcheck.py的 module_check.pyPython 脚本示例。这些文件每个都演示了在python脚本中作为模块运行的jsnapy的不同功能。
此示例将使用略微修改的 Python 脚本文件 module_data.py,来演示使用该选项运行 snapcheck jsnapy。该脚本演示如何从 Python 脚本中传递 YAML 配置数据。
要求
此示例使用以下硬件和软件组件:
运行 Junos OS 的设备
安装在服务器上的 jsnapy 实例(jsnapy 服务器)
用于查看和更改脚本的文本编辑器
在为 jsnapy 编写自己的 Python 脚本之前,请确保您对 Python 编程概念和 jsnapy 操作都有透彻的了解。
概述
在此示例中,我们检查提供的 Python 脚本 /etc/jsnapy/samples/module_data.py.我们将看到脚本如何将 jsnapy 作为模块导入,如何定义 jsnapy 配置参数,以及如何在远程 Junos OS 设备上显示操作结果 snapcheck 。
拓扑
此示例使用一个简单的拓扑,其中 jsnapy 服务器连接到单个远程 Junos OS 设备。可以实现与多个设备的连接,但此示例中不讨论。
检查 Python 脚本
Python 脚本执行以下任务:
将所需的 Python 模块导入脚本。
定义一个变量,该变量用于从 jsnapy 模块调用 SnapAdmin() 函数。
定义 jsnapy 配置参数并将其分配给变量。
使用选项调用
snapcheckjsnapy,该选项使用先前定义的配置变量作为配置参数和快照文件名pre。将结果打印到 jsnapy 服务器的终端。
在其原始形式中,Python 脚本 module_data.py导入并调用 Data 漂亮的打印机模块。 pprint从脚本调用时,此模块会导致 python 将 jsnapy 从 Junos OS 设备接收的所有快照数据打印到 jsnapy 服务器的终端。由于此数据的长度,此示例中的调用 pprint 通过在调用前面加上井号 (#) 来注释掉。
注意注释
分步过程
由于我们正在检查此示例中的现有脚本,因此我们将指出显示为文件第一行的注释。注释可以放在脚本中的任何位置,方法是以井号 (#) 开头注释。
### Example showing how to pass yaml data in same file ### from jnpr.junos import Device
导入 Python 模块
分步过程
此脚本使用三个导入的模块,一个用于 jsnapy,一个用于将复杂数据打印到终端,另一个用于处理 Junos OS 设备。
from jnpr.jsnapy import SnapAdmin from pprint import pprint from jnpr.junos import Device
定义用于调用 SnapAdmin 的变量
分步过程
在这里,脚本将 jsnapy 模块中的 SnapAdmin() 函数分配给一个变量
js,该变量易于使用,并且能够在调用 jsnapy 时传递参数。js = SnapAdmin()
定义 jsnapy 配置参数
分步过程
此处,脚本定义 Junos OS 主机以及将在该主机上执行哪些测试。它将这些参数分配给变量
config_data。三引号允许config_data包含换行符。注意:指定要执行的主机和测试的另一种方法是引用 jsnapy 配置文件。配置文件可以定义一个或多个主机以及一个或多个测试文件。由于在此示例中,配置数据包含在 Python 脚本中,
config_data因此变量不会引用脚本外部的配置文件,而是使用出现在三引号 (“”) 之间的键值对填充。config_data = """ hosts: - device: 198.51.100.10 username : <username> passwd: <password> tests: - test_exists.yml - test_contains.yml - test_is_equal.yml """
使用定义的配置数据调用 jsnapy
分步过程
在这里,脚本使用选项调用
snapcheckjsnapy,并传递配置信息和快照文件的名称。作为此调用的结果返回的信息将作为值存储在变量中snapchk。注意:您可以访问所有可用的 jsnapy 选项、、
check,snap以及在snapcheck调用 SnapAdmin() 后附加该选项。例如、js.check(config_file, "snapshot1", "snapshot2")js.snap(config_file, "snapshot_name")和js.snapcheck(config_file, "snapshot_name")。snapchk = js.snapcheck(config_data, "pre")
将结果打印到终端
分步过程
在这里,脚本循环遍历返回的值,并以可读格式将它们打印到 jsnapy 服务器终端。这也是我们更改脚本以防止它将整个快照打印到终端的地方。
for val in snapchk: print "Tested on", val.device print "Final result: ", val.result print "Total passed: ", val.no_passed print "Total failed:", val.no_failed #pprint(dict(val.test_details))
结果
为了便于查看,下面通过对文件module_data.py运行cat命令来显示修改后的脚本的内容。
user@jsnapy-server$ cat module_data.py
### Example showing how to pass yaml data in same file ###
from jnpr.jsnapy import SnapAdmin
from pprint import pprint
from jnpr.junos import Device
js = SnapAdmin()
config_data = """
hosts:
- device: 198.51.100.10
username : <username>
passwd: <password>
tests:
- test_exists.yml
- test_contains.yml
- test_is_equal.yml
"""
snapchk = js.snapcheck(config_data, "pre")
for val in snapchk:
print "Tested on", val.device
print "Final result: ", val.result
print "Total passed: ", val.no_passed
print "Total failed:", val.no_failed
#pprint(dict(val.test_details))
验证
验证脚本的操作
目的
完成 Python 脚本以及所需的 jsnapy 配置和测试文件后,您可以通过从 jsnapy 服务器终端运行脚本来验证脚本的操作。
行动
user@jsnapy-server$ python module_data.py Connecting to device 198.51.100.10 ................ Taking snapshot of COMMAND: show version Taking snapshot of COMMAND: show version invoke-on all-routing-engines Taking snapshot of COMMAND: show interfaces terse lo* *************************** Device: 198.51.100.10 *************************** Tests Included: test_version_check *************************** Command: show version *************************** PASS | All "//package-information/name" exists at xpath "//software-information" [ 59 matched ] *************************** Device: 198.51.100.10 *************************** Tests Included: test_version_check ************ Command: show version invoke-on all-routing-engines ************ Test Failed!!! Junos version does not contains package name as jbase Test Failed!!! Junos version does not contains package name as jbase FAIL | All "//package-information/name[1]" do not contains j" [ 57 matched / 2 failed ] *************************** Device: 198.51.100.10 *************************** Tests Included: test_interfaces_terse ********************* Command: show interfaces terse lo* ********************* PASS | All "admin-status" is equal to "up" [ 1 matched ] ------------------------------- Final Result!! ------------------------------- Total No of tests passed: 2 Total No of tests failed: 1 Overall Tests failed!!! Tested on 198.51.100.10 Final result: Failed Total passed: 2 Total failed: 1