Python在CentOS中的自动化运维实现指南
在CentOS上实现Python自动化运维前,需先搭建稳定的Python运行环境:
sudo yum install -y python3 python3-pip
venv模块创建隔离的Python环境,避免项目依赖冲突。python3 -m venv myenv # 创建虚拟环境
source myenv/bin/activate # 激活环境(CentOS中需使用bash/sh)
paramiko(SSH远程连接)、psutil(系统监控)、fabric(自动化部署)、ansible(配置管理)等。pip install paramiko psutil fabric ansible
使用paramiko库实现远程服务器的SSH连接,执行系统命令(如查看磁盘空间、重启服务)。
import paramiko
def remote_execute(hostname, username, password, command):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 自动信任主机密钥
ssh.connect(hostname=hostname, port=22, username=username, password=password)
stdin, stdout, stderr = ssh.exec_command(command)
output = stdout.read().decode().strip()
error = stderr.read().decode().strip()
ssh.close()
return output, error
# 示例:查看远程服务器磁盘使用率
output, error = remote_execute("192.168.1.100", "root", "your_password", "df -h")
print("Output:", output)
if error:
print("Error:", error)
通过psutil库获取系统资源(CPU、内存、磁盘)使用率,当超过阈值时发送邮件告警。
import psutil
import smtplib
from email.mime.text import MIMEText
def send_alert(subject, message):
"""发送邮件告警"""
sender = "your_email@example.com"
receiver = "admin@example.com"
smtp_server = "smtp.example.com"
msg = MIMEText(message)
msg["Subject"] = subject
msg["From"] = sender
msg["To"] = receiver
with smtplib.SMTP(smtp_server, 587) as server:
server.starttls() # 启用TLS加密
server.login(sender, "your_email_password")
server.sendmail(sender, [receiver], msg.as_string())
def monitor_system():
"""监控系统资源"""
cpu_usage = psutil.cpu_percent(interval=1) # CPU使用率
mem_usage = psutil.virtual_memory().percent # 内存使用率
disk_usage = psutil.disk_usage("/").percent # 根分区磁盘使用率
if cpu_usage > 80 or mem_usage > 80 or disk_usage > 90:
alert_msg = f"""
【系统告警】资源使用率超标!
CPU使用率: {cpu_usage}%
内存使用率: {mem_usage}%
磁盘使用率: {disk_usage}%
"""
send_alert("CentOS系统资源告警", alert_msg)
# 每分钟执行一次监控(需配合定时任务)
if __name__ == "__main__":
monitor_system()
使用fabric库实现代码拉取、依赖安装、服务重启等部署流程,适用于Web应用(如Django、Flask)。
from fabric import Connection
def deploy_app():
"""自动化部署应用"""
conn = Connection(
host="192.168.1.100",
user="deploy_user",
connect_kwargs={"password": "your_password"}
)
try:
# 进入项目目录
with conn.cd("/var/www/myapp"):
# 拉取最新代码
conn.run("git pull origin main")
# 安装依赖
conn.run("pip install -r requirements.txt")
# 重启服务
conn.run("systemctl restart gunicorn")
conn.run("systemctl restart nginx")
print("部署成功!")
except Exception as e:
print(f"部署失败: {e}")
finally:
conn.close()
# 手动触发部署或配合定时任务
if __name__ == "__main__":
deploy_app()
通过crontab设置周期性任务,让Python脚本定期执行(如每分钟监控一次系统状态)。
# 编辑当前用户的crontab文件
crontab -e
添加以下内容(每分钟执行一次监控脚本):
* * * * * /usr/bin/python3 /path/to/monitor.py >> /var/log/monitor.log 2>&1
注:
>> /var/log/monitor.log 2>&1将脚本输出追加到日志文件,便于排查问题。
使用ansible(通过Python API调用)实现批量服务器配置管理(如安装Nginx、配置防火墙)。
import ansible_runner
def configure_servers():
"""使用Ansible配置服务器"""
runner = ansible_runner.run(
private_data_dir=".", # 当前目录
playbook="install_nginx.yml", # Playbook文件路径
inventory="hosts.ini" # 服务器清单文件
)
if runner.status == "successful":
print("配置成功!")
else:
print(f"配置失败: {runner.status}")
# 示例Playbook文件(install_nginx.yml)
"""
- name: Install Nginx on CentOS
hosts: webservers
become: yes # 使用root权限
tasks:
- name: Install EPEL仓库
yum:
name: epel-release
state: present
- name: Install Nginx
yum:
name: nginx
state: present
- name: Start Nginx service
service:
name: nginx
state: started
enabled: yes
"""
# 执行配置
if __name__ == "__main__":
configure_servers()
注:
hosts.ini文件需包含目标服务器IP,例如:[webservers] 192.168.1.100 192.168.1.101
打包为系统服务:使用systemd将Python脚本托管为系统服务,实现开机自启、状态管理。
# 创建服务文件
sudo nano /etc/systemd/system/monitor.service
添加以下内容:
[Unit]
Description=Python System Monitor
After=network.target
[Service]
User=root
WorkingDirectory=/path/to/script
ExecStart=/usr/bin/python3 /path/to/monitor.py
Restart=always # 失败时自动重启
[Install]
WantedBy=multi-user.target
启用并启动服务:
sudo systemctl enable monitor.service
sudo systemctl start monitor.service
日志管理:使用logging模块替代print语句,将日志分级存储(如INFO、ERROR),便于后续分析。
import logging
# 配置日志
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s",
handlers=[
logging.FileHandler("/var/log/monitor.log"),
logging.StreamHandler() # 输出到终端
]
)
# 使用日志
logging.info("系统监控启动")
logging.error("无法连接到服务器!")
可视化监控:结合Prometheus(指标收集)和Grafana(可视化)实现系统资源的实时监控面板,提升运维效率。
通过以上步骤,可在CentOS上构建基于Python的自动化运维体系,覆盖从远程管理到配置部署的全流程,显著降低人工操作成本,提升系统稳定性。