網站首頁 編程語言 正文
1. 前言
由于線路供應商sdwan存在單點問題,需要實現線路高可用解決方案,需要設計自動切換阿里云vpc路由解決方案。通過阿里云文檔了解,可通過阿里云專有網絡Python SDK,通過sdk實現創建、刪除、查詢等vpc網絡相關操作(創建/刪除路由表、創建/刪除自定義路由等)。
環境準備
- Python 2.7及3.x環境(這里使用python3.9.6)
- 配置阿里云賬號和訪問密鑰(AccessKey),權限:AliyunVPCFullAccess
- 安裝Alibaba Cloud SDK for Python
2. 安裝
安裝Alibaba Cloud SDK
# 安裝模塊
pip install alibabacloud_tea_openapi
pip install alibabacloud_vpc20160428==2.0.0
pip install aliyun-python-sdk-vpc==3.0.25
# 安裝sdk示例庫,完成環境初始化
git clone https://github.com/aliyun/aliyun-openapi-python-sdk-examples.git
cd aliyun-openapi-python-sdk-examples/sdk_examples/
python setup.py install
安裝效果如下
3. 使用方法?
在解壓的目錄.sdk_examples/examples/,可以看到除了vpc的py腳本,還有slb,eip等,根據需要可自行查看修改,這里使用sdk_examples/examples/vpc/vpc_route_entry.py進行修改,原代碼為
#encoding=utf-8
import sys
import json
import time
from aliyunsdkcore.acs_exception.exceptions import ServerException, ClientException
from aliyunsdkvpc.request.v20160428 import CreateRouteEntryRequest
from aliyunsdkvpc.request.v20160428 import DeleteRouteEntryRequest
from aliyunsdkvpc.request.v20160428 import DescribeRouteTablesRequest
from sdk_lib.exception import ExceptionHandler
from sdk_lib.check_status import CheckStatus
from sdk_lib.common_util import CommonUtil
from sdk_lib.sdk_vswitch import VSwitch
from sdk_lib.sdk_route_table import RouteTable
from sdk_lib.consts import *
class RouteEntry(object):
def __init__(self, client):
self.client = client
def create_route_entry(self, params):
"""
create_route_entry: 創建route_entry路由條目
官網API參考鏈接: https://help.aliyun.com/document_detail/36012.html
"""
try:
request = CreateRouteEntryRequest.CreateRouteEntryRequest()
# 路由表ID
request.set_RouteTableId(params['route_table_id'])
# 自定義路由條目的目標網段
request.set_DestinationCidrBlock(params['destination_cidr_block'])
# 下一跳的類型
request.set_NextHopType(params['nexthop_type'])
# 下一跳實例的ID
request.set_NextHopId(params['nexthop_id'])
response = self.client.do_action_with_exception(request)
response_json = json.loads(response)
# 判斷router entry狀態是否可用
if CheckStatus.check_status(TIME_DEFAULT_OUT, DEFAULT_TIME,
self.describe_route_entry_status,
AVAILABLE, params['route_table_id']):
return response_json
except ServerException as e:
ExceptionHandler.server_exception(e)
except ClientException as e:
ExceptionHandler.client_exception(e)
def delete_route_entry(self, params):
"""
delete_route_entry: 刪除route_entry路由條目
官網API參考鏈接: https://help.aliyun.com/document_detail/36013.html
"""
try:
request = DeleteRouteEntryRequest.DeleteRouteEntryRequest()
# 路由條目所在的路由表的ID
request.set_RouteTableId(params['route_table_id'])
# 路由條目的目標網段
request.set_DestinationCidrBlock(params['destination_cidr_block'])
# 下一跳實例的ID
request.set_NextHopId(params['nexthop_id'])
response = self.client.do_action_with_exception(request)
response_json = json.loads(response)
time.sleep(DEFAULT_TIME)
return response_json
except ServerException as e:
ExceptionHandler.server_exception(e)
except ClientException as e:
ExceptionHandler.client_exception(e)
def describe_route_entry_vrouter(self, params):
"""
describe_route_entry_vrouter: 查詢route_entry路由條目
官網API參考鏈接: https://help.aliyun.com/document_detail/36014.html
"""
try:
request = DescribeRouteTablesRequest.DescribeRouteTablesRequest()
# 路由表所屬的VPC路由器或邊界路由器的ID
request.set_VRouterId(params['vrouter_id'])
# 路由表的ID
request.set_RouteTableId(params['route_table_id'])
response = self.client.do_action_with_exception(request)
response_json = json.loads(response)
return response_json
except ServerException as e:
ExceptionHandler.server_exception(e)
except ClientException as e:
ExceptionHandler.client_exception(e)
def describe_route_entry(self, route_table_id):
"""
describe_route_entry: 查詢route_entry路由條目
官網API參考鏈接: https://help.aliyun.com/document_detail/36014.html
"""
try:
request = DescribeRouteTablesRequest.DescribeRouteTablesRequest()
request.set_RouteTableId(route_table_id)
response = self.client.do_action_with_exception(request)
response_json = json.loads(response)
return response_json
except ServerException as e:
ExceptionHandler.server_exception(e)
except ClientException as e:
ExceptionHandler.client_exception(e)
def describe_route_entry_status(self, route_table_id):
"""
describe_route_entry_status: 查詢route_entry路由條目當前狀態
"""
response = self.describe_route_entry(route_table_id)
return response["RouteTables"]["RouteTable"][0]["RouteEntrys"]["RouteEntry"][0]["Status"]
def main():
client = ACS_CLIENT
vswitch = VSwitch(client)
route_table = RouteTable(client)
route_entry = RouteEntry(client)
params = {}
params['route_table_name'] = "sdk_route_table"
params['destination_cidr_block'] = "0.0.0.0/0"
params['nexthop_id'] = "i-xxx"
params['nexthop_type'] = "Instance"
params['vpc_id'] = "vpc-xxx"
params['vswitch_id'] = "vsw-xxx"
#創建route table
route_table_json = route_table.create_route_table(params)
CommonUtil.log("create_route_table", route_table_json)
#查詢vswitch
vswitch_json = vswitch.describe_vswitch_attribute(params)
CommonUtil.log("describe_vswitch_attribute", vswitch_json)
#route table綁定vswitch
params['route_table_id'] = route_table_json['RouteTableId']
associate_json = route_table.associate_route_table(params)
CommonUtil.log("associate_route_table", associate_json)
#創建路由條目
create_route_entry_json = route_entry.create_route_entry(params)
CommonUtil.log("create_route_entry", create_route_entry_json)
#刪除路由條目
delete_route_entry_json = route_entry.delete_route_entry(params)
CommonUtil.log("delete_route_entry", delete_route_entry_json)
#route table解綁vswitch
unassociate_json = route_table.unassociate_route_table(params)
CommonUtil.log("unassociate_route_table", unassociate_json)
#刪除route table
delete_route_table_json = route_table.delete_route_table(params)
CommonUtil.log("delete_route_table", delete_route_table_json)
if __name__ == "__main__":
sys.exit(main())
改為兩個py腳本,一個添加路由,一個刪除路由
添加路由腳本:add_route.py
#encoding=utf-8
import sys
import json
import time
from aliyunsdkcore.acs_exception.exceptions import ServerException, ClientException
from aliyunsdkvpc.request.v20160428 import CreateRouteEntryRequest
from aliyunsdkvpc.request.v20160428 import DeleteRouteEntryRequest
from aliyunsdkvpc.request.v20160428 import DescribeRouteTablesRequest
from sdk_lib.exception import ExceptionHandler
from sdk_lib.check_status import CheckStatus
from sdk_lib.common_util import CommonUtil
from sdk_lib.sdk_vswitch import VSwitch
from sdk_lib.sdk_route_table import RouteTable
from sdk_lib.consts import *
class RouteEntry(object):
def __init__(self, client):
self.client = client
def create_route_entry(self, params):
"""
create_route_entry: 創建route_entry路由條目
"""
try:
request = CreateRouteEntryRequest.CreateRouteEntryRequest()
# 路由表ID
request.set_RouteTableId(params['route_table_id'])
# 自定義路由條目的目標網段
request.set_DestinationCidrBlock(params['destination_cidr_block'])
# 下一跳的類型
request.set_NextHopType(params['nexthop_type'])
# 下一跳實例的ID
request.set_NextHopId(params['nexthop_id'])
response = self.client.do_action_with_exception(request)
response_json = json.loads(response)
# 判斷router entry狀態是否可用
if CheckStatus.check_status(TIME_DEFAULT_OUT, DEFAULT_TIME,
self.describe_route_entry_status,
AVAILABLE, params['route_table_id']):
return response_json
except ServerException as e:
ExceptionHandler.server_exception(e)
except ClientException as e:
ExceptionHandler.client_exception(e)
def describe_route_entry_status(self, route_table_id):
"""
describe_route_entry_status: 查詢route_entry路由條目當前狀態
"""
response = self.describe_route_entry(route_table_id)
return response["RouteTables"]["RouteTable"][0]["RouteEntrys"]["RouteEntry"][0]["Status"]
def describe_route_entry_vrouter(self, params):
"""
describe_route_entry_vrouter: 查詢route_entry路由條目
"""
try:
request = DescribeRouteTablesRequest.DescribeRouteTablesRequest()
# 路由表所屬的VPC路由器或邊界路由器的ID
request.set_VRouterId(params['vrouter_id'])
# 路由表的ID
request.set_RouteTableId(params['route_table_id'])
response = self.client.do_action_with_exception(request)
response_json = json.loads(response)
return response_json
except ServerException as e:
ExceptionHandler.server_exception(e)
except ClientException as e:
ExceptionHandler.client_exception(e)
def describe_route_entry(self, route_table_id):
"""
describe_route_entry: 查詢route_entry路由條目
"""
try:
request = DescribeRouteTablesRequest.DescribeRouteTablesRequest()
request.set_RouteTableId(route_table_id)
response = self.client.do_action_with_exception(request)
response_json = json.loads(response)
return response_json
except ServerException as e:
ExceptionHandler.server_exception(e)
except ClientException as e:
ExceptionHandler.client_exception(e)
def main():
# 這里填上上面創建的阿里云帳號accesskey和secretkey,以及vpc地域
client = AcsClient(
'***',
'***',
'cn-guangzhou')
vswitch = VSwitch(client)
route_table = RouteTable(client)
route_entry = RouteEntry(client)
# 變量params參數,根據需要添加路由,pvc id,switch id和路由表名稱
params = {}
params['route_table_name'] = "sdk_route_table"
params['destination_cidr_block'] = "0.0.0.0/0"
params['nexthop_id'] = "i-xxx"
params['nexthop_type'] = "Instance"
params['vpc_id'] = "vpc-xxx"
params['vswitch_id'] = "vsw-xxx"
#創建路由條目
create_route_entry_json = route_entry.create_route_entry(params)
CommonUtil.log("create_route_entry", create_route_entry_json)
if __name__ == "__main__":
sys.exit(main())
使用方法:
python add_route.py
刪除路由腳本:del_route.py
#encoding=utf-8
import sys
import json
import time
from aliyunsdkcore.acs_exception.exceptions import ServerException, ClientException
from aliyunsdkvpc.request.v20160428 import CreateRouteEntryRequest
from aliyunsdkvpc.request.v20160428 import DeleteRouteEntryRequest
from aliyunsdkvpc.request.v20160428 import DescribeRouteTablesRequest
from sdk_lib.exception import ExceptionHandler
from sdk_lib.check_status import CheckStatus
from sdk_lib.common_util import CommonUtil
from sdk_lib.sdk_vswitch import VSwitch
from sdk_lib.sdk_route_table import RouteTable
from sdk_lib.consts import *
class RouteEntry(object):
def __init__(self, client):
self.client = client
def delete_route_entry(self, params):
"""
delete_route_entry: 刪除route_entry路由條目
"""
try:
request = DeleteRouteEntryRequest.DeleteRouteEntryRequest()
# 路由條目所在的路由表的ID
request.set_RouteTableId(params['route_table_id'])
# 路由條目的目標網段
request.set_DestinationCidrBlock(params['destination_cidr_block'])
# 下一跳實例的ID
request.set_NextHopId(params['nexthop_id'])
response = self.client.do_action_with_exception(request)
response_json = json.loads(response)
time.sleep(DEFAULT_TIME)
return response_json
except ServerException as e:
ExceptionHandler.server_exception(e)
except ClientException as e:
ExceptionHandler.client_exception(e)
def main():
# 這里填上上面創建的阿里云帳號accesskey和secretkey,以及vpc地域
client = AcsClient(
'***',
'***',
'cn-guangzhou')
vswitch = VSwitch(client)
route_table = RouteTable(client)
route_entry = RouteEntry(client)
# 變量params參數,根據需要添加路由,pvc id,switch id和路由表名稱
params = {}
params['route_table_name'] = "sdk_route_table"
params['destination_cidr_block'] = "0.0.0.0/0"
params['nexthop_id'] = "i-xxx"
params['nexthop_type'] = "Instance"
params['vpc_id'] = "vpc-xxx"
params['vswitch_id'] = "vsw-xxx"
#刪除路由條目
delete_route_entry_json = route_entry.delete_route_entry(params)
CommonUtil.log("delete_route_entry", delete_route_entry_json)
if __name__ == "__main__":
sys.exit(main())
使用方法:
python del_route.py
原文鏈接:https://blog.csdn.net/manwufeilong/article/details/131477339
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-07-13 SpringCloud之Eureka注冊中心
- 2022-07-22 C語言輸出所有水仙花數
- 2022-03-26 .Net?6中的PeriodTimer介紹_ASP.NET
- 2022-08-18 Docker搭建私有GitLab服務的方法_docker
- 2023-05-26 shell腳本執行命令自動填充密碼(自動輸入密碼)_linux shell
- 2021-12-10 C#實現簡易灰度圖和酷炫HeatMap熱力圖winform(附DEMO)_C#教程
- 2022-06-23 基于Flutter制作一個心碎動畫特效_Android
- 2022-06-29 徹底掌握C語言strcpy函數的用法_C 語言
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支