当前位置: 首页 > article >正文

利用Python脚本批量管理Linux服务器部署服务

在日常运维和开发工作中,批量管理服务器是一个常见的需求,尤其是在多个Linux服务器上进行统一的任务操作时。本文将介绍一个Python脚本,它通过paramiko库和pandas库,自动化了在多台Linux服务器上的批量部署和操作。具体场景包括:连接服务器、同步时间、执行命令、上传文件并记录部署结果等。

主要技术要点
  • paramiko:用于通过SSH协议连接远程服务器,执行命令和传输文件。
  • pandas:用于处理和操作Excel文件,从中读取服务器的相关信息,并将操作结果记录回Excel表中。
  • 正则表达式(re):用于从命令输出中提取Linux服务器IP地址。

脚本分解

1. 获取服务器信息并连接服务器

首先,脚本定义了一个GetLinuxIp类,通过paramiko库连接到Linux服务器,并执行指定命令。

import paramiko
import re

class GetLinuxIp():
    '''获取linux服务器ip'''

    def __init__(self, stationname, hostname, port, username, password, cmds):
        self.stationname = stationname
        self.ip = hostname
        self.port = port
        self.user = username
        self.password = password
        self.cmds = cmds
        try:
            self.client = paramiko.SSHClient()
            self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            self.client.connect(self.ip, self.port, self.user, self.password, timeout=10)
            print(self.stationname, "连接成功...")
        except Exception as e:
            print("连接失败!!!!!!!!!")
  • paramiko.SSHClient():实例化SSH客户端,通过SSH协议与服务器交互。
  • connect():连接指定的服务器,传入IP地址、端口号、用户名、密码。
  • 如果连接失败,捕获异常并打印错误信息。
2. 执行命令并提取IP

通过exec_command方法,可以远程执行命令并获取输出。此脚本使用正则表达式提取服务器IP地址。

    def excute_command(self):
        '''执行命令'''
        self.stdin, self.stdout, self.stderr = self.client.exec_command(self.cmds)

    def get_result(self):
        '''获取结果'''
        result = self.stdout.read().decode()
        pattern = re.compile(r'((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}')
        self.ip = pattern.search(result).group()
        print("获取到linux服务器的ip是:{}".format(self.ip))
  • exec_command():执行远程命令,并通过标准输出、标准错误获取结果。
  • 正则表达式匹配:re.compile()用于匹配标准IPv4地址,并提取其中的有效IP。
3. 读取服务器配置文件并执行批量操作

脚本通过pandas读取包含服务器信息的Excel表格,并根据每行的服务器信息执行连接、命令执行和文件上传等操作。

def Start_JYServer():
    OpenFile = '交调服务IP配置表全_2022_03_20.xlsx'
    IP_DATA = pd.read_excel(OpenFile, engine='openpyxl', names=['收费站名称', '传输服务器IP', '用户名', '密码', '部署结果', '部署时间'],
                           usecols=[0, 1, 2, 3, 4, 5])

    for index, row in IP_DATA.iterrows():
        STATION_NAME = row['收费站名称']
        IP = row['传输服务器IP']
        USERNAME = row['用户名']
        PASSWORD = str(row['密码'])
        
        # 调用 GetLinuxIp 进行连接和操作
        linux = GetLinuxIp(STATION_NAME, IP, 22, USERNAME, PASSWORD, "ifconfig")
        linux.excute_command()
        linux.get_result()
        linux.close_linuxserver(STATION_NAME)
  • Excel读取:通过pandas.read_excel()读取Excel文件,获取服务器的站点名称、IP、用户名和密码等信息。
  • 批量操作:通过iterrows()逐行遍历服务器信息,依次进行操作。
4. 同步时间和文件上传

脚本在成功连接服务器后,自动同步时间并根据需求上传必要的文件到远程服务器。它会检查远程服务器中是否存在指定的目录,若不存在则上传并解压。

    now_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    cmds = 'date -s ' + "\"" + str(now_time) + "\""
    host.send('date', r'.*(]#|返回结果).*')
    host.send(cmds, r'.*(]#|返回结果).*')
    host.send('hwclock -w', r'.*(]#|返回结果).*')

    if result.find('jiaodiao') == -1:
        UPLOAD_FINAL(IP, USERNAME, PASSWORD, localdir, remotedir)
  • 时间同步:通过执行datehwclock命令,确保远程服务器的时间与当前时间一致。
  • 文件上传UPLOAD_FINAL()方法用于将本地目录下的文件上传到远程服务器,并进行权限设置。
5. 记录部署结果

每次操作结束后,脚本将操作结果回写到Excel表中,标记部署是否成功。

    IP_DATA.iloc[index, 4] = "部署成功"
    IP_DATA.to_excel("交调服务IP配置表全_2022_03_20_部署结果2.xlsx", index=False, encoding="utf-8")

总结

通过这个脚本,我们能够高效地管理多台Linux服务器,实现批量连接、命令执行、文件上传和状态记录等操作。这种自动化的方式极大地减少了运维的工作量,并提升了工作效率。在实际项目中,我们可以根据需求对脚本进行拓展,例如增加多线程支持,进一步优化处理效率。

主要技术栈:
  • paramiko:处理SSH连接。
  • pandas:数据读取和处理。
  • 正则表达式:匹配和提取特定格式数据。

这个脚本可以用于各种场景,例如服务器批量运维、日志收集、应用部署等。在实践中,及时记录部署结果,并保持脚本的可扩展性,是保证项目顺利进行的关键。


http://www.kler.cn/a/292050.html

相关文章:

  • React Native 全栈开发实战班 - 网络与数据之网络请求基础
  • 常见的测试方法
  • 【第三课】Rust变量与数据类型(二)
  • spark 设置hive.exec.max.dynamic.partition不生效
  • npm install命令报错:npm ERR Could not resolve dependency npm ERR peer…
  • 超好用shell脚本NuShell mac安装
  • html+css网页设计 合十文化2个页面
  • c++ 定义函数
  • 为什么要有mybatis?——mybatis
  • Gitlab删除本地标签和分支
  • 使用 RabbitMQ 和 Go 构建异步订单处理系统
  • Apple “Glowtime”活动:iPhone 16、Apple Intelligence亮相
  • SQL进阶技巧:给定数字的频率查询中位数 | 中位值计算问题
  • vscode 20 个实用插件
  • 计算机毕业设计选题推荐-高校实验室教学管理系统-Java/Python项目实战
  • c语言中的动态内存管理
  • 面向可信和节能的雾计算医疗决策支持系统的优化微型机器学习与可解释人工智能
  • uni-app应用更新(Android端)
  • C语言预处理详解
  • 彻底解决 node/npm, Electron下载失败相关问题, 从底层源码详解node electron 加速配置
  • 无需更换摄像头,无需施工改造,降低智能化升级成本的智慧工业开源了。
  • ClickHousez中如何定时清理过期数据库?
  • 生信机器学习入门4 - scikit-learn训练逻辑回归(LR)模型和支持向量机(SVM)模型
  • Qt (13)【Qt窗口 —— 颜色对话框 QColorDialog】
  • spring cloud gateway 之删除请求头
  • 【CNN训练梯度裁剪】