灌水唠嗑区
技术分享
文章

Python 自动化办公系列(01)云服务器连接测试和 host name 批量更名

发表于2025-09-26 09:50:5346次浏览3个评论

# -*- coding: utf-8 -*-
__author__ = "HaoJun"
__doc__ = "云服务器连接测试和 host name 批量更名"
# 项目背景:认证培训分配给学员的云服务器,缺省是随机字串的主机名需要规范以便学员遇到安装卸载问题,我可以迅速找到他的节点远程登录。每期我要重做操作系统,主机名又变成随机字串了。如果我逐个登录节点使用 hostnameclt 命令修改,工足量很大。所以我编写了这个 python 程序,在规范主机名的同时,又验证了  OS 重置后 root 密码是否正确。

# [2024.09.25] Python 3.7 测试通过,但是 3.8 报错:ImportError: DLL load failed while importing _rust
# [2024.09.26] cryptography ==> from 4.2 to 3.3; bcrypt ==> from 4.2 to 3.2 解决 ImportError
from fabric2 import Connection # 导入运维模块
import pandas as pd # 这里使用 pandas 仅仅为了读写 excel 和数据分析无关
from enum import Enum # 枚举模块

excelFile = r"D:\6_生态发展部\云服务器管理\阿里云\阿里云云服务器_Python.xlsx" #  工作模板
excelData = pd.DataFrame(pd.read_excel(excelFile,keep_default_na=False)) # Need install module named 'xlrd'

class KEYS(Enum): #  工作模板要求的栏位名
    COLUMN_ID = "ID" # 示例唯一标识
    COLUMN_NAME = "instName" # 示例名称
    COLUMN_PIP = "Public IP" # 公网 IP
    COLUMN_PORT = "SSH Port" # SSH 协议外部映射端口
    COLUMN_PWD = "root password" # root 账户密码

def chkExcelHead(): # 判断工作模板栏位名是否正确
    excelColumns = excelData.columns.to_list() # 从 Excel 文件读出来的表头,转换成列表
    bExit = True
    for oKey in KEYS:
        if oKey.value not in excelColumns:
            print('在"{0}"中找不到表头"{1}"!'.format(excelFile,oKey.value))
            bExit = False
            break
    return bExit

def renameHostName(ip, port, user, password, newhostname):
    #ip = "8.130.74.15" # 公网 IP
    cmd = 'hostnamectl set-hostname' # 修改主机名称的 shell 命令
    conSSH = None
    try:
        conSSH = Connection(ip, user, port=port, connect_kwargs={'password': password}) # 连接云服务器得到 SSH 实例
        result = conSSH.run("hostname", hide=True) # 查看 hostname 是否规范
        curHostname = result.stdout
        if curHostname.rstrip() != newhostname:
            cmdDetail = '{0} {1}'.format(cmd, newhostname) # 修改主机名的命令字串
            result = conSSH.run(cmdDetail, hide=True)
            print("Modify the hostname of No. {0} successfully!".format(port))
        else:
            print("Need not modify the hostname of port {}".format(port))
    except BaseException as e:
        print("Fail to modify host No.{} : {}".format(port, e))
    finally:
        if conSSH is not None:
            conSSH.close()

def main():
    if not chkExcelHead():
        exit(1)
    for i in range(len(excelData)):
        id = excelData.loc[i, KEYS.COLUMN_ID.value]
        if id == '': continue
        ip = excelData.loc[i, KEYS.COLUMN_PIP.value] # 得到工作模板的 IP
        port = excelData.loc[i, KEYS.COLUMN_PORT.value] # 得到工作模板的 SSH Port
        password = excelData.loc[i, KEYS.COLUMN_PWD.value] # 得到工作模板的 root 账户密码
        hostname = excelData.loc[i, KEYS.COLUMN_NAME.value] # 得到工作模板 应该规范成的主机名
        renameHostName(ip, int(port), "root", password, hostname) # 调用修改主机名函数

if __name__ == "__main__":
    main()

评论

登录后才可以发表评论
嗷呜一口仙贝发表于 10个月前
学习学习
用户头像
GBase用户28017发表于 9个月前
学习。
新疆油腻大叔发表于 2个月前
来了