25
2025
04
09:41:19

主机监控:30分钟快速监控万台 Linux 主机

在对 Linux 操作系统的主机做监控的时候,通常面临一个场景就是海量的主机安装 采集器 的问题,通常情况下我对 Linux 主机监控都是基于以下架构:

图片

具体组件的安装部署配置可阅读前文:

夜莺监控:使用夜莺生态综合体打造最强监控体系

批量安装采集器

在 Linux 主机下必须安装 node exporter 采集器,当然也有其他的采集器可以实现但还是推荐使用 node exporter ,但实际环境下往往都是有大批量的 Linux 主机存在,那么这里就涉及到对大批量 Linux 主机安装部署 node exporter 的情况,一般情况下有这三种方式:

堡垒机批量安装

一般情况下管理大批量 Linux 主机都有堡垒机来接管的,那么这个时候我们就可以通过堡垒机来做批量安装和操作,比如 JumpServer 集成了 Ansible ,可以批量在所有主机上执行安装部署脚本来实现安装 node exporter 采集器。

Ansible 批量安装

如果没有堡垒机,可以单独部署 Ansible 去实现对大批量主机安装部署 node exporter 采集器,这个 Ansible 批量安装相关的配置后续开源出来,我将把所有需要安装的组件通过这个方式去实现。


安装脚本

上面如果使用 Ansible 那么就需要写好 Playbook 配置实现大批量的部署安装,如果使用堡垒机脚本的方式就需要一个安装脚本去实现,下面我们来了解一下脚本:

#!/bin/bash

# 检查当前操作系统类型和包管理器
check_os() {
    if [ -f /etc/os-release ]; then
        . /etc/os-release
        OS=$ID
        VERSION_ID=$VERSION_ID
    else
        echo "无法检测操作系统类型。"
        exit 1
    fi
}

# 检查 systemd 服务文件路径是否可用
check_service_path() {
    if [ ! -d "/etc/systemd/system" ]; then
        echo "系统不支持 /etc/systemd/system 路径。"
        exit 1
    fi
}

# 安装所需的依赖工具(curl、tar 等)
install_dependencies() {
    case $OS in
    ubuntu|debian)
        sudo apt update -y && sudo apt install -y curl tar
        ;;
    centos|rocky|almalinux|fedora)
        sudo yum install -y curl tar
        ;;
    suse|opensuse)
        sudo zypper install -y curl tar
        ;;
    *)
        echo "暂不支持的操作系统: $OS"
        exit 1
        ;;
    esac
}

# 停止并清理旧版本的 Node Exporter
cleanup_old_node_exporter() {
    if systemctl is-active --quiet node_exporter; then
        echo "node_exporter 正在运行,停止并禁用它。"
        sudo systemctl stop node_exporter
        sudo systemctl disable node_exporter
    fi

    service_path=$(sudo systemctl show -p FragmentPath node_exporter | sed 's/FragmentPath=//')
    if [ -f "$service_path" ]; then
        sudo rm -f "$service_path"
    fi

    echo "删除 node_exporter 相关文件和目录..."
    sudo rm -rf /usr/local/bin/node_exporter
    sudo rm -rf /etc/systemd/system/node_exporter.service
    sudo rm -rf /etc/systemd/system/node_exporter.socket
    sudo rm -rf /etc/sysconfig/node_exporter
    sudo rm -rf /etc/default/node_exporter
    sudo rm -rf /var/lib/node_exporter
}

