Python脚本读取监控系统外部参数异常问题求助
嘿,作为Python初学者遇到这种参数传递的问题很正常,我来一步步帮你解决!
首先得搞清楚:你的监控系统是把{HOST.NAME}这类参数怎么传给Python脚本的?一般监控系统(比如Zabbix、Nagios)要么用命令行参数,要么用环境变量来传递这些动态值——这两种情况的处理方式不一样,我分别给你讲:
情况1:监控系统通过命令行参数传递变量
如果监控系统调用你的脚本时是类似这样的格式:
python your_alert_script.py "{HOST.NAME}" "{SERVICE.STATUS}"
那你可以用Python的sys模块来获取这些参数,示例代码已经整合了纯文本+HTML邮件的逻辑:
import sys import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText # 从命令行获取参数:sys.argv[0]是脚本本身的名字,后面的才是传入的变量 # 这里假设监控系统传了两个参数:第一个是HOST.NAME,第二个是服务状态 try: host_name = sys.argv[1] service_status = sys.argv[2] except IndexError: # 防止参数没传全的情况,给个默认值 host_name = "未知主机" service_status = "未知状态" # 构建多格式邮件 msg = MIMEMultipart('alternative') msg['Subject'] = f"⚠️ 服务告警:{host_name} 服务异常" msg['From'] = "你的告警邮箱@xxx.com" msg['To'] = "收件人邮箱@xxx.com" # 纯文本版本邮件内容 text_content = f""" 您好, {host_name} 上的服务状态为 {service_status},请及时排查处理! """ # HTML版本邮件内容(可以加样式让告警更醒目) html_content = f""" <html> <body style="font-family: Arial, sans-serif;"> <h3 style="color: #dc3545;">⚠️ 服务告警通知</h3> <p>您好:</p> <p>主机 <strong>{host_name}</strong> 上的服务状态为 <strong style="color: #dc3545;">{service_status}</strong>,请及时排查处理!</p> </body> </html> """ # 把两种格式的内容添加到邮件里 part_plain = MIMEText(text_content, 'plain', 'utf-8') part_html = MIMEText(html_content, 'html', 'utf-8') msg.attach(part_plain) msg.attach(part_html) # 发送邮件(这里用普通SMTP,如果你用企业邮箱可能需要调整端口/加密方式) with smtplib.SMTP('smtp.xxx.com', 587) as smtp_server: smtp_server.starttls() # 启用TLS加密 smtp_server.login("你的告警邮箱@xxx.com", "邮箱授权码") # 注意用授权码不是密码! smtp_server.sendmail(msg['From'], msg['To'], msg.as_string())
小提示:
你可以先手动测试一下:在命令行输入python your_alert_script.py "Ubuntu 1" "DOWN",看看脚本能不能正确打印出host_name和service_status(可以加一行print(host_name, service_status)在代码里)。
情况2:监控系统通过环境变量传递变量
有些监控系统会把{HOST.NAME}这类参数转换成环境变量(比如变成HOST_NAME或者HOST_NAME),这时候用os模块来读取:
import os import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText # 读取环境变量,用get方法可以设置默认值,避免变量不存在时报错 host_name = os.environ.get('HOST_NAME', '未知主机') service_status = os.environ.get('SERVICE_STATUS', '未知状态') # 后面的邮件构建和发送逻辑和上面完全一样,就不重复写了
测试方法:
先在命令行设置环境变量再运行脚本:
export HOST_NAME="Ubuntu 1" export SERVICE_STATUS="DOWN" python your_alert_script.py
看看能不能正确获取到值。
关键排查点
- 先确认监控系统的参数传递方式:查一下监控系统的文档,或者问问运维同事,
{HOST.NAME}是通过命令行还是环境变量传给脚本的? - 先不要急着发邮件,先把参数打印出来确认值是否正确,再整合到邮件内容里。
- 如果参数里有特殊字符(比如空格、中文),确保脚本用的是UTF-8编码(代码里已经加了
utf-8参数,一般没问题)。
内容的提问来源于stack exchange,提问作者Melanchole
相关产品推荐
相关产品推荐

