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

python自动化运维 通过paramiko库和time库实现服务器自动化管理

目录

一.前言 

二. 代码实现以及解析 

2.1导入必要的库 

2.2定义服务器信息 

2.3创建 SSH 客户端连接函数 

2.4执行远程命令函数 

2.5获取系统信息函数 

2.6重启服务函数

2.7 主函数

三.致谢


一.前言 

在数字化时代,IT 基础设施的规模和复杂性不断增长,传统的手动管理方法已不再适用。自动化运维,作为 IT 运维管理的新范式,正变得越来越重要。它不仅能够显著提升运维效率,降低人为错误,还能确保业务连续性和系统的高可用性。

Python,以其简洁的语法和强大的功能,成为自动化运维的优选语言。借助 Python,我们可以快速开发出灵活且强大的自动化脚本,以应对各种运维场景。

在本文中,我们将探讨如何使用 Python 的 paramiko 库来实现 SSH 连接和远程命令执行,以及如何利用 time 库来处理时间相关操作,从而实现服务器的自动化管理。这些库的结合使用将使我们能够编写出功能丰富、健壮且易于维护的自动化脚本。


 


二. 代码实现以及解析 

import paramiko
import time# 定义服务器信息
hostname = 'your_server_hostname_or_ip'
port = 22
username = 'your_username'
password = 'your_password'# 创建 SSH 客户端连接
def connect_to_server():ssh_client = paramiko.SSHClient()ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())try:ssh_client.connect(hostname, port, username, password)print(f"Connected to {hostname} successfully.")return ssh_clientexcept Exception as e:print(f"Error connecting to {hostname}: {str(e)}")return None# 执行远程命令
def run_command(ssh_client, command):stdin, stdout, stderr = ssh_client.exec_command(command)output = stdout.read().decode('utf-8')error = stderr.read().decode('utf-8')if error:print(f"Error executing command '{command}': {error.strip()}")else:print(f"Command '{command}' executed successfully. Output:\n{output.strip()}")# 获取系统信息示例
def get_system_info(ssh_client):run_command(ssh_client, 'uname -a')run_command(ssh_client, 'df -h')run_command(ssh_client, 'free -m')# 重启服务示例
def restart_service(ssh_client, service_name):run_command(ssh_client, f'sudo systemctl restart {service_name}')time.sleep(5)  # 等待一段时间以确保服务重启完成run_command(ssh_client, f'sudo systemctl status {service_name}')# 主函数
def main():ssh_client = connect_to_server()if ssh_client:get_system_info(ssh_client)restart_service(ssh_client, 'apache2')  # 以 Apache2 为例,可以根据需要替换成你的服务名ssh_client.close()print("Script execution completed.")else:print("Exiting script due to connection error.")if __name__ == "__main__":main()

2.1导入必要的库 
 
import paramiko
import time
  • paramiko 是一个用于 SSH2 协议的 Python 库,用于远程操作服务器。
  • time 是 Python 标准库,用于在执行操作之间添加延迟,如等待服务重启完成。

 


2.2定义服务器信息 
 
hostname = 'your_server_hostname_or_ip'
port = 22
username = 'your_username'
password = 'your_password'
  • 这些变量包括远程服务器的主机名(或IP地址)、SSH端口号、登录用户名和密码。实际应用中,密码应该通过安全的方式进行管理,如使用环境变量或密钥认证。
     
2.3创建 SSH 客户端连接函数 

 
def connect_to_server():ssh_client = paramiko.SSHClient()ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())try:ssh_client.connect(hostname, port, username, password)print(f"Connected to {hostname} successfully.")return ssh_clientexcept Exception as e:print(f"Error connecting to {hostname}: {str(e)}")return None
  • connect_to_server() 函数通过 paramiko.SSHClient() 创建一个 SSH 客户端对象。
  • set_missing_host_key_policy(paramiko.AutoAddPolicy()) 设置自动添加新主机密钥的策略,适用于首次连接服务器时。
  • ssh_client.connect() 方法尝试连接远程服务器,并打印连接成功或失败的信息。

 

2.4执行远程命令函数 

 
def run_command(ssh_client, command):stdin, stdout, stderr = ssh_client.exec_command(command)output = stdout.read().decode('utf-8')error = stderr.read().decode('utf-8')if error:print(f"Error executing command '{command}': {error.strip()}")else:print(f"Command '{command}' executed successfully. Output:\n{output.strip()}")
  • run_command() 函数接收一个 SSH 客户端对象 ssh_client 和要执行的命令 command
  • 使用 exec_command() 方法在远程服务器上执行命令,并获取标准输入、输出和错误流。
  • 输出结果进行解码(通常为UTF-8),并根据执行情况打印成功或失败的信息。

 

2.5获取系统信息函数 
def get_system_info(ssh_client):run_command(ssh_client, 'uname -a')run_command(ssh_client, 'df -h')run_command(ssh_client, 'free -m')
  • get_system_info() 函数调用 run_command() 函数来获取系统信息:
    • uname -a:获取操作系统的详细信息。
    • df -h:获取磁盘空间使用情况。
    • free -m:获取内存使用情况。