# 下载并解压最新版本的 Node Exporter
download_and_extract_node_exporter() {
    # 使用 GitHub API 获取最新的 node_exporter 版本号
    latest_version=$(curl -s https://api.github.com/repos/prometheus/node_exporter/releases/latest | grep tag_name | cut -d '"' -f4 | sed 's/^v//')
    # latest_version=1.8.0  # 可以通过 GitHub API 动态获取最新版本
    echo "最新版本的 node_exporter 是 $latest_version"
    download_url="https://xxxx.oss-cn-hangzhou.aliyuncs.com/software/node_exporter-${latest_version}.linux-amd64.tar.gz"

    echo "正在下载 node_exporter..."
    if ! curl -o "node_exporter-${latest_version}.linux-amd64.tar.gz" -C - $download_urlthen
        echo "下载失败,请检查网络连接或下载链接。"
        exit 1
    fi
    
    echo "正在验证下载的文件格式..."
    if ! file "node_exporter-${latest_version}.linux-amd64.tar.gz" | grep -q "gzip compressed data"then
        echo "下载的文件不是有效的 gzip 格式,请检查下载链接或文件。"
        echo "正在清理下载的文件..."
        sudo rm -f "node_exporter-${latest_version}.linux-amd64.tar.gz"
        exit 1
    fi

    echo "正在解压 node_exporter..."
    if ! tar -zxvf "node_exporter-${latest_version}.linux-amd64.tar.gz"then
        echo "解压失败,请检查压缩文件。"
        echo "正在清理下载的文件和目录..."
        sudo rm -rf "node_exporter-${latest_version}.linux-amd64.tar.gz"
        sudo rm -rf "node_exporter-${latest_version}.linux-amd64"
        return 1
    fi
    sudo mv "node_exporter-${latest_version}.linux-amd64/node_exporter" /usr/sbin/
}

# 创建 node_exporter 用户
create_node_exporter_user() {
    if ! id "node_exporter" &>/dev/null; then
        echo "创建 node_exporter 用户..."
        sudo useradd --no-create-home --shell /sbin/nologin node_exporter
    fi
}

# 配置 systemd 服务
configure_systemd_service() {
    echo "创建 node_exporter 的 systemd 服务文件..."
    sudo bash -c 'cat <<EOF > /etc/systemd/system/node_exporter.service
[Unit]
Description=Node Exporter
Requires=node_exporter.socket

[Service]
User=node_exporter
# Fallback when environment file does not exist
Environment=OPTIONS=
EnvironmentFile=-/etc/sysconfig/node_exporter
ExecStart=/usr/sbin/node_exporter --web.systemd-socket $OPTIONS

[Install]
WantedBy=multi-user.target
EOF'


    echo "创建 node_exporter 的 systemd socket 文件..."
    sudo bash -c 'cat <<EOF > /etc/systemd/system/node_exporter.socket
[Unit]
Description=Node Exporter

[Socket]
ListenStream=9100

[Install]
WantedBy=sockets.target
EOF'


    case $OS in
    ubuntu|debian)
        echo "OPTIONS=\"--collector.textfile.directory /var/lib/node_exporter/textfile_collector\"" | sudo tee /etc/default/node_exporter
        ;;
    centos|rocky|almalinux|fedora|suse|opensuse)
        echo "OPTIONS=\"--collector.textfile.directory /var/lib/node_exporter/textfile_collector\"" | sudo tee /etc/sysconfig/node_exporter
        ;;
    esac

    echo "创建文本文件收集器目录..."
    sudo mkdir -p /var/lib/node_exporter/textfile_collector
    sudo chown -R node_exporter:node_exporter /var/lib/node_exporter
}

# 启动和启用服务
start_and_enable_service() {
    sudo systemctl daemon-reload
    if ! sudo systemctl enable --now node_exporter; then
        echo "无法启动或启用 node_exporter 服务。"
        exit 1
    fi
    sudo systemctl status --no-pager node_exporter 
}

# 主程序
main() {
    check_os
    echo "检测到操作系统: $OS $VERSION_ID"

    while truedo
        echo "请选择操作:"
        echo "1) 安装 Node Exporter"
        echo "2) 卸载 Node Exporter"
        echo "3) 退出"
        read -rp "请输入选项 (1/2/3): " choice

        case $choice in
            1)
                check_service_path
                install_dependencies
                cleanup_old_node_exporter
                download_and_extract_node_exporter
                create_node_exporter_user
                configure_systemd_service
                start_and_enable_service
                echo "Node Exporter 安装完成!"
                ;;
            2)
                cleanup_old_node_exporter
                echo "Node Exporter 已卸载。"
                ;;
            3)
                echo "退出程序。"
                exit 0
                ;;
            *)
                echo "无效选项,请重新选择。"
                ;;
        esac
    done
}

main

这个脚本有个安装选项的操作,如果你默认是安装的步骤,可以修改静默安装即可。

脚本中有个 download_url 是我的 OSS 地址,通过 wget 或者 curl 去下载。

