提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
传统网络设备是一个封闭系统,提供的功能和服务都是固定的,不具有动态性和灵活性。随着网络的迅猛发展和不断普及,多样化、差异化的需求层出不穷,传统网络设备难以满足这些需求。部分用户要求设备提供不同层次的开放性,便于开发一些自定义的功能,部署一些私有的管理策略,实现自动化运维等功能,以降低管理成本。
华为公司推出OPS(Open Programmability System,开放可编程系统),提供网络设备的开放可编程能力,赋予用户二次开发的能力,充分释放设备潜力。
一、OPS
华为公司推出OPS,提供网络设备的开放可编程能力。
OPS允许用户或第三方开发商利用系统开放的RESTful API,开发和部署自己的网络管理策略,从而迅速地实现业务功能扩展、自动部署和设备的智能化管理,降低运维成本和操作的复杂度。
二、OPS原理
1.OPS架构
OPS基于华为公司通用路由平台VRP(Versatile Routing Platform)开发,通过开放的RESTful API接口与VRP系统的管理平面、控制平面、数据平面的模块进行交互,实现对设备整体功能的扩展。
OPS通过开放管理对象来开放设备,管理对象使用URI(Uniform Resource Identifier)进行唯一的标识。客户端可以通过标准的HTTP方法对对象进行操作,如GET、PUT、POST、DELETE。
VRP系统是华为公司多年研究和网络应用经验的成果,知识产权为华为公司所有的一种网络操作系统。
管理对象:网络设备中开放出来的,可以被Restful API接口进行调用的对象,如CPU信息,系统信息,接口信息等。
URI(Uniform Resource Identifier):统一资源标识符,用于标识一个特定的资源,OPS中使用URI标识管理对象。如CPU信息的URI为/devm/cpuInfos/cpuInfo,其唯一地标识了CPU信息这个管理对象。
URL(Uniform resource locator):统一资源定位符,URL是一种URI,可以用来表示一个资源,而且还指明了如何定位这个资源,如http://www.ietf.org/rfc/rfc2396.txt,ftp://ftp.is.co.za/rfc/rfc1808.txt。
目前华为网络设备OPS功能集成了Python语言的运行环境,可以运行Python脚本。Java,C/C++语言运行环境当前版本暂未实现,待扩展。
2.RESTful API
REST(Representational State Transfer,表现层状态转移):一种软件架构风格。其设计概念和准则为:
网络上的所有事物都可被抽象为资源。
每一个资源都有唯一的资源标识,对资源的操作不会改变这些标识。
使用标准方法操作资源,核心操作为HTTP规范定义的GET,PUT,POST,DELETE。
所有的操作都是无状态的。
RESTful API:符合REST架构风格的API。
OPS定义了一套RESTful API,并使用URI标识开放的管理对象。用户可以通过标准的HTTP方法(GET、PUT、POST和DELETE)访问管理对象。
OPS功能是用户编写python脚本,将脚本安装到网络设备,脚本运行时发送HTTP请求,来实现对网络设备的管理。
三、实验步骤
1.完成设备预配
2.编写运维代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import traceback
import httplib
# import http.client
# python3中相较于python2,httplib被替换成为http.client,所以在Pycharm中Python3环境下编写代码导入httplib后,会存在报错;但是在该网络设备下,代码需要按照python2版本导入httplib
import string
# 定义调用RESTful API的类,该类中定义了一些方法来执行建立HTTP连接时的操作。该部分无需修改,用户可以直接使用。
# 该部分可以直接调用,用户不需要修改。
class OPSConnection(object):
"""Make an OPS connection instance."""
# 初始化类,创建一个HTTP连接。
def __init__(self, host, port=80):
self.host = host
self.port = port
self.headers = {
"Content-type": "text/xml",
"Accept": "text/xml"
}
self.conn = None
# 关闭HTTP连接。
def close(self):
"""Close the connection"""
self.conn.close()
# 创建设备资源操作。
def create(self, uri, req_data):
"""Create operation"""
ret = self.rest_call("POST", uri, req_data)
return ret
# 删除设备资源操作。
def delete(self, uri, req_data):
"""Delete operation"""
ret = self.rest_call("DELETE", uri, req_data)
return ret
# 查询设备资源操作。
def get(self, uri, req_data=None