目的:以用户角度通过阅读天翼云科技有限公司的OpenAPI官网文档,编写Python脚本,在已使用OpenAPI接口创建一台云主机的基础上(注:云主机的创建也采用自动化python脚本编写运行),在云主机上搭建MySQL数据库,实现全自动化安装。
首先准备一份CTAPI脚本,在此脚本基础上继续编写。
第一步:云主机绑定弹性IP
在已创建一台可正常运行的云主机的基础上,且获取该云主机的云主机ID和密码等必要信息,因云主机需要连接网络,所以进行创建弹性IP的操作。
(一)创建弹性IP
url 为‘https://ctvpc-global.ctapi.ctyun.cn/v4/eip/create’
参数为:
clientToken: 客户端存根
regionID:资源池ID
cycleType:订购类型
cycleCount:订购时长
name:弹性IP名称
调用方式为:POST
创建弹性IP脚本如下图1:
# 创建弹性ip def createEIP(): uri = '/v4/eip/create' params = { 'clientToken': 'EIPClientToken', 'cycleType': 'month', 'cycleCount': 1, 'name': 'testIP' } eipObj = doBasePostNetWork(uri, params=params) orderID = eipObj.get("returnObj").get("masterOrderID") status = eipObj.get("returnObj").get("masterResourceStatus") return orderID, status |
图1
因创建弹性IP是异步操作,返回订单ID,而不是弹性IP的ID,需要通过查询弹性IP列表的接口获取指定资源池内全部的弹性IP,通过弹性IP的name筛选出上步创建的IP。
(二)查询弹性IP
url 为’https://ctvpc-global.ctapi.ctyun.cn /v4/eip/list’
参数为:clientToke、regionID
调用方式为POST
查询弹性IP的脚本如图2:
# 查询弹性ip def getEIP(): uri = '/v4/eip/list' params = { 'clientToken': CLIENTTOKEN } eipObj = doBasePostNetWork(uri, params=params) totalPage = eipObj.get("totalPage") if totalPage != 1: for i in range(totalPage): params['pageNo'] = i + 1 eipObj = doBasePostNetWork(uri, params=params) eipList = eipObj.get("returnObj").get("eips") # 筛选出name对应的eip eipAvaliableList = list(filter(lambda x: x.get("name") == 'testIP', eipList)) if eipAvaliableList: return eipAvaliableList else: print("eip不存在") |
图2
(三)弹性IP绑定到云主机
url 为' https://ctvpc-global.ctapi.ctyun.cn/v4/eip/associate'
参数为:clientToken、regionID、
eipID: EIP 的 ID
associationID:实例的ID
associationType:实例的类型
调用方式POST
EIP绑定云主机的脚本如图3:
# 绑定到云主机上 def associateEIPToECS(eipID, associationInstanceID, associationType=1): uri = '/v4/eip/associate' params = { 'clientToken': CLIENTTOKEN, 'eipID': eipID, 'associationID': associationInstanceID, 'associationType': associationType } returnObj = doBasePostNetWork(uri, params) return returnObj |
图3
第二步:创建安全组的3306端口入向规则
3306是MySQL的默认端口号,查询云主机的安全组规则是否已开启SSH远程连接 3306端口,若没有则需要创建安全组的3306端口的入向规则。
url:https://ctvpc-global.ctapi.ctyun.cn/v4/vpc/create-security-group-ingress
参数为:regionID、clientToken
securityGroupID:安全组ID
securityGroupRules:规则信息
securityGroupRules包含:direction入方向、action拒绝或接受策略、protocol协议、ethertype IP类型。
调用方式POST
创建安全组3306入向规则脚本如下图4和图5:
# 3306入向规则信息 securityGroupRule = { "direction": "ingress", "action": "accept", "priority": 1, "protocol": "TCP", "ethertype": "IPv4", "destCidrIp": "0.0.0.0/0", "description": "ingress 3306", "range": "3306" } |
图4
# 创建此云主机对应的安全组入向规则 def createSecurityGroupIngress(securityGroupID, securityGroupRule): uri = '/v4/vpc/create-security-group-ingress' securityGroupRules = [securityGroupRule] params = { 'securityGroupID': securityGroupID, 'securityGroupRules': securityGroupRules, 'clientToken': 'securityIngressClientToken' } result = doBasePostNetWork(uri, params=params) if result and result.get("statusCode") != 800: raise Exception("创建安全组:%s入向规则失败" % securityGroupID) |
图5
第三步:安装MySQL
(一)导入python库Paramiko
Paramiko介绍:Paramiko属于python的一个第三方库,可以远程连接Linux服务器,进行通过python进行对Linux进行操作,可以实现进行对远程服务器进行下载和上传文件操作。
Paramiko库主要包含两个部分:SSHClient和SFTPClient。SSHClient是表示类似于Linux的ssh命令,我们可以通过SSHClient模块对远程服务器执行一些命令操作(Linux)。此处选用SSHClient。
关于SSHClient的基本操作,详细情况可参照:https://zhuanlan.zhihu.com/p/456447145
(二)使用Paramiko执行安装MySQL的命令
MySQL的安装命令被记录在本地文件installMySQL里,文件内容如下图6:
#!/bin/bash echo "安装mysql源" |
图6
(三)创建云主机并安装MySQL,从MySQL数据库中查询一条数据,验证已成功安装。
全流程的主函数如下图7所示。
if __name__ == '__main__': # 安装mysql |
图7