如果你的服务器环境都是内网的,那么你需要在内网 OSS 上上传 node exporter 二进制压缩包,下载最新稳定版本即可,如果内网没有 OSS 那么也可以通过 Nginx 部署一套内网静态文件服务器。


静态文件服务器

我们可以通过在内网部署一套静态文件服务器,然后把需要在脚本中下载的文件上传到静态文件服务器中,通过 HTTP 协议开放出来,然后在脚本中通过 wget 或者 curl 命令来下载,比如这里的采集器 node exporter 的,这里就通过 docker 快速搭建个静态文件服务器:

docker run -d \
    -v /data/file:/web \
    -p 80:8080 \
    halverneus/static-file-server:latest

启动后,我们把下载好的最新版本 node exporter 上传到 /data/file 目录下:

图片

然后网页打开,看看文件是否列出来了:

图片

这里可以看到没什么问题,算是临时搭建了一套内网静态文件服务器,现在我们通过 curl 或 wget 命令测试一下下载:

# wget
wget http://172.17.40.5/node_exporter-1.9.1.linux-amd64.tar.gz

# curl
curl -O http://172.17.40.5/node_exporter-1.9.1.linux-amd64.tar.gz

通过命令正常下载到,现在我们可以去修改下载部署脚本的链接:

download_url="http://172.17.40.5/node_exporter-${latest_version}.linux-amd64.tar.gz"

脚本保存好,然后也上传到静态服务器目录下的 /data/file 目录下,比如脚本名称为 deploy-node.sh 然后到需要安装和部署 node exporter 服务器下执行命令:

wget http://172.17.40.5/deploy-node.sh && chmod +x deploy-node.sh && ./deploy-node.sh

安装脚本执行完成,就已正常部署并运行成功了,那么其他什么堡垒机也可以执行这个脚本批量下发安装,或者单独一台一台设备上执行这个命令安装即可,喜欢用 Ansible 的用户可以通过 playbook 实现批量安装(后续可以放开监控架构的常用 playbook )。

注册对象

现在我们需要看架构显示,需要通过 TenSunS 的 web 界面批量导入对象,然后把对象信息注册到 consul 中:

图片

最后就是在 vmagent 配置 job_name 并修改对于配置信息,如下所示:

  - job_name: "node_exporter"
    scrape_interval: 15s
    scrape_timeout: 5s
    consul_sd_configs:
      - server: '172.16.100.151:8500'  # 查看你的 consul 部署的地址
        token: 'afxxxxxx-ffxx-4bxx-bxxx-94xxxa4xxx44'  # 查看你 consul 的 token
        services: ['selfnode_exporter']
        tags: ['linux']
    relabel_configs:
      - source_labels: [__meta_consul_tags]
        regex: .*OFF.*
        action: drop
      - source_labels: ['__meta_consul_service']
        target_label: cservice
      - source_labels: ['__meta_consul_service_metadata_vendor']
        target_label: vendor
      - source_labels: ['__meta_consul_service_metadata_region']
        target_label: region
      - source_labels: ['__meta_consul_service_metadata_group']
        target_label: group
      - source_labels: ['__meta_consul_service_metadata_account']
        target_label: account
      - source_labels: ['__meta_consul_service_metadata_name']
        target_label: name
      - source_labels: ['__meta_consul_service_metadata_iid']
        target_label: iid
      - source_labels: ['__meta_consul_service_metadata_exp']
        target_label: exp
      - source_labels: ['__meta_consul_service_metadata_instance']
        target_label: instance
      - source_labels: [instance]
        target_label: __address__

最终可以打开 vmagent ,点击 targets 后可以看到你添加的监控对象, 最后就是导入 Linux 主机监控仪表板:

具体仪表板在网盘中,有 Prometheus 数据源和 VictoriaMetrics 数据源:

图片
图片

基于 Prometheus 体系监控 Linux 主机算是比较好的方式落地,其他指标监控都是类似,可以灵活选择采集器,后端存储、可视化、告警都可以固定。




推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

本文链接:https://hqyman.cn/post/10899.html 非本站原创文章欢迎转载,原创文章需保留本站地址!

分享到:
打赏





休息一下~~


« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

请先 登录 再评论,若不是会员请先 注册

您的IP地址是: