#安装单机的opengauss数据库
#数据库版本3.0.5
#安装路径默认路径/opt下
#其他版本替换对应下载文件地址

import paramiko
import time
#配置基础信息
ip=input("请输入公网ip地址:")
host=input("请输入私网ip地址:")
ecs_name=input("请输入服务器名称:")
password=input("请输入root密码:")
user=input("请输入安装用户名:")

#校验密码复杂度
def check(passwd: str):
    if passwd=='':
        return False
    else:
        #大小写
        havealpha=passwd.swapcase()!=passwd
        #数字
        havedigit=any(each.isdigit() for each in passwd)
        #长度
        long=len(passwd)>=8
        #输出
        ret= havealpha  and havedigit and long
        return ret
#数据库登录密码
password_of_admin=''
#普通安装用户密码
password_of_omm=''
#配置数据库安装用户omm的密码
while not check(password_of_omm):
    print("密码必须包含字母数字和特殊字符")
    password_of_omm=input("请输入普通安装用户的账号密码")

#配置数据库的密码
while not check(password_of_admin):
    print("密码必须包含字母数字和特殊字符")
    password_of_admin=input("请输入数据库的账号密码")

#配置数据库安装的xml文件,安装目录默认/opt下,可自行更改
xml_data=('''<?xml version="1.0" encoding="utf-8"?>
<ROOT>
  <CLUSTER>
    <PARAM name="clusterName" value="single_test" />
    <PARAM name="nodeNames" value="#服务器的主机名#"/>
    <PARAM name="gaussdbAppPath" value="/opt/huawei/install/app" />
    <PARAM name="gaussdbLogPath" value="/opt/huawei/log/omm" />
    <PARAM name="tmpMppdbPath" value="/opt/huawei/tmp"/>
    <PARAM name="gaussdbToolPath" value="/opt/huawei/install/om" />
    <PARAM name="corePath" value="/opt/huawei/corefile"/>
    <PARAM name="backIp1" value="#服务器ip#"/>
  </CLUSTER>

  <DEVICELIST>
    <DEVICE sn="#服务器的主机名#">
      <PARAM name="name" value="#服务器的主机名#"/>
      <PARAM name="azName" value="AZ1"/>
      <PARAM name="azPriority" value="1"/>
      <PARAM name="backIp1" value="#服务器ip#"/>
      <PARAM name="sshIp1" value="#服务器ip#"/>
      <!-- dn -->
      <PARAM name="dataNum" value="1"/>
      <PARAM name="dataPortBase" value="15400"/>
      <PARAM name="dataNode1" value="/opt/huawei/install/data/dn"/>
    </DEVICE>
  </DEVICELIST>
</ROOT>
''')

# 定义发送命令函数
def connect(cmds_):
    try:
        # 发送命令
        for cmd_ in cmds_:
            execute_.send(cmd_ + '\n')
            time.sleep(1)
        time.sleep(3)
        output_ = execute_.recv(65535).decode()
        print(output_)
    except Exception as ex:
        print("发送命令错误", ex)

#定义等待函数
def wait(sec):
    for t in range(sec):
        try:
            # 发送命令
            execute_.send('\n')  # 请勿修改,程序依靠此bug运行
            time.sleep(1)
            output_ = execute_.recv(65535).decode()
            print('#请稍候' + str(t) + '/' + str(sec) + output_)
            if 'saved' in output_:
                break
            if t == 119:
                raise ConnectionError('网络不佳,请求超时')
        except Exception as ex:
            print("发送加载命令错误", ex)
# 定义上传文件函数
def upload(file_name_, remote_path_):
    try:
        # 上传文件
        sftp.put(file_name_, remote_path_)
    except Exception as ex:
        print("上传错误", ex)

# 定义发送转换命令函数
def sed(remote_path_):
    try:
        # 发送命令
        execute_.send(f"sed -i 's/\\r//' {remote_path_}" + "\n")  # 请勿修改,程序依靠此bug运行
        time.sleep(1)
        output_ = execute_.recv(65535).decode()
        print(output_)
    except Exception as ex:
        print("发送转换命令错误", ex)

