REST API:
REST: Representational State Transfer,表现层状态转化。在这个词中省略了主语,也就是Resources。所以全称应该是资源表现层状态转化。
资源: 就是网络上的一个实体。它可以是一段文本、一张图片、一首歌曲、一种服务…我们可以用一个URI指向它,每种资源对应一个特定的URI。要获取这个资源,访问它的URI就可以,因此URI就成了每一个资源的地址或独一无二的识别符。注意:资源是不能加后缀的,例如xxx.png。后缀其实是资源的一种表现形式。
表现层: 一个资源可以用txt格式表现,也可以用HTML格式、XML格式、JSON格式表现,甚至可以采用二进制格式;图片可以用JPG格式表现,也可以用PNG格式表现。
状态转化: 通过http协议,对资源的表现层进行操作。HTTP中,使用的5中操作如下:
注意点:PUT和PATCH虽然都是更新信息,但是PUT由于是幂等的,在更新一个信息时(传递json文件)需要发送一个完整的json过去。而PATCH,则只需要在json中发送自己想要修改的数据。例如,我仅仅想修改一个接口的IP地址,不修改掩码,使用的JSON数据中,就仅需要携带IP地址的信息,而不需要携带掩码信息进行更新。因此PATCH在与网络设备的REST API互动的时候,使用的更频繁。
总结: 基于如上设计的API,就称为rest api。
ASA REST API安装:https://blog.csdn.net/tushanpeipei/article/details/116803481?spm=1001.2014.3001.5501
实验目的:
使用python调用rest api,在ASAv上配置物理接口和静态路由信息。
实验步骤:
步骤一: 在文档中找到配置物理接口和静态路由信息的json模板:
Interface配置:
可以看到路径和模板如下:
复制信息,直接进行测试:
可以在设备上查看配置是否生效:
路由配置的JSON模板按照相同的方法找到并测试:
步骤二: 将测试文档中的操作,修改为python代码,进行自动化配置。
ASA_basic_info.py:存放ASA的基础信息,后续方便调用。
# header必须使用如下的格式,因为后续通过http传递的是json的数据
http_headers = {'Content-Type': 'application/json', "Accept": "application/json"}
username = 'admin'
password = 'Cisc0123'
url = 'https://192.168.0.200'
ASA_restapi_token.py:获取登陆的token。
# 使用request模块发送request请求
import requests
from requests.auth import HTTPBasicAuth
from ASA_basic_info import http_headers, username, password, url
import urllib3
from pprint import pprint
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
api_path = "/api/tokenservices"
auth_url = url + api_path
def get_token():
try:
# 做basic认证,获取token。verif = False的原因是,ASA测试页面的认证无法正常验证
r = requests.post(auth_url, auth=HTTPBasicAuth(username, password), verify=False)
final_header = http_headers.copy()
final_header['X-Auth-Token'] = r.headers['X-Auth-Token']
# 返回插入了'X-Auth-Token'头部的字典
return final_header
except Exception as e:
print(e)
return None
if __name__ == '__main__':
pprint(get_token())
运行结果:
ASA_restapi_config.py:使用restapi进行接口和路由的配置:
import requests
from ASA_basic_info import url
from ASA_restapi_token import get_token
# 配置接口的函数
def config_int(interface, name, security_level, ip_addr, mask):
# 复制测试页面中得到的配置接口信息的json模板,进行简单修改
obj_info = {
"kind": "object#GigabitInterface",
"hardwareID": interface,
"interfaceDesc": name,
"channelGroupID": "",
"channelGroupMode": "active",
"duplex": "auto",
"lacpPriority": -1,
"managementOnly": False,
"mtu": 1500,
"name": name,
"securityLevel": security_level,
"shutdown": True,
"speed": "auto",
"flowcontrolOn": False,
"flowcontrolHigh": -1,
"flowcontrolLow": -1,
"flowcontrolPeriod": -1,
"forwardTrafficCX": False,
"forwardTrafficSFR": False,
"ipAddress": {
"kind": "StaticIP",
"ip": {
"kind": "IPv4Address",
"value": ip_addr
},
"netMask": {
"kind": "IPv4NetMask",
"value": mask
}
}
}
# 注意添加路径信息
api_path = "/api/interfaces/physical/GigabitEthernet0_API_SLASH_0"
url_api = url + api_path
# 获取token值
header = get_token()
r = requests.put(url_api, headers=header, json=obj_info, verify=False)
# 返回结果
if r.ok:
return f'配置接口{interface}成功'
else:
return '配置出错'
# 配置路由的函数
def config_route(dest_network, out_int, next_hop):
# 同理对复制的json文件进行修改
obj_info = {
"kind": "object#IPv4Route",
"gateway": {
"kind": "IPv4Address",
"value": next_hop
},
"distanceMetric": 1,
"network": {
"kind": "IPv4Network",
"value": dest_network
},
"tracked": False,
"tunneled": False,
"interface": {
"kind": "objectRef#Interface",
"name": out_int
}
}
# 注意路径
api_path = "/api/routing/static"
url_api = url + api_path
header = get_token()
r = requests.post(url_api, headers=header, json=obj_info, verify=False)
if r.ok:
return f'配置路由{dest_network} {next_hop}成功'
else:
return '配置出错'
if __name__ == '__main__':
# 配置IP地址
print(config_int('GigabitEthernet0/0', 'Outside', 0, '202.100.1.254', '255.255.255.0'))
print(config_int('GigabitEthernet0/1', 'Inside', 100, '10.1.1.254', '255.255.255.0'))
print(config_int('GigabitEthernet0/2', 'DMZ', 50, '172.16.1.254', '255.255.255.0'))
# 配置路由
print(config_route('1.1.1.0/24', 'Outside', '202.100.1.1'))
print(config_route('2.2.2.0/24', 'Inside', '10.1.1.1'))
print(config_route('3.3.3.0/24', 'DMZ', '172.16.1.1'))
测试结果:
参考资料来源:
https://www.jianshu.com/p/75389ea9a90b、现任明教教主