- bash 与 PowerShell 双版本脚本,默认导入 dev、prod 命名空间(不再导入 public) - 命名空间 ID 可通过 NACOS_NAMESPACES 覆盖,地址/账号/密码走环境变量 - 导入前检查命名空间是否存在(缺失仅告警),逐文件输出导入结果 - 重写 README:文件清单、导入前需修改的配置项、命名空间与脚本用法说明
102 lines
3.5 KiB
Bash
Executable File
102 lines
3.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# 一键导入 seewis-cloud-plus 的 Nacos 配置(Linux / macOS)
|
||
# 用法: ./import-nacos-config.sh
|
||
# 环境变量:
|
||
# NACOS_ADDR Nacos 地址 (默认 http://localhost:8848)
|
||
# NACOS_USER 用户名 (默认 nacos)
|
||
# NACOS_PASS 密码 (未设置时交互输入,避免密码进 shell 历史)
|
||
# NACOS_NAMESPACES 目标命名空间 ID,逗号分隔 (默认 dev,prod,不会导入 public)
|
||
# Windows 请使用同目录下的 import-nacos-config.ps1
|
||
|
||
set -euo pipefail
|
||
|
||
NACOS_ADDR="${NACOS_ADDR:-http://locahost:8848}"
|
||
NACOS_USER="${NACOS_USER:-nacos}"
|
||
GROUP="DEFAULT_GROUP"
|
||
NACOS_NAMESPACES="${NACOS_NAMESPACES:-dev,prod}"
|
||
|
||
# Nacos 3.x: v1/v2 写接口已移除,配置发布走 v3 admin API
|
||
|
||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||
CONFIG_DIR="${CONFIG_DIR:-$SCRIPT_DIR}"
|
||
|
||
IFS=',' read -r -a NAMESPACES <<< "$NACOS_NAMESPACES"
|
||
|
||
if [[ -z "${NACOS_PASS:-}" ]]; then
|
||
read -rsp "请输入 Nacos 密码($NACOS_USER): " NACOS_PASS; echo
|
||
fi
|
||
|
||
# ---------- 登录 ----------
|
||
login() {
|
||
local resp
|
||
resp=$(curl -sf -m 10 -X POST "$NACOS_ADDR/nacos/v1/auth/login" \
|
||
-d "username=$NACOS_USER" -d "password=$NACOS_PASS") || {
|
||
echo "登录失败: $NACOS_ADDR (检查地址/账号/网络)" >&2
|
||
exit 1
|
||
}
|
||
ACCESS_TOKEN=$(echo "$resp" | sed -n 's/.*"accessToken":"\([^"]*\)".*/\1/p')
|
||
[[ -n "$ACCESS_TOKEN" ]] || { echo "未获取到 accessToken: $resp" >&2; exit 1; }
|
||
echo "登录成功: $NACOS_USER @ $NACOS_ADDR"
|
||
}
|
||
|
||
# ---------- 检查命名空间是否存在(接口不可用或解析失败时仅跳过检查,不阻断导入) ----------
|
||
check_namespaces() {
|
||
local resp ids ns
|
||
resp=$(curl -sf -m 10 "$NACOS_ADDR/nacos/v3/admin/core/namespace/list?pageNo=1&pageSize=100&accessToken=$ACCESS_TOKEN" || true)
|
||
[[ -z "$resp" ]] && return 0
|
||
ids=$(echo "$resp" | grep -o '"namespaceId":"[^"]*"' | sed 's/"namespaceId":"//;s/"$//' || true)
|
||
[[ -z "$ids" ]] && return 0
|
||
for ns in "${NAMESPACES[@]}"; do
|
||
if ! echo "$ids" | grep -qx "$ns"; then
|
||
echo " [警告] 命名空间 [$ns] 未在 Nacos 中找到,请先在控制台创建(命名空间 ID 需为 $ns)" >&2
|
||
fi
|
||
done
|
||
}
|
||
|
||
# ---------- 发布单个配置 ----------
|
||
publish() {
|
||
local ns="$1" file="$2" dataId resp
|
||
dataId=$(basename "$file")
|
||
resp=$(curl -sf -m 15 -X POST "$NACOS_ADDR/nacos/v3/admin/cs/config" \
|
||
--data-urlencode "dataId=$dataId" \
|
||
--data-urlencode "groupName=$GROUP" \
|
||
--data-urlencode "namespaceId=$ns" \
|
||
--data-urlencode "type=yaml" \
|
||
--data-urlencode "content@$file" \
|
||
--data-urlencode "accessToken=$ACCESS_TOKEN") || return 1
|
||
echo "$resp" | grep -q '"code":0'
|
||
}
|
||
|
||
# ---------- 主流程 ----------
|
||
[[ -d "$CONFIG_DIR" ]] || { echo "配置目录不存在: $CONFIG_DIR" >&2; exit 1; }
|
||
|
||
shopt -s nullglob
|
||
files=("$CONFIG_DIR"/*.yml)
|
||
shopt -u nullglob
|
||
[[ ${#files[@]} -gt 0 ]] || { echo "配置目录下没有 yml 文件: $CONFIG_DIR" >&2; exit 1; }
|
||
|
||
login
|
||
check_namespaces
|
||
|
||
total_fail=0
|
||
for ns in "${NAMESPACES[@]}"; do
|
||
echo ">>> 导入到命名空间: $ns (group=$GROUP)"
|
||
ok=0; fail=0
|
||
for file in "${files[@]}"; do
|
||
dataId=$(basename "$file")
|
||
if publish "$ns" "$file"; then
|
||
echo " [OK] $dataId"
|
||
ok=$((ok+1))
|
||
else
|
||
echo " [FAIL] $dataId" >&2
|
||
fail=$((fail+1))
|
||
fi
|
||
done
|
||
echo " 命名空间 $ns 完成: 成功 $ok, 失败 $fail"
|
||
total_fail=$((total_fail+fail))
|
||
done
|
||
|
||
echo
|
||
echo "全部完成: 命名空间 [$NACOS_NAMESPACES],失败总数 $total_fail"
|
||
[[ $total_fail -eq 0 ]]
|