本文最后更新于 2024-06-11,

若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益, 请联系我 删除。

本站只有Telegram群组为唯一交流群组, 点击加入

文章内容有误?申请成为本站文章修订者或作者? 向站长提出申请

最近的工作需要大量监控服务器以及收集日志,之前的zabbix已经有点不是很好用了,于是换成了Grafana。之前也写了一些安装部署的文章,此文章仅作为脚本的记录。

批量安装监控节点

#!/bin/bash

# 读取服务器列表
while IFS=',' read -r SERVER_IP SERVER_PORT USERNAME PASSWORD; do
  echo "Deploying Node Exporter to $SERVER_IP..."

  # 使用 sshpass 进行 SSH 连接并执行命令
  sshpass -p "$PASSWORD" ssh -o StrictHostKeyChecking=no -p "$SERVER_PORT" "$USERNAME@$SERVER_IP" bash -s <<'ENDSSH'
    # 获取公共 IP 地址
    PUBLIC_IP=$(curl -s http://169.254.169.254/latest/meta-data/public-ipv4 || curl -s ifconfig.me)
    echo "Public IP: $PUBLIC_IP"

    # 下载并解压 Node Exporter
    wget https://github.com/prometheus/node_exporter/releases/download/v1.8.1/node_exporter-1.8.1.linux-amd64.tar.gz
    tar -xvf node_exporter-1.8.1.linux-amd64.tar.gz
    cd node_exporter-1.8.1.linux-amd64

    # 创建 Node Exporter systemd 服务文件
    sudo tee /etc/systemd/system/node_exporter.service > /dev/null <<EOL
[Unit]
Description=Node Exporter
After=network.target

[Service]
User=root
ExecStart=/root/node_exporter-1.8.1.linux-amd64/node_exporter

[Install]
WantedBy=default.target
EOL

    # 启动并启用 Node Exporter 服务
    sudo systemctl daemon-reload
    sudo systemctl start node_exporter
    sudo systemctl enable node_exporter

    # 添加 Node Exporter 端口到防火墙
    sudo firewall-cmd --zone=public --add-port=9100/tcp --permanent
    sudo firewall-cmd --reload
ENDSSH

  # 检查 SSH 命令的退出状态
  if [ $? -ne 0 ]; then
    echo "SSH command failed for $SERVER_IP"
  else
    echo "Node Exporter deployed successfully on $SERVER_IP"
  fi

done < servers.txt

echo "Script ended"


批量安装日志节点

#!/bin/bash

# Loki服务器的IP地址
LOKI_SERVER_IP="IP地址"

# Promtail配置文件模板
PROMTAIL_CONFIG="server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /root/positions.yaml

clients:
  - url: http://$LOKI_SERVER_IP:3100/loki/api/v1/push

scrape_configs:
  - job_name: <job_name>
    static_configs:
      - targets:
          - localhost
        labels:
          job: <job_name>
          __path__: /rungo/log/LogProxy.log"

# 日志文件
LOG_FILE="/root/deploy_log.txt"

# 清空日志文件
> $LOG_FILE
echo "Script started" | tee -a $LOG_FILE

# 读取服务器列表
while IFS=',' read -r SERVER_IP SERVER_PORT USERNAME PASSWORD; do
  echo "Deploying to $SERVER_IP..." | tee -a $LOG_FILE

  # 使用 sshpass 进行 SSH 连接并执行命令
  sshpass -p "$PASSWORD" ssh -o StrictHostKeyChecking=no -p "$SERVER_PORT" "$USERNAME@$SERVER_IP" bash -s <<ENDSSH 2>&1 | tee -a $LOG_FILE
    echo "Connected to $SERVER_IP"

    # 获取公共 IP 地址作为 Job 名称
    PUBLIC_IP=\$(curl -s http://169.254.169.254/latest/meta-data/public-ipv4 || curl -s ifconfig.me)
    echo "Public IP: \$PUBLIC_IP"

    # 清理旧的 Promtail 配置和服务文件
    sudo systemctl stop promtail || true
    sudo rm -f /etc/systemd/system/promtail.service
    sudo rm -f /root/promtail-config.yaml
    sudo rm -rf /var/log/positions

    # 创建目录
    sudo mkdir -p /var/log/positions

    # 下载 Promtail
    wget -q https://github.com/grafana/loki/releases/download/v2.9.8/promtail-linux-amd64.zip
    unzip -qq promtail-linux-amd64.zip
    chmod a+x promtail-linux-amd64
    sudo mv promtail-linux-amd64 /usr/local/bin/promtail

    # 替换 Job 名称并创建 Promtail 配置文件
    sudo bash -c "cat > /root/promtail-config.yaml <<EOL
$(echo "$PROMTAIL_CONFIG" | sed 's/<job_name>/\$PUBLIC_IP/g')
EOL"

    # 检查配置文件是否写入成功
    if [ -s /root/promtail-config.yaml ]; then
      echo "Promtail config file written successfully on $SERVER_IP"
    else
      echo "Failed to write Promtail config file on $SERVER_IP" | tee -a /root/promtail_error_$SERVER_IP.log
    fi

    # 创建 systemd 服务文件
    sudo tee /etc/systemd/system/promtail.service > /dev/null <<EOL
[Unit]
Description=Promtail service
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/promtail -config.file=/root/promtail-config.yaml
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOL

    # 启动并启用 Promtail
    sudo systemctl daemon-reload
    sudo systemctl enable promtail
    sudo systemctl start promtail
    echo "Promtail deployed and started on $SERVER_IP"

    # 检查 Promtail 服务状态
    if systemctl is-active --quiet promtail; then
      echo "Promtail service is running on $SERVER_IP"
    else
      echo "Promtail service failed to start on $SERVER_IP"
      sudo journalctl -u promtail -l > /root/promtail_error_$SERVER_IP.log
      echo "Error log saved to /root/promtail_error_$SERVER_IP.log" | tee -a $LOG_FILE
    fi
ENDSSH

  # 检查 SSH 命令的退出状态
  if [ $? -ne 0 ]; then
    echo "SSH command failed for $SERVER_IP" | tee -a $LOG_FILE
  else
    echo "SSH command succeeded for $SERVER_IP" | tee -a $LOG_FILE
  fi

done < /root/servers.txt

echo "Script ended" | tee -a $LOG_FILE

批量改名分组

import paramiko
import csv

# 服务器信息文件路径
SERVERS_FILE = '/root/servers.txt'
CONFIG_FILE = '/root/promtail-config.yaml'

def execute_ssh_command(host, port, username, password, command):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    try:
        ssh.connect(hostname=host, port=port, username=username, password=password)
        stdin, stdout, stderr = ssh.exec_command(command)
        stdout.channel.recv_exit_status()  # 等待命令完成
        output = stdout.read().decode()
        error = stderr.read().decode()
        return output, error
    except Exception as e:
        return None, str(e)
    finally:
        ssh.close()

def update_server_configuration(host, port, username, password):
    print(f"Attempting to update configuration on {host}...")
    command = (
        f"export LANG=en_US.UTF-8 && export LC_ALL=en_US.UTF-8 && "
        f"echo 'Updating {host}...' && "
        f"sed -i '/labels:/a \ \ \ \ \ \ \ \ \ \ group: \"正在运行中\"' {CONFIG_FILE} && "
        f"systemctl restart promtail"
    )
    output, error = execute_ssh_command(host, port, username, password, command)
    if error:
        print(f"Failed to update {host}: {error}")
    else:
        print(f"Successfully updated {host}: {output}")

def main():
    print("Starting processing servers...")
    with open(SERVERS_FILE, newline='') as csvfile:
        reader = csv.reader(csvfile)
        for row in reader:
            if len(row) != 4:
                print(f"Invalid line in servers file: {row}")
                continue
            server_ip, server_port, username, password = row
            update_server_configuration(server_ip, int(server_port), username, password)
    print("完成所有工作.")

if __name__ == '__main__':
    main()



操作手册

服务器监控安装方法:

1718095729245.webp

内含3个脚本

脚本需要配合servers.txt使用

将需要添加监控和日志的服务器IP地址放入servers.txt内

按以下格式填入:

1718096338546.webp

IP地址,端口号,root,密码

确认文本格式为Unix,不能是Windows

1718096352969.webp

如果不对的话,在服务器内安装dos2unix

yum install dos2unix
yum install sshpass

1718096399706.webp

输入 dos2unix servers.txt

1718096787052.webp

执行 批量安装日志节点.sh

bash 批量安装日志节点.sh

没权限的话 chmod -x 批量安装日志节点.sh

直接等跑完即可,如果有报错的几台机器单独重新跑一下,脚本会删除掉文件重新运行。

配置解释

1718096827156.webp

批量安装监控节点脚本不需要修改内容,配置好servers.txt直接执行即可。

然后要到/root/prometheus-2.53.0-rc.0.linux-amd64/prometheus.yml

修改这个文件

1718096880368.webp

可选(修改分组)

批量修改服务器分组,在监控日志内可以详细分组,例如新加坡/香港分组。或者上架/下架分组

需要先修改 批量改名分组.py

1718096900983.webp

只需要修改这个部分就可以了

然后运行,会通过读取servers.txt来修改并且重启服务。

这个脚本没有设置删除信息,而是追加,不要重复执行脚本,否则机器会多出很多分组。如果误操作,需要到误操作的机器内删除信息

1718096918108.webp

删除多余内容:

1718096969458.webp

保存后重启服务

sudo systemctl restart promtail

后台检查是否正常

http://IP:3000/

用户名admin

密码admin

添加查询参数查询

或者

使用 Loki API 查询所有标签

Loki 提供了一个 HTTP API 端点,可以用来查询所有标签。标签通常包含主机名或 IP 地址等信息。使用以下步骤来查询所有标签:

  1. 列出所有标签: 使用 curl 或类似的 HTTP 客户端查询 Loki 的标签:

curl -s "http://<LOKI_SERVER>:3100/loki/api/v1/labels"

这个命令会返回所有标签的列表。

  1. 查询特定标签的值: 如果知道某个标签是用于标识服务器的(例如 host 或 instance),可以查询该标签的所有值:

curl -s "http://<LOKI_SERVER>:3100/loki/api/v1/label/<LABEL_NAME>/values"

例如,如果标签名称是 host:这会返回所有 <span lang="EN-US">host</span> 标签的值列表,即所有服务器的 IP 地址。

curl -s "http://<LOKI_SERVER>:3100/loki/api/v1/label/host/values"