利用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)
- 时间同步:通过执行
date
和hwclock
命令,确保远程服务器的时间与当前时间一致。 - 文件上传:
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
:数据读取和处理。- 正则表达式:匹配和提取特定格式数据。
这个脚本可以用于各种场景,例如服务器批量运维、日志收集、应用部署等。在实践中,及时记录部署结果,并保持脚本的可扩展性,是保证项目顺利进行的关键。