在对 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_url; then
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 true; do
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
主机算是比较好的方式落地,其他指标监控都是类似,可以灵活选择采集器,后端存储、可视化、告警都可以固定。
推荐本站淘宝优惠价购买喜欢的宝贝:
本文链接:https://hqyman.cn/post/10899.html 非本站原创文章欢迎转载,原创文章需保留本站地址!
休息一下~~