Python自动化运维:一键掌控服务器的高效之道
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门!
解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界
在互联网和云计算高速发展的今天,服务器数量的指数增长使得手动运维和管理变得异常繁琐。Python凭借其强大的可读性和丰富的生态系统,成为实现自动化运维的理想语言。本文以“Python自动化运维:编写自动化脚本进行服务器管理”为主题,深入探讨了如何利用Python在批量处理、定时任务和日志清理等方面解放运维人员的双手。文章从SSH连接、批量部署脚本到日志归档、自动化报警等多个角度进行了详细阐述与代码示例,并分享了常见的最佳实践和性能优化思路。通过阅读本文,读者可以快速掌握Python自动化运维的核心技能,进一步提升运维效率与系统稳定性。
引言
在服务器数量较少的时候,运维人员往往可以手动登录每台服务器,执行更新、重启、日志查看等操作。然而,随着业务的快速扩张以及云计算、容器化技术的普及,服务器规模迅速增大,手动操作带来的效率问题、出错风险、可重复性低等缺点变得非常突出。为了满足大规模集群管理的需求,自动化运维成为越来越多企业的必然选择。
Python在自动化运维领域优势明显:
- 语法简洁:低门槛、易上手,有利于快速编写脚本。
- 生态完善:拥有丰富的第三方库,如Paramiko、Fabric、psutil等,为远程连接、资源监控、批量操作提供便利。
- 可扩展性强:可以与其他编程语言或系统工具结合,构建灵活的运维平台。
在本篇文章中,我们将围绕“Python自动化运维:编写自动化脚本进行服务器管理”这一主题,系统介绍如何借助Python进行批量操作、定时任务和日志清理等自动化运维任务。文章不仅会给出大量的示例代码,还会对每段代码进行详尽的中文注释和解释,以帮助读者更好地掌握Python自动化运维的相关技术,并在实际生产环境中得以落地实施。
提示:如果您对并发编程、网络协议或系统管理有一定的了解,将更有助于理解本篇内容;但即使是初学者,也能通过示例代码和详细解说,逐步掌握自动化运维脚本的编写方法。
一、Python在运维自动化中的角色
在企业日常运维工作中,常见的自动化需求包括:
- 批量操作:例如同时对多台服务器安装软件、更新配置文件或执行重启操作。
- 定时任务:使用脚本替代手动排查和处理,如定期清理日志、备份数据等。
- 监控和报警:获取CPU、内存等资源使用情况,或者收集异常日志后发送报警通知。
- 日志管理:定期清理过期日志并将重要日志进行归档或备份。
- 自动化部署:在持续集成和持续交付(CI/CD)流程中,实现一键部署和回滚。
Python可以通过第三方库或原生功能,轻松完成以上任务,并且可扩展为一整套自动化运维平台。例如,通过Paramiko或Fabric库实现SSH远程操作,通过crontab或schedule库实现定时任务,通过logging模块实现日志的管理与归档,配合psutil库监控系统资源等。
二、批量处理:提升大规模服务器管理效率
2.1 Paramiko与Fabric:SSH自动化利器
2.1.1 Paramiko简介
Paramiko是一个纯Python实现的SSHv2协议库,支持加密与验证,可以用来远程执行命令、文件上传下载等。使用Paramiko时,典型的流程如下:
- 创建
SSHClient对象 - 设置自定义的服务器主机密钥策略
- 调用
connect方法连接到目标服务器 - 使用
exec_command执行远程命令 - 通过标准输入/输出通道获取执行结果
- 关闭连接
以下是一个使用Paramiko连接到远程服务器并执行命令的示例脚本:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-import paramikodef execute_remote_command(host, port, username, password, command):"""在远程服务器上执行命令并返回输出结果:param host: 服务器IP或域名:param port: SSH端口,一般为22:param username: 登录用户名:param password: 登录密码:param command: 要执行的命令:return: 执行结果字符串"""# 创建SSHClient对象ssh_client = paramiko.SSHClient()# 自动添加目标服务器的主机密钥(不安全,仅供测试使用)ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 连接服务器ssh_client.connect(hostname=host, port=port, username=username, password=password)# 执行命令stdin, stdout, stderr = ssh_client.exec_command(command)# 获取执行结果result_out = stdout.read().decode('utf-8')result_err = stderr.read().decode('utf-8')# 关闭连接ssh_client.close()if result_err:return f"Error: {result_err}"else:return result_outif __name__ == "__main__":# 测试连接host = "192.168.0.100"port = 22username = "root"password = "123456"command = "uname -a" # 查看操作系统信息output = execute_remote_command(host, port, username, password, command)print("远程执行结果:\n", output)
代码解释
- Paramiko库的使用:先创建
SSHClient对象,然后使用set_missing_host_key_policy设置为自动添加服务器指纹。 - 连接服务器:通过
connect方法传入服务器IP、端口、用户名和密码。 - 命令执行:使用
exec_command,可获取标准输入、标准输出和标准错误。 - 结果处理:将输出和错误消息分别读取并转换为UTF-8字符串。
- 连接关闭:操作完成后调用
close,释放连接资源。
2.1.2 Fabric简介
Fabric基于Paramiko开发,简化了多服务器批量操作的流程,尤其适用于自动化部署和批量命令执行。它提供了更高层次的API,例如fab命令行工具,可以在fabfile.py中定义一系列任务,然后在命令行中通过fab 任务名执行。下面展示一个简单的Fabric示例,用于批量获取服务器的操作系统信息。
先安装Fabric:
pip install fabric==2.6.0
注意:Fabric 2.x和1.x版本API差异较大,示例基于2.x版本。
在项目目录下创建fabfile.py,示例如下:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-from fabric import Connection# 定义服务器列表
servers = [{"host": "192.168.0.101", "user": "root", "connect_kwargs": {"password": "123456"}},{"host": "192.168.0.102", "user": "root", "connect_kwargs": {"password": "123456"}},
]def get_os_info():"""获取服务器操作系统信息"""for srv in servers:# 创建连接conn = Connection(**srv)print(f"连接到服务器: {srv['host']}")result = conn.run("uname -a", hide=True)print(f"操作系统信息: {result.stdout.strip()}")conn.close()
然后在命令行中执行:
fab get_os_info
代码解释
- 服务器列表:定义一个Python列表,存储多台服务器的连接信息,包括主机名、用户及密码。
Connection对象:Fabric提供了Connection对象,用于建立SSH会话。- 批量执行:循环服务器列表,每次创建
Connection,执行命令并打印结果。 - 关闭连接:完成操作后调用
close,避免资源泄漏。
无论是Paramiko还是Fabric,都能极大地方便批量处理任务。后文中,我们还会进一步结合定时任务与日志管理进行综合示例。
2.2 并发批量处理
在大规模集群环境下,依次连接每台服务器的方式效率不高。为提高批量处理速度,可以使用并发或多线程方式,同时连接多台服务器并执行操作。
以下示例基于paramiko和Python的ThreadPoolExecutor实现多线程并发批量管理:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-import paramiko
import concurrent.futuresdef execute_command(host, username, password, command):"""在单台服务器上执行命令"""ssh_client = paramiko.SSHClient()ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())ssh_client.connect(hostname=host, port=22, username=username, password=password)stdin, stdout, stderr = ssh_client.exec_command(command)result_out = stdout.read().decode('utf-8')result_err = stderr.read().decode('utf-8'相关文章:
Python自动化运维:一键掌控服务器的高效之道
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在互联网和云计算高速发展的今天,服务器数量的指数增长使得手动运维和管理变得异常繁琐。Python凭借其强大的可读性和丰富的生态系统,成为…...
数论问题61一一各种进位制
10进位制是普遍使用的数进位制,二进位制是计算机采用的进位制。还有三进位制,四进位制,…等等。那一种进位制都能转化为10进位制。下面介绍这种方法。 ①10进位制的表示(口诀:逢10进1) 如8X10007X1005x1038753。 ②2进位制的表示(口诀:逢2…...
Java开发提速秘籍:巧用Apache Commons Lang工具库
一、Java 开发效率之困 在当今数字化时代,Java 作为一门广泛应用的编程语言,在各类软件开发项目中占据着举足轻重的地位。无论是大型企业级应用、互联网平台,还是移动应用后端,都能看到 Java 的身影。然而,Java 开发者…...
使用sql查询excel内容
1. 简介 我们在前面的文章中提到了calcite支持csv和json文件的数据源适配, 其实就是将文件解析成表然后以文件夹为schema, 然后将生成的schema注册到RootSehema(RootSchema是所有数据源schema的parent,多个不同数据源schema可以挂在同一个RootSchema下)下, 最终使用…...
[Python学习日记-78] 基于 TCP 的 socket 开发项目 —— 模拟 SSH 远程执行命令
[Python学习日记-78] 基于 TCP 的 socket 开发项目 —— 模拟 SSH 远程执行命令 简介 项目分析 如何执行系统命令并拿到结果 代码实现 简介 在Python学习日记-77中我们介绍了 socket 基于 TCP 和基于 UDP 的套接字,还实现了服务器端和客户端的通信,本…...
电子应用设计方案101:智能家庭AI喝水杯系统设计
智能家庭 AI 喝水杯系统设计 一、引言 智能家庭 AI 喝水杯系统旨在为用户提供个性化的饮水提醒和健康管理服务,帮助用户养成良好的饮水习惯。 二、系统概述 1. 系统目标 - 精确监测饮水量和饮水频率。 - 根据用户的身体状况和活动量,智能制定饮水计划。…...
vue学习路线
以下是一个详细的Vue学习路线: 一、基础入门 (一)环境搭建 1. 安装Node.js和npm:Vue项目依赖于Node.js环境,需从官网下载并安装最新版本的Node.js,npm会随Node.js一起安装。 2. 安装Vue CLI:V…...
(15)Chainlink Automation(定时任务) 详细介绍及用法
Chainlink Automation 详细介绍 1. 什么是 Chainlink Automation? Chainlink Automation 是 Chainlink 提供的一个去中心化服务,专门用于自动化执行智能合约的链上操作。它允许开发者基于时间或特定条件(如链上或链下事件)触发智…...
从入门到精通:RabbitMQ的深度探索与实战应用
目录 一、RabbitMQ 初相识 二、基础概念速览 (一)消息队列是什么 (二)RabbitMQ 核心组件 三、RabbitMQ 基本使用 (一)安装与环境搭建 (二)简单示例 (三)…...
基于微信小程序高校订餐系统的设计与开发ssm+论文源码调试讲解
第4章 系统设计 一个成功设计的系统在内容上必定是丰富的,在系统外观或系统功能上必定是对用户友好的。所以为了提升系统的价值,吸引更多的访问者访问系统,以及让来访用户可以花费更多时间停留在系统上,则表明该系统设计得比较专…...
【vitePress】基于github快速添加评论功能(giscus)
一.添加评论插件 使用giscus来做vitepress 的评论模块,使用也非常的简单,具体可以参考:giscus 文档,首先安装giscus npm i giscus/vue 二.giscus操作 打开giscus 文档,如下图所示,填入你的 github 用户…...
PID 控制算法(二):C 语言实现与应用
在本文中,我们将用 C 语言实现一个简单的 PID 控制器,并通过一个示例来演示如何使用 PID 控制算法来调整系统的状态(如温度、速度等)。同时,我们也会解释每个控制参数如何影响系统的表现。 什么是 PID 控制器…...
Git本地搭建
Git本地搭建 (项目突然不给创建仓库了,为了方便管理项目只能自己本地搭建git服务) 为了在本地搭建Git环境并实现基本的Git操作,步骤如下: 安装Git软件 Windows:从Git官方网站下载并安装适用于Windows…...
ORB-SLAM2源码学习:Initializer.cc⑧: Initializer::CheckRT检验三角化结果
前言 ORB-SLAM2源码学习:Initializer.cc⑦: Initializer::Triangulate特征点对的三角化_cv::svd::compute-CSDN博客 经过上面的三角化我们成功得到了三维点,但是经过三角化成功的三维点并不一定是有效的,需要筛选才能作为初始化地图点。 …...
leetcode 2239. 找到最接近 0 的数字
题目:2239. 找到最接近 0 的数字 - 力扣(LeetCode) 加班用手机刷水题,补个记录 1 class Solution { public:int findClosestNumber(vector<int>& nums) {int ret nums[0];for (int i 1; i < nums.size(); i) {if…...
Rust实现内网穿透工具:从原理到实现
目录 1.前言2.内网穿透原理3.丐版实现3.1 share3.2 server3.3 client3.4 测试4.项目优化4.1 工作空间4.2 代码合并4.3 无锁优化4.4 数据分离4.5 错误处理4.6 测试代码4.7 参数解析本篇原文为:Rust实现内网穿透工具:从原理到实现 更多C++进阶、rust、python、逆向等等教程,可…...
【深度学习】1.深度学习解决问题与应用领域
深度学习要解决的问题 一、图像识别相关问题 物体识别 背景和意义:在众多的图像中识别出特定的物体,例如在安防监控领域,识别出画面中的人物、车辆等物体类别。在自动驾驶技术中,车辆需要识别出道路上的行人、交通标志、其他车辆…...
文档解析:PDF里的复杂表格、少线表格如何还原?
PDF中的复杂表格或少线表格还原通常需要借助专业的工具或在线服务,以下是一些可行的方法: 方法一:使用在线PDF转换工具 方法二:使用桌面PDF编辑软件 方法三:通过OCR技术提取表格 方法四:手动重建表格 …...
深圳大学-计算机系统(3)-实验三取指和指令译码设计
实验目标 设计完成一个连续取指令并进行指令译码的电路,从而掌握设计简单数据通路的基本方法。 实验内容 本实验分成三周(三次)完成:1)首先完成一个译码器(30分);2)接…...
Java Swing 编程全面解析:从 AWT 到 Swing 的进化之路
目录 前言 一、AWT 简介 1. 什么是 AWT? 2. AWT 的基本组件 3. AWT 编程示例 二、Swing 的诞生与进化 1. Swing 的特点 2. Swing 和 AWT 的主要区别 3. Swing 的基本组件 三、Swing 编程的基础示例 四、Swing 的高级功能 1. 布局管理器 2. 事件监听 3…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...
虚幻基础:角色旋转
能帮到你的话,就给个赞吧 😘 文章目录 移动组件使用控制器所需旋转:组件 使用 控制器旋转将旋转朝向运动:组件 使用 移动方向旋转 控制器旋转和移动旋转 缺点移动旋转:必须移动才能旋转,不移动不旋转控制器…...
