使用Python调用ASA rest API进行配置

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、现任明教教主

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

格洛米爱学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值