shell腳本命令搞定mysql_exporter部署,重復(fù)配置自動化
前言
在多臺服務(wù)器上部署 mysql_exporter 這件事,手動做的話每一步都不能少:下載二進制包、MySQL 建監(jiān)控用戶、授權(quán)、寫 systemd 服務(wù)文件、配憑證文件。跑一臺的時候還好,批量跑的時候每臺都來一遍,容易出錯也浪費時間。
這篇的核心是把整個部署流程寫成一個 Shell 腳本:一條命令跑完下載、安裝、建用戶、配權(quán)限、寫服務(wù)、啟動服務(wù)這些步驟。腳本里硬編碼了 MySQL root 密碼和 exporter 用戶的密碼,跑的時候按需改一下就行。跑完之后 systemd 服務(wù)自動注冊好,開機自啟,prometheus 直接抓 metrics 地址就能用。
腳本本身不復(fù)雜,關(guān)鍵是把原本需要查文檔一步步做的內(nèi)容變成了可復(fù)用的工具。對于需要同時維護多臺 MySQL 實例的人來說,把這個腳本存下來,后續(xù)擴縮容的時候直接跑命令比逐臺操作效率高得多。

1.為什么選擇shell腳本一鍵安裝?
選擇Shell腳本一鍵安裝mysqld_exporter,主要是為了提升部署效率、保證配置一致性并降低人為操作錯誤風(fēng)險。
在生產(chǎn)環(huán)境中,往往需要在多臺服務(wù)器上快速部署監(jiān)控組件,手動執(zhí)行下載、解壓、創(chuàng)建用戶、配置MySQL權(quán)限、編寫systemd服務(wù)等步驟不僅繁瑣,還容易因環(huán)境差異導(dǎo)致配置遺漏或權(quán)限問題。
通過Shell腳本自動化整個流程,可以實現(xiàn)“一次編寫,處處運行”,確保所有節(jié)點的安裝路徑、用戶權(quán)限、監(jiān)聽端口和認(rèn)證信息完全統(tǒng)一,同時支持以非root用戶(如 prometheus)安全運行,并自動配置開機自啟,極大簡化了Prometheus監(jiān)控體系的落地與維護成本。
部署高效快捷
一條命令即可完成下載、配置、授權(quán)、啟動全過程,大幅縮短部署時間。
配置標(biāo)準(zhǔn)化
所有服務(wù)器使用相同的路徑、用戶、端口和權(quán)限策略,避免“環(huán)境漂移”問題。
減少人為錯誤
自動創(chuàng)建MySQL監(jiān)控用戶并授予權(quán)限,避免手動操作導(dǎo)致的拼寫錯誤或權(quán)限遺漏。
安全合規(guī)
自動以專用非登錄用戶(如prometheus)運行服務(wù),并設(shè)置配置文件權(quán)限為600,防止密碼泄露。
自動開機自啟
集成systemd服務(wù)管理,確保系統(tǒng)重啟后監(jiān)控組件自動恢復(fù)運行。
便于批量運維
可結(jié)合Ansible、SaltStack或直接通過SSH批量執(zhí)行,適用于大規(guī)模集群統(tǒng)一部署。
可版本化與復(fù)用
腳本可納入Git管理,實現(xiàn)變更追蹤、回滾和跨項目復(fù)用,提升DevOps能力。
2.編寫shell腳本
部署MySQL Exporter(mysqld_exporter)的步驟,簡單明了如下:
創(chuàng)建專用監(jiān)控用戶
在MySQL中創(chuàng)建一個僅用于監(jiān)控的用戶(如 mysqld_exporter),并授予必要權(quán)限:REPLICATION CLIENT PROCESS SELECT on performance_schema.*
下載并解壓 mysqld_exporter
從 Prometheus 官方 GitHub 下載對應(yīng)版本的二進制包,解壓到指定目錄(如 /app/mysqld_exporter)。
配置數(shù)據(jù)庫連接憑證
創(chuàng)建一個配置文件(如 localhost_db.cnf),寫入監(jiān)控用戶的用戶名和密碼,格式為標(biāo)準(zhǔn) MySQL 客戶端配置(含 **[client]**段),并設(shè)置權(quán)限為 600,確保安全。
創(chuàng)建systemd服務(wù)
編寫systemd服務(wù)文件,以非root用戶(如prometheus)運行mysqld_exporter,指定配置文件路徑和監(jiān)聽端口(默認(rèn) :9105),并啟用開機自啟。
啟動并驗證服務(wù)
啟動服務(wù),檢查狀態(tài)是否正常,并通過瀏覽器或 curl,確認(rèn)指標(biāo)可訪問。
按照這個部署步驟,我已經(jīng)把腳本寫出來啦,需要的小伙伴僅供參考~(我安裝的版本是0.18.0)
#!/bin/bash
# 一鍵安裝 mysqld_exporter for CentOS 7
# 使用固定 MySQL root密碼自動建用戶
# 監(jiān)控用戶: mysqld_exporter / Sjixin520!
set -e
VERSION="v0.18.0"
INSTALL_DIR="/app/mysqld_exporter"
PORT="9105"
MYSQL_ROOT_USER="root"
MYSQL_ROOT_PASS="Sjixin52!"
EXPORTER_USER="mysqld_exporter"
EXPORTER_PASS="Sjixin52!"
RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m'
log() { echo -e "${GREEN}[INFO]${NC} $1"; }
error() { echo -e "${RED}[ERROR]${NC} $1" >&2; exit 1; }
if [ "$EUID" -ne 0 ]; then
error "請以 root 用戶運行此腳本!"
fi
# 安裝依賴
log "安裝必要工具..."
yum install -y wget tar &>/dev/null
# 下載mysqld_exporter
URL="https://github.com/prometheus/mysqld_exporter/releases/download/${VERSION}/mysqld_exporter-${VERSION#v}.linux-amd64.tar.gz"
log "正在下載mysqld_exporter ${VERSION} ..."
wget -O /tmp/mysqld_exporter.tar.gz "$URL" || error "下載失敗"
# 解壓到/app/mysqld_exporter
mkdir -p "$INSTALL_DIR"
tar -zxvf /tmp/mysqld_exporter.tar.gz -C "$INSTALL_DIR" --strip-components=1
chown -R root:root "$INSTALL_DIR"
# 確保prometheus用戶存在
if ! id "prometheus" &>/dev/null; then
log "創(chuàng)建prometheus系統(tǒng)用戶..."
useradd --system --shell /sbin/nologin --no-create-home prometheus
fi
# 自動創(chuàng)建MySQL監(jiān)控用戶
log "正在連接MySQL并創(chuàng)建監(jiān)控用戶 '$EXPORTER_USER' ..."
# 測試root登錄是否成功
if ! mysql -u"$MYSQL_ROOT_USER" -p"$MYSQL_ROOT_PASS" -e "SELECT 1;" >/dev/null 2>&1; then
error "無法使用root / Sjixin52! 登錄MySQL,請確認(rèn)MySQL正在運行且密碼正確"
fi
# 創(chuàng)建exporter用戶
mysql -u"$MYSQL_ROOT_USER" -p"$MYSQL_ROOT_PASS" <<SQL
CREATE USER IF NOT EXISTS '$EXPORTER_USER'@'localhost' IDENTIFIED BY '$EXPORTER_PASS';
GRANT REPLICATION CLIENT, PROCESS ON *.* TO '$EXPORTER_USER'@'localhost';
GRANT SELECT ON performance_schema.* TO '$EXPORTER_USER'@'localhost';
FLUSH PRIVILEGES;
SQL
log "MySQL監(jiān)控用戶創(chuàng)建成功!"
# 創(chuàng)建.my.cnf文件
cat > "$INSTALL_DIR/localhost_db.cnf" <<EOF
[client]
user=$EXPORTER_USER
password=$EXPORTER_PASS
host=localhost
EOF
chmod 600 "$INSTALL_DIR/localhost_db.cnf"
chown prometheus:prometheus "$INSTALL_DIR/localhost_db.cnf"
# 創(chuàng)建systemd服務(wù)
cat > /etc/systemd/system/mysqld_exporter.service <<EOF
[Unit]
Description=MySQL Exporter
After=network.target
[Service]
Type=simple
User=prometheus
ExecStart=$INSTALL_DIR/mysqld_exporter \\
--config.my-cnf=$INSTALL_DIR/localhost_db.cnf \\
--web.listen-address=:9105
Restart=on-failure
RestartSec=10
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
EOF
# 啟動服務(wù)
log "啟動 mysqld_exporter 服務(wù)..."
systemctl daemon-reload
systemctl enable --now mysqld_exporter
log "? 安裝完成!"
log "指標(biāo)地址: http://$(hostname -I | awk '{print $1}'):${PORT}/metrics"
log "服務(wù)狀態(tài): systemctl status mysqld_exporter"
3.使用腳本部署mysql_exporter
編輯一個mysql_exporter.sh文件:
vi mysql_exporter.sh
#!/bin/bash
# 一鍵安裝 mysqld_exporter for CentOS 7
# 使用固定 MySQL root密碼自動建用戶
# 監(jiān)控用戶: mysqld_exporter / Sjixin520!
set -e
VERSION="v0.18.0"
INSTALL_DIR="/app/mysqld_exporter"
PORT="9105"
MYSQL_ROOT_USER="root"
MYSQL_ROOT_PASS="Sjixin52!"
EXPORTER_USER="mysqld_exporter"
EXPORTER_PASS="Sjixin52!"
RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m'
log() { echo -e "${GREEN}[INFO]${NC} $1"; }
error() { echo -e "${RED}[ERROR]${NC} $1" >&2; exit 1; }
if [ "$EUID" -ne 0 ]; then
error "請以 root 用戶運行此腳本!"
fi
# 安裝依賴
log "安裝必要工具..."
yum install -y wget tar &>/dev/null
# 下載mysqld_exporter
URL="https://github.com/prometheus/mysqld_exporter/releases/download/${VERSION}/mysqld_exporter-${VERSION#v}.linux-amd64.tar.gz"
log "正在下載mysqld_exporter ${VERSION} ..."
wget -O /tmp/mysqld_exporter.tar.gz "$URL" || error "下載失敗"
# 解壓到/app/mysqld_exporter
mkdir -p "$INSTALL_DIR"
tar -zxvf /tmp/mysqld_exporter.tar.gz -C "$INSTALL_DIR" --strip-components=1
chown -R root:root "$INSTALL_DIR"
# 確保prometheus用戶存在
if ! id "prometheus" &>/dev/null; then
log "創(chuàng)建prometheus系統(tǒng)用戶..."
useradd --system --shell /sbin/nologin --no-create-home prometheus
fi
# 自動創(chuàng)建MySQL監(jiān)控用戶
log "正在連接MySQL并創(chuàng)建監(jiān)控用戶 '$EXPORTER_USER' ..."
# 測試root登錄是否成功
if ! mysql -u"$MYSQL_ROOT_USER" -p"$MYSQL_ROOT_PASS" -e "SELECT 1;" >/dev/null 2>&1; then
error "無法使用root / Sjixin52! 登錄MySQL,請確認(rèn)MySQL正在運行且密碼正確"
fi
# 創(chuàng)建exporter用戶
mysql -u"$MYSQL_ROOT_USER" -p"$MYSQL_ROOT_PASS" <<SQL
CREATE USER IF NOT EXISTS '$EXPORTER_USER'@'localhost' IDENTIFIED BY '$EXPORTER_PASS';
GRANT REPLICATION CLIENT, PROCESS ON *.* TO '$EXPORTER_USER'@'localhost';
GRANT SELECT ON performance_schema.* TO '$EXPORTER_USER'@'localhost';
FLUSH PRIVILEGES;
SQL
log "MySQL監(jiān)控用戶創(chuàng)建成功!"
# 創(chuàng)建.my.cnf文件
cat > "$INSTALL_DIR/localhost_db.cnf" <<EOF
[client]
user=$EXPORTER_USER
password=$EXPORTER_PASS
host=localhost
EOF
chmod 600 "$INSTALL_DIR/localhost_db.cnf"
chown prometheus:prometheus "$INSTALL_DIR/localhost_db.cnf"
# 創(chuàng)建systemd服務(wù)
cat > /etc/systemd/system/mysqld_exporter.service <<EOF
[Unit]
Description=MySQL Exporter
After=network.target
[Service]
Type=simple
User=prometheus
ExecStart=$INSTALL_DIR/mysqld_exporter \\
--config.my-cnf=$INSTALL_DIR/localhost_db.cnf \\
--web.listen-address=:9105
Restart=on-failure
RestartSec=10
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
EOF
# 啟動服務(wù)
log "啟動 mysqld_exporter 服務(wù)..."
systemctl daemon-reload
systemctl enable --now mysqld_exporter
log "? 安裝完成!"
log "指標(biāo)地址: http://$(hostname -I | awk '{print $1}'):${PORT}/metrics"
log "服務(wù)狀態(tài): systemctl status mysqld_exporter"