2.6重启服务函数
def restart_service(ssh_client, service_name):run_command(ssh_client, f'sudo systemctl restart {service_name}')time.sleep(5)  # 等待一段时间以确保服务重启完成run_command(ssh_client, f'sudo systemctl status {service_name}')

 

  • restart_service() 函数接收一个服务名 service_name,使用 sudo systemctl 命令重启指定的服务,并检查服务状态以确认是否重启成功。
     
2.7 主函数
 
def main():ssh_client = connect_to_server()if ssh_client:get_system_info(ssh_client)restart_service(ssh_client, 'apache2')  # 以 Apache2 为例,可以根据需要替换成你的服务名ssh_client.close()print("Script execution completed.")else:print("Exiting script due to connection error.")if __name__ == "__main__":main()
  • main() 函数是脚本的入口点。
  • 在 main() 函数中,首先调用 connect_to_server() 连接到远程服务器。
  • 如果连接成功,则依次调用 get_system_info() 和 restart_service() 函数来执行任务。
  • 最后关闭 SSH 连接并打印执行完成的信息;如果连接失败,则打印连接错误信息并退出脚本。



     

三.致谢
 

非常感谢您阅读我的博客!如果您有任何问题、建议或想了解特定主题,请随时告诉我。您的反馈对我非常重要,我将继续努力提供高质量的内容。

如果您喜欢我的博客,请考虑订阅我们的更新,这样您就不会错过任何新的文章和信息。同时,欢迎您分享我们的博客给更多的朋友和同事,让更多人受益。

再次感谢您的支持和关注!如果您有任何想法或需求,请随时与我们联系。祝您生活愉快,学习进步!

相关文章:

python自动化运维 通过paramiko库和time库实现服务器自动化管理

目录 一.前言 二. 代码实现以及解析 2.1导入必要的库 2.2定义服务器信息 2.3创建 SSH 客户端连接函数 2.4执行远程命令函数 2.5获取系统信息函数 2.6重启服务函数 2.7 主函数 三.致谢 一.前言 在数字化时代,IT 基础设施的规模和复杂性不断增长&am…...

HTML常用的转义字符——怎么在网页中写“<div></div>”?

一、问题描述 如果需要在网页中写“<div></div>”怎么办呢&#xff1f; 使用转义字符 如果直接写“<div></div>”&#xff0c;编译器会把它翻译为块&#xff0c;类似的&#xff0c;其他的标签也是如此&#xff0c;所以如果要在网页中写类似于“<div…...

shell-awk文本处理工具

1、awk概述 AWK 是一种处理文本文件的语言&#xff0c;是一个强大的文本分析工具。 它是专门为文本处理设计的编程语言&#xff0c;也是行处理软件&#xff0c;通常用于扫描、过滤、统计汇总工作 数据可以来自标准输入也可以是管道或文件 在 linux 上常用的是 gawk,awk …...

如何在测试中保护用户隐私!

在当今数据驱动的时代&#xff0c;用户隐私保护成为了企业和开发团队关注的焦点。在软件测试过程中&#xff0c;处理真实用户数据时保护隐私尤为重要。本文将介绍如何在测试中保护用户隐私&#xff0c;并提供具体的方案和实战演练。 用户隐私保护的重要性 用户隐私保护不仅是法…...

ARCGIS PRO DSK GraphicsLayer创建文本要素

一、判断GraphicsLayer层【地块注记】是否存在&#xff0c;如果不存在则新建、如果存在则删除所有要素 Dim GraphicsLayer pmap.GetLayersAsFlattenedList().OfType(Of ArcGIS.Desktop.Mapping.GraphicsLayer).FirstOrDefault() 获取当前map对象中的GetLayer图层 Await Queue…...

看板项目之vue代码分析

目录&#xff1a; Q1、vue项目怎么实现的输入localhost&#xff1a;8080就能自动跳到index页面Q2、组合饼状图如何实现Q3、vue项目如何实现环境的切换Q4、vue怎么实现vue里面去调用js文件里面的函数 Q1、vue项目怎么实现的输入localhost&#xff1a;8080就能自动跳到index页面 …...

lua 游戏架构 之 游戏 AI (七)ai_dead

定义一个名为ai_dead的类&#xff0c;继承自ai_base类。这个类用于处理游戏中AI在死亡状态下的行为逻辑。以下是对代码的具体解释&#xff1a; 1. **引入基类**&#xff1a; - 使用require函数引入ai_base类&#xff0c;作为基础类。 2. **定义ai_dead类**&#xff1a; …...

前端开发知识(一)-html

1.前端开发需掌握的内容&#xff1a; 2.前端开发的三剑客&#xff1a;html、css、javascript Vue可以简化JavaScpript流程。 Element&#xff08;饿了么开发的&#xff09; &#xff1a;前端组件库。 Ngix&#xff1a;前端服务器。 3.前端开发工具&#xff1a;vscode 1)按…...

身份证如何查验真伪?C#身份证二要素、三要素接口集成

