温馨提示×

Jenkins与Linux如何实现远程监控

小樊
37
2025-12-31 20:57:51
栏目: 智能运维

Jenkins 远程监控 Linux 的完整落地方案

一、方案总览与架构

  • 目标:对 Linux 主机其上运行的服务/进程进行健康检查、指标采集、自动告警与自愈,并以 Jenkins 作为编排与调度中心。
  • 架构要点:
    • 使用 SSH 连接 Linux(推荐密钥认证),在 FreestylePipeline 中执行远程检查脚本。
    • 通过 Linux 定时任务(cron) 在目标机上做高频自检与自愈,Jenkins 负责低频巡检、汇总与通知。
    • 使用 Jenkins API 获取节点/任务状态,结合 钉钉机器人 推送告警;必要时在远程节点通过 Jenkins Script Console/Groovy 执行诊断命令。

二、快速落地步骤

  • 步骤 1:建立安全连接
    • 在 Jenkins 安装 SSH AgentPublish Over SSH 插件;在 Manage Jenkins → Manage Credentials 添加 SSH Username with private key 凭据(建议使用 Jenkins 运行账号生成密钥,避免权限问题)。
    • 目标 Linux 将公钥写入对应用户的 ~/.ssh/authorized_keys,权限设为 700/600;在 Jenkins 中测试连通性。
  • 步骤 2:在 Linux 侧部署监控脚本与自愈逻辑
    • 监控脚本示例(检查端口进程并重启,写入日志):
      • check_and_restart.sh
        #!/usr/bin/env bash
        set -euo pipefail
        PORT=$1; PROJECT=$2; JOB=$3; MOD=$4
        LOG=~/log/${PROJECT}.log
        mkdir -p ~/log
        
        PID=$(/usr/sbin/lsof -iTCP:"$PORT" -sTCP:LISTEN -P -n 2>/dev/null | awk 'NR>1 {print $2; exit}')
        if [[ -z "$PID" ]]; then
          echo "$(date '+%F %T') 服务 DOWN,尝试重启 $PROJECT ..." >> "$LOG"
          nohup /usr/bin/java -jar \
            -Dsun.jnu.encoding=UTF8 -Dfile.encoding=UTF8 \
            -Dspring.profiles.active=production,swagger"$MOD" \
            ~/"$PROJECT/$JOB.jar" >> /dev/null 2>&1 &
          sleep 5
          NEW_PID=$(/usr/sbin/lsof -iTCP:"$PORT" -sTCP:LISTEN -P -n 2>/dev/null | awk 'NR>1 {print $2; exit}')
          if [[ -n "$NEW_PID" ]]; then
            echo "$(date '+%F %T') 重启成功,PID=$NEW_PID" >> "$LOG"
          else
            echo "$(date '+%F %T') 重启失败" >> "$LOG"
          fi
        else
          echo "$(date '+%F %T') 服务 UP,PID=$PID" >> "$LOG"
        fi
        
    • 将监控加入 cron(由 Jenkins 初始化一次即可):
      # 每分钟检查一次
      * * * * * /root/monitor.sh 9065 online_store cms JOB_NAME
      
    • 钉钉告警示例(在重启失败或关键异常时调用):
      curl -s 'https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN' \
        -H 'Content-Type: application/json' \
        -d "{\"msgtype\":\"text\",\"text\":{\"content\":\"[监控告警] 主机 $(hostname) 项目 $PROJECT 端口 $PORT 异常,已尝试重启\"}"
      
    • 说明:Jenkins 可用 SSH 在远程节点执行命令将脚本分发到目标机 后执行;cron 保证自愈,Jenkins 负责低频巡检与汇总。
  • 步骤 3:在 Jenkins 编排巡检与通知
    • Freestyle:构建步骤选择 Send files or execute commands over SSH,配置目标主机、凭据与要执行的检查/自愈脚本;构建后步骤执行 钉钉通知(可结合文本/Markdown 消息)。
    • Pipeline:使用 sshagent 执行远程命令或脚本;聚合结果后调用钉钉 Webhook 发送告警。示例:
      pipeline {
        agent any
        environment {
          SSH_CRED = 'prod-ssh-key'
          HOST = '192.168.1.10'
          USER = 'deploy'
        }
        stages {
          stage('Health Check') {
            steps {
              script {
                def status = sh(
                  script: """ssh -o StrictHostKeyChecking=no ${USER}@${HOST} 'pgrep -f myapp.jar || echo DOWN'""",
                  returnStdout: true
                ).trim()
                if (status == 'DOWN') {
                  // 触发远程自愈或告警
                  sh "ssh ${USER}@${HOST} '~/monitor.sh 8080 myapp api JOB-123 || true'"
                  // 钉钉告警
                  httpRequest(
                    httpMode: 'POST',
                    url: 'https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN',
                    contentType: 'APPLICATION_JSON',
                    requestBody: """{"msgtype":"text","text":{"content":"[Jenkins] ${HOST} myapp DOWN,已尝试自愈"}}"""
                  )
                }
              }
            }
          }
        }
      }
      
    • 说明:Jenkins 可通过 SSH 插件 远程执行命令、传输文件;也可通过 API/脚本接口 在节点侧执行诊断命令并汇总结果。

三、进阶监控与可视化

  • 系统与应用指标
    • 在 Linux 侧启用 sysstat(如 sar)采集 CPU、内存、I/O 等历史指标;在 Jenkins 任务中定期抓取并归档/展示。
    • 在 Jenkins 侧安装 Performance Plugin 查看构建与任务层面的性能趋势;如需更全面的 JVM/HTTP 指标,可结合 JavaMelody 等插件。
  • 监控集成与面板
    • 安装 Prometheus 插件 暴露 /prometheus 指标端点,使用 Prometheus 抓取并在 Grafana 构建 Jenkins 性能与健康 面板,实现跨节点统一可视化。

四、安全与运维要点

  • 认证与权限
    • 优先使用 SSH 密钥(禁用口令登录),为 Jenkins 创建最小权限专用账号;凭据集中托管在 Jenkins Credentials
    • 如用 SSH Agent,确保以 Jenkins 运行账号生成与管理密钥,避免因用户不匹配导致 Permission denied
  • 安全加固
    • 开启 CSRF 保护;Jenkins API 调用携带 crumb;对外仅开放必要端口(如 8080/50000 等按需开放),并使用 防火墙/安全组 限制来源。
    • 钉钉机器人使用 自定义关键词/签名;Webhook 调用建议放入 Jenkins Secret 管理,避免明文泄露。

0