添加完成后,執(zhí)行該文件:
sh mysql_exporter.sh

執(zhí)行過程還是很順利的,我們來一下終極驗證,查看mysqld_exporter服務(wù)是否啟動成功:
systemctl status mysqld_exporter

我們自動腳本就編寫成功啦!
這樣,無論你有上百臺機器都不怕啦~
眾所周知,mysql_exporter是搭配prometheus來使用的,接下來,跟我一起搭配prometheus來使用吧~
4.prometheus監(jiān)控mysql_exporter
找到prometheus的配置文件,編輯添加如下內(nèi)容(由于我是在另一臺機器上安裝的prometheus,所以寫了mysql_exporter的Ip地址,正常寫localhost就可以):
vi prometheus.yml
- targets: ["192.168.42.146:9105"]
labels:
app: "mysql_exporter"

使用瀏覽器ip+9090打開promethues的頁面:

我們可以看到prometheus已經(jīng)抓取到192.168.42.146里面的mysql_exporter服務(wù)啦!
那么,現(xiàn)在我有一個疑問:**當(dāng)MySQL Exporter與Prometheus部署在同一個局域網(wǎng)內(nèi)時,監(jiān)控自然暢通無阻;但如果它們不在同一網(wǎng)絡(luò)環(huán)境——比如 Prometheus在公網(wǎng)服務(wù)器,而MySQL數(shù)據(jù)庫位于內(nèi)網(wǎng)或本地開發(fā)環(huán)境中,無法被外網(wǎng)直接訪問,這時該怎么辦?**別擔(dān)心!cpolar正是解決這類跨網(wǎng)絡(luò)監(jiān)控難題的利器。通過cpolar的內(nèi)網(wǎng)穿透能力,我們可以安全、穩(wěn)定地將內(nèi)網(wǎng)中運行的mysqld_exporter(默認(rèn)監(jiān)聽 :9105)暴露到公網(wǎng),生成一個臨時或固定的公網(wǎng)地址。Prometheus只需將該地址配置為抓取目標(biāo),即可像訪問本地服務(wù)一樣采集內(nèi)網(wǎng)MySQL的性能指標(biāo),全程無需修改防火墻策略、無需公網(wǎng)IP,也無需暴露數(shù)據(jù)庫本身。更重要的是,cpolar支持HTTPS加密、身份認(rèn)證和隧道?;睿_保監(jiān)控數(shù)據(jù)傳輸?shù)陌踩耘c可靠性。無論是遠程調(diào)試、混合云架構(gòu),還是邊緣設(shè)備監(jiān)控,cpolar都能輕松打通網(wǎng)絡(luò)壁壘,讓Prometheus的“眼睛”看得更遠、更廣。所以,無論你的數(shù)據(jù)庫藏得多深,只要有一條出網(wǎng)通道,cpolar就能幫你把監(jiān)控數(shù)據(jù)“送出去”!
5.安裝cpolar內(nèi)網(wǎng)穿透工具
cpolar 可以將你本地電腦中的服務(wù)(如 SSH、Web、數(shù)據(jù)庫)映射到公網(wǎng)。即使你在家里或外出時,也可以通過公網(wǎng)地址連接回本地運行的開發(fā)環(huán)境。
??以下是安裝cpolar步驟:
使用一鍵腳本安裝命令:
sudo curl https://get.cpolar.sh | sh