身份证不仅是我们的身份证明&#xff0c;更是社会生活中的“通行证”&#xff0c;现在人们的衣食住行都离不开身份证。但对于提供服务的平台而言&#xff0c;如何对用户提供的身份信息进行真伪核验便成为了一大难题。别担心&#xff0c;今天小编为服务平台带来了身份证二要素、…...

C++ | Leetcode C++题解之第290题单词规律

题目&#xff1a; 题解&#xff1a; class Solution { public:bool wordPattern(string pattern, string str) {unordered_map<string, char> str2ch;unordered_map<char, string> ch2str;int m str.length();int i 0;for (auto ch : pattern) {if (i > m) {…...

Pytorch使用教学7-张量的广播

PyTorch中的张量具有和NumPy相同的广播特性&#xff0c;允许不同形状的张量之间进行计算。 广播的实质特性&#xff0c;其实是低维向量映射到高维之后&#xff0c;相同位置再进行相加。我们重点要学会的就是低维向量如何向高维向量进行映射。 相同形状的张量计算 虽然我们觉…...

生成式AI:对话系统(Chat)与自主代理(Agent)的和谐共舞

生成式AI&#xff1a;对话与行动的和谐共舞 我们正站在一个令人激动的时代门槛上——生成式AI技术飞速发展&#xff0c;带来了无限的可能性。一个关键问题浮现&#xff1a;AI的未来是对话系统&#xff08;Chat&#xff09;的天下&#xff0c;还是自主代理&#xff08;Agent&am…...

唯众物联网(IOT)全功能综合实训教学解决方案

一、引言 在信息技术日新月异的今天&#xff0c;物联网&#xff08;IoT&#xff09;作为推动数字化转型的关键力量&#xff0c;其触角已延伸至我们生活的方方面面&#xff0c;深刻地重塑了工作模式、生活习惯乃至社会结构的每一个角落。面对这一前所未有的变革浪潮&#xff0c…...

24证券从业考试报名『个人信息表』填写模板❗

24证券从业考试报名『个人信息表』填写模板❗ 1️⃣居住城市、通讯地址&#xff1a;写自己现居住的地址就可以。 2️⃣学历&#xff1a;需要注意的是学历填写的是考生已经取得的学历&#xff0c;在校大学生已经不具有报名资格&#xff0c;选择大专以上&#xff0c;或者是高中学…...

深度学习系列70:模型部署torchserve

1. 流程说明 ts文件夹下&#xff0c; 从launcher.py进入&#xff0c;执行jar文件。 入口为model_server.py的start()函数。内容包含&#xff1a; 读取args&#xff0c;创建pid文件 找到java&#xff0c;启动model-server.jar程序&#xff0c;同时读取log-config文件&#xff…...

算法日记day 20(中序后序遍历序列构造二叉树|最大、合并、搜索二叉树)

一、中序后序序列构造二叉树 题目&#xff1a; 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,…...

【科研】# Taylor Francis 论文 LaTeX template模版 及 Word模版

【科研写论文】系列 文章目录 【科研写论文】系列前言一、Word 模板&#xff08;附下载网址&#xff09;&#xff1a;二、LaTeX 版本方法1&#xff1a;直接网页端打开&#xff08;附网址&#xff09;方法2&#xff1a;直接下载到本地电脑上编辑下载地址说明及注意事项 前言 给…...

Linux网络配置及常见命令!

vim /etc/sysconfig/network-scripsts/ifcfg-ens33&#xff08;图形界面配置网络&#xff09; Xshell rz:上传&#xff08;从Windows到Linux&#xff09; sz&#xff1a;下载&#xff1a;&#xff08;从Linux到Windows&#xff09;&#xff08;后接文件手工输入&#xff09;…...

linux之shell脚本实战

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…...

文件上传漏洞(ctfshow web151-161)

Web151 F12修改源代码 exts后面png改为php 这样就可以上传php的文件了 Web152&#xff1a; 考点&#xff1a;后端不能单一校验 就是要传图片格式&#xff0c;抓个包传个png的图片 然后bp抓包修改php后缀解析 然后放包 Web153-web156 在php代码中可以使用“{}”代替“[]” …...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

MySQL体系架构解析(三):MySQL目录与启动配置全解析

MySQL中的目录和文件 bin目录 在 MySQL 的安装目录下有一个特别重要的 bin 目录&#xff0c;这个目录下存放着许多可执行文件。与其他系统的可执行文件类似&#xff0c;这些可执行文件都是与服务器和客户端程序相关的。 启动MySQL服务器程序 在 UNIX 系统中&#xff0c;用…...

Linux基础开发工具——vim工具

文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...

leetcode_69.x的平方根

题目如下 &#xff1a; 看到题 &#xff0c;我们最原始的想法就是暴力解决: for(long long i 0;i<INT_MAX;i){if(i*ix){return i;}else if((i*i>x)&&((i-1)*(i-1)<x)){return i-1;}}我们直接开始遍历&#xff0c;我们是整数的平方根&#xff0c;所以我们分两…...