searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

在云主机上实现自动化安装MySQL数据库

2023-05-26 01:36:47
66
0

目的:以用户角度通过阅读天翼云科技有限公司的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源"
wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

echo "安装mysql源"
sudo rpm -Uvh mysql80-community-release-el7-3.noarch.rpm
yum repolist enabled | grep "mysql.*-community.*"
yum -y install yum-utils
sudo yum-config-manager --disable mysql80-community
sudo yum-config-manager --enable mysql57-community
sudo yum install mysql-community-server
systemctl start mysqld.service
systemctl status mysqld.service
grep 'temporary password' /var/log/mysqld.log
mysql -uroot -p

图6


(三)创建云主机并安装MySQL,从MySQL数据库中查询一条数据,验证已成功安装。


全流程的主函数如下图7所示。

if __name__ == '__main__':
    # 创建云主机
    instanceInfo, instanceID, password = doCreateInstance()
    # 绑定弹性ip
    floatingIP = doAssociateEIP(instanceID)
    # # 创建安全组3306端口入向规则
    doCreateSecurityGroupRules(instanceInfo)

    # 安装mysql
    ssh = SSHConnection(host=floatingIP, port=22, username='root', pwd=password)
    mysqlpwd = 'Yangpan123$'
    ssh.connect()
    mysqlExist = ssh.cmd('rpm -qa|grep mysql')
    if "mysql" not in mysqlExist:
        # 执行安装mysql操作
        print("mysql未安装")
        print("上传文件的操作")
        # ssh.upload("E:/createInstance/installMysql.sh", "/root/installMysql.sh")
        result = ssh.cmd('sh /root/installMysql.sh')
        print(result)
        print("执行结束")
        ssh.close()
    # 连接mysql,执行操作
    db = SQLdb(host=floatingIP, username='root', password=mysqlpwd, dbname='mysql')
    tables = db.list_table()
    table = tables[-1]
    sql = "select * from %s;" % table
    result = db.fechdb(sql)
    print("输出表中内容:",result)
    print(len(result))

图7

0条评论
0 / 1000
y****n
3文章数
0粉丝数
y****n
3 文章 | 0 粉丝