安裝完成后,執(zhí)行下方命令查看cpolar服務(wù)狀態(tài):(如圖所示即為正常啟動)
sudo systemctl status cpolar

Cpolar安裝和成功啟動服務(wù)后,在瀏覽器上輸入虛擬機主機IP加9200端口即:【ip:9200】訪問Cpolar管理界面,使用Cpolar官網(wǎng)注冊的賬號登錄,登錄后即可看到cpolar web 配置界面,接下來在web 界面配置即可:
打開瀏覽器訪問本地9200端口,使用cpolar賬戶密碼登錄即可,登錄后即可對隧道進行管理。

6.配置公網(wǎng)地址
登錄cpolar web UI管理界面后,點擊左側(cè)儀表盤的隧道管理——創(chuàng)建隧道:
隧道名稱:可自定義,本例使用了:mysql_exporter,注意不要與已有的隧道名稱重復(fù)
協(xié)議:http
本地地址:9105
域名類型:隨機域名
地區(qū):選擇China Top

創(chuàng)建成功后,打開左側(cè)在線隧道列表,可以看到剛剛通過創(chuàng)建隧道生成了公網(wǎng)地址,接下來就可以在其他電腦或者移動端設(shè)備(異地)上,使用地址訪問。

Prometheus可以通過這個公網(wǎng)地址38c53143.r2.cpolar.top訪問到運行在本地9105端口的mysql_exporter服務(wù),從而抓取系統(tǒng)指標(biāo)。
- targets: ["38c53143.r2.cpolar.top"]
labels:
app: "mysql_exporter"

