如何在Monit配置中读取系统环境变量实现多环境适配
Monit读取系统环境变量实现多环境配置方案
首先明确:Monit原生配置不支持直接在配置行内写$XXX格式直接读取系统环境变量,直接把配置里的邮箱写成$ALERT_EMAIL的话,Monit会把它当成普通字符串处理,完全不会替换成实际环境变量值。要实现不同环境自动加载对应告警邮箱、无需逐台修改主配置的需求,可通过以下两种成熟方案实现:
方案1:include指令+动态配置片段(全版本通用,最稳定)
这个方案适配所有Monit版本,不需要依赖特定版本特性,线上环境用的最多:
- 第一步:把主配置文件(一般路径是
/etc/monit/monitrc)里写死的告警邮箱配置删掉,替换成固定的引入指令:... include /etc/monit/conf.d/dynamic_env.conf - 第二步:在机器部署初始化流程、或者Monit的启动前置脚本里,提前根据当前机器的系统环境变量生成上面引入的动态配置文件。比如你把当前环境的告警邮箱存在系统环境变量
MONIT_ALERT_MAIL里,启动前执行下面的逻辑就行:
除了告警邮箱之外,其他需要按环境区分的配置项,比如磁盘告警阈值、服务检查路径、SMTP服务器地址,都可以用同样的方式生成,主配置可以做到全环境完全一致,只需要提前给不同环境的机器设置好对应环境变量即可。# 生成动态配置片段 cat > /etc/monit/conf.d/dynamic_env.conf <<EOF alert $MONIT_ALERT_MAIL only on { timeout } EOF # 校验配置合法性后重载Monit monit -t && monit reload
方案2:高版本内置变量引用(适合Monit 5.28.0及以上版本)
Monit从5.28.0版本开始支持启动时加载自定义变量,配置里可以通过@{变量名}的格式引用,配合环境变量透传可以直接在配置里取值:
- 第一步:修改主配置里的告警行,改成变量引用格式:
... alert @{ENV_MONIT_ALERT_MAIL} only on { timeout } - 第二步:启动Monit前,把系统环境变量转换成Monit可识别的变量格式透传进去:
# 把系统环境变量导出为Monit可识别的变量,前缀和配置里的ENV_对应 export ENV_MONIT_ALERT_MAIL=$MONIT_ALERT_MAIL monit
踩坑提示:如果是用systemd这类系统服务管理器启动Monit,服务进程默认拿不到你登录shell设置的环境变量,需要在service配置文件里通过
Environment="ENV_MONIT_ALERT_MAIL=xxx"的方式把变量透传给Monit进程,不然会出现变量为空的问题。
内容的提问来源于stack exchange,提问作者Salman Virk
相关产品推荐
相关产品推荐