# 修改XML文件
with open(r'single.xml', 'w', encoding='utf-8') as file:
    file.write(xml_data)
#替换的主机名
search_name = '#服务器的主机名#'
replace_name = ecs_name
#替换的ip地址
search_IP = '#服务器ip#'
replace_IP =host
with open(r'single.xml', 'r', encoding='utf-8') as file:
    data = file.read()
    data = data.replace(search_name, replace_name)
    data = data.replace(search_IP, replace_IP)
    data = data.replace('\r', '')
with open(r'single.xml', 'w', encoding='utf-8') as file:
    file.write(data)
print('成功更改XML')

#实例化
con = paramiko.SSHClient()
#添加公钥
con.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#连接
con.connect(hostname=ip, username='root', password=password, look_for_keys=False, allow_agent=False)
#执行和上传实例化
execute_=con.invoke_shell()
sftp=paramiko.SFTPClient.from_transport(con.get_transport())
print("连服务器"+ip+"成功")
#安装数据库所需要的依赖包
cmds = ['cd /usr/bin',
        'mv python python.bak',
        'ln -s python3 /usr/bin/python',
        'yum  -y install tar bzip2 libaio-devel ']
connect(cmds)
print('成功修改python版本并安装libaio包')
wait(2)
#创建安装用户user
cmds=['groupadd dbgrp',
      'useradd -G dbgrp  '+user]
connect(cmds)

# 安装openGauss数据库
# 登录待安装的主机,创建目录
# 下载openGauss安装包
cmds = ['mkdir -p /opt/software/openGauss',
        'chmod 755 -R /opt/software',
        'cd /opt/software/openGauss',
        'wget https://opengauss.obs.cn-south-1.myhuaweicloud.com/3.0.5/x86/openGauss-3.0.5-CentOS-64bit-all.tar.gz',
        ]
connect(cmds)
print('开始下载opengauss3.0.5版本安装包')
wait(30)

#发送配置文件xml到安装目录下
filename = 'single.xml'
remote_path = '/opt/software/openGauss/' + filename
upload(filename, remote_path)
sed(remote_path)
print('成功配置XML')
# 在安装包所在的目录下,解压安装包
cmds = ['source /etc/profile',
        'cd /opt/software/openGauss',
        'tar -zxvf openGauss-3.0.5-CentOS-64bit-all.tar.gz']
connect(cmds)
wait(3)
print('解压安装包all完成')
#解压om包
cmds =['cd /opt/software/openGauss',
       'tar -zxvf openGauss-3.0.5-CentOS-64bit-om.tar.gz']
connect(cmds)
print("解压安装包om完成")
wait(3)

#执行预安装
# 切换到gs_preinstall命令所在目录
# 创建openGauss omm用户互信
cmds = ['cd /opt/software/openGauss/script/',
        'python gs_preinstall -U  '+user+ ' -G dbgrp -X /opt/software/openGauss/single.xml']
connect(cmds)
print("请等待12s预安装。。")
time.sleep(20)
# print('成功请求互信')
# 是否创建user用户
cmds=['no']
connect(cmds)
time.sleep(1)
#开始正式安装
cmds=['chmod -R 755 /opt/software/openGauss/script/',
      'su - '+user ,
      'cd /opt/software/openGauss/script',
      'python gs_install -X /opt/software/openGauss/single.xml']
connect(cmds)
print("请耐心等待1分钟左右开始安装。。")
#确认数据库密码
time.sleep(60)
cmds = [password_of_admin,password_of_admin]
connect(cmds)
print('数据库安装中,请耐心等待1分钟。。')
time.sleep(60)
cmds=['gs_om -t status --detail']
connect(cmds)

print("opengauss状态正常")
#上述操作创建的服务器安装用户密码不成功,重新刷新下
cmds=['echo '+password_of_omm+' | passwd --stdin  '+user]
connect(cmds)
print("安装用户密码修改完成")

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