抓取成功!

7.保留固定公網(wǎng)地址
使用cpolar為其配置二級子域名,該地址為固定地址,不會隨機變化。

點擊左側(cè)的預(yù)留,選擇保留二級子域名,地區(qū)選擇china Top,然后設(shè)置一個二級子域名名稱,我這里演示使用的是mysqll,大家可以自定義。填寫備注信息,點擊保留。

登錄cpolar web UI管理界面,點擊左側(cè)儀表盤的隧道管理——隧道列表,找到所要配置的隧道m(xù)ysql_exporter,點擊右側(cè)的編輯。

修改隧道信息,將保留成功的二級子域名配置到隧道中
- 域名類型:選擇二級子域名
- Sub Domain:填寫保留成功的二級子域名
- 地區(qū): China Top
點擊更新

更新完成后,打開在線隧道列表,此時可以看到隨機的公網(wǎng)地址已經(jīng)發(fā)生變化,地址名稱也變成了保留和固定的二級子域名名稱。

最后,我們使用固定的公網(wǎng)地址在任意設(shè)備的瀏覽器中訪問,可以看到成功訪問本地部署的頁面,這樣一個永久不會變化的二級子域名公網(wǎng)網(wǎng)址即設(shè)置好了。

結(jié)尾
腳本的價值在于把手動操作變成可復(fù)制的命令。把部署流程寫進腳本里,不只是省時間,更重要的是減少人為操作帶來的差異——每臺機器的路徑、用戶權(quán)限、配置文件內(nèi)容都能保持一致,出問題的時候排查邏輯也是統(tǒng)一的。
mysql_exporter 本身接入 Prometheus 的鏈路很標(biāo)準(zhǔn):起服務(wù)、Prometheus 配 job 拉 metrics、告警規(guī)則針對具體的指標(biāo)閾值來配。cpolar 在這里解決的是 Prometheus 和 exporter 不在同一網(wǎng)絡(luò)的連通性問題,屬于特定場景下的方案。
整體來說,這套腳本適合需要批量部署或者經(jīng)常遷移環(huán)境的場景,一條命令搞定比查文檔一步步做要可靠得多。
到此這篇關(guān)于shell腳本命令搞定mysql_exporter部署,重復(fù)配置自動化的文章就介紹到這了,更多相關(guān)shell腳本部署mysql_exporter內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在Windows與Linux下禁止被ping的設(shè)置方法[推薦]
LINUX下禁止ping命令的方法與windows下禁止ping的設(shè)置方法,非常的全,推薦大家參考下。2011-03-03
git多人協(xié)作_動力節(jié)點Java學(xué)院整理
這篇文章主要介紹了git多人協(xié)作,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08
iis7 iis8反向代理規(guī)則編寫、安裝與配置方法
這篇文章主要介紹了iis7 iis8反向代理規(guī)則編寫、安裝與配置方法,需要的朋友可以參考下2020-04-04

