批量部署服务器监控以及日志收集
本文最后更新于 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()
操作手册
服务器监控安装方法:
内含3个脚本
脚本需要配合servers.txt使用
将需要添加监控和日志的服务器IP地址放入servers.txt内
按以下格式填入:
IP地址,端口号,root,密码
确认文本格式为Unix,不能是Windows
如果不对的话,在服务器内安装dos2unix
yum install dos2unix
yum install sshpass
输入 dos2unix servers.txt
执行 批量安装日志节点.sh
bash 批量安装日志节点.sh
没权限的话 chmod -x 批量安装日志节点.sh
直接等跑完即可,如果有报错的几台机器单独重新跑一下,脚本会删除掉文件重新运行。
配置解释
批量安装监控节点脚本不需要修改内容,配置好servers.txt直接执行即可。
然后要到/root/prometheus-2.53.0-rc.0.linux-amd64/prometheus.yml
修改这个文件
可选(修改分组)
批量修改服务器分组,在监控日志内可以详细分组,例如新加坡/香港分组。或者上架/下架分组
需要先修改 批量改名分组.py
只需要修改这个部分就可以了
然后运行,会通过读取servers.txt来修改并且重启服务。
这个脚本没有设置删除信息,而是追加,不要重复执行脚本,否则机器会多出很多分组。如果误操作,需要到误操作的机器内删除信息
删除多余内容:
保存后重启服务
sudo systemctl restart promtail
后台检查是否正常
用户名admin
密码admin
添加查询参数查询
或者
使用 Loki API 查询所有标签
Loki 提供了一个 HTTP API 端点,可以用来查询所有标签。标签通常包含主机名或 IP 地址等信息。使用以下步骤来查询所有标签:
- 列出所有标签: 使用 curl 或类似的 HTTP 客户端查询 Loki 的标签:
curl -s "http://<LOKI_SERVER>:3100/loki/api/v1/labels"
这个命令会返回所有标签的列表。
- 查询特定标签的值: 如果知道某个标签是用于标识服务器的(例如 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"