Добавить consul-register

This commit is contained in:
2026-01-30 00:21:16 +03:00
commit fb6499064f

105
consul-register Normal file
View File

@@ -0,0 +1,105 @@
#!/usr/bin/env bash
set -euo pipefail
# ────────────────────────────────────────────────────────────────────────────────
# Назначение: регистрация / deregistration сервиса SeaweedFS master в Consul
# Использование:
# seaweedfs-consul-register.sh register [SVC_NM] [port] [tags...]
# seaweedfs-consul-register.sh deregister [SVC_NM]
# ────────────────────────────────────────────────────────────────────────────────
CONSUL_ADDR="${CONSUL_HTTP_ADDR:-http://127.0.0.1:8500}"
CONSUL_ADDR="${CONSUL_ADDR:-http://consul.service.lan:8500}"
HOST_IP=""
for ip in $(hostname -I); do
# берём первую "нормальную" IP (не 127.0.0.1, не docker bridge и т.п.)
if [[ "$ip" =~ ^10\. || "$ip" =~ ^192\.168\. || "$ip" =~ ^172\.(1[6-9]|2[0-9]|3[0-1])\. ]]; then
HOST_IP="$ip"
break
fi
done
HOST_IP="${HOST_IP:-$(hostname -I | awk '{print $1}')}"
# ─── Параметры ───────────────────────────────────────────────────────────────────
ACTION="${1:-}"
SVC_NM="${2:-}"
SVC_PORT="${3:-}"
SVC_ID="${SVC_NM}_$(hostname)"
# Если переданы дополнительные теги
shift 3 2>/dev/null || true
TAGS=("$@")
if [[ ${#TAGS[@]} -eq 0 ]]; then
TAGS=("prod")
fi
# ─── Функции ─────────────────────────────────────────────────────────────────────
wait_for_consul_leader() {
for i in {1..20}; do
if curl -k -sf --connect-timeout 3 "${CONSUL_ADDR}/v1/status/leader" | grep -qE ':[0-9]+'; then
return 0
fi
sleep 1
done
echo "ERROR: Consul leader не появился за 20 секунд" >&2
return 1
}
register() {
wait_for_consul_leader || exit 10
local payload
payload="{
\"ID\": \"$SVC_ID\",
\"Name\": \"$SVC_NM\",
\"Tags\": $(printf '%s\n' "${TAGS[@]}" | awk '
BEGIN { printf "[" }
{
if (NR > 1) printf ","
printf "\"%s\"", $0
}
END { printf "]\n" }
'),
\"Address\": \"$HOST_IP\",
\"Port\": $SVC_PORT,
\"Check\": {
\"TCP\": \"$HOST_IP:$SVC_PORT\",
\"Interval\": \"20s\",
\"Timeout\": \"4s\",
\"DeregisterCriticalServiceAfter\": \"90s\"
}
}"
echo $payload
curl -sf -X PUT \
-H "Content-Type: application/json" \
-d "$payload" \
"${CONSUL_ADDR}/v1/agent/service/register" || {
echo "Ошибка регистрации сервиса в Consul" >&2
exit 11
}
echo "Сервис $SVC_NM ($SVC_ID) → $HOST_IP:$SVC_PORT успешно зарегистрирован"
}
deregister() {
curl -k -sf -X PUT "${CONSUL_ADDR}/v1/agent/service/deregister/$SVC_ID" || true
echo "Сервис $SVC_ID удалён из Consul (или уже отсутствовал)"
}
# ─── Main ────────────────────────────────────────────────────────────────────────
case "$ACTION" in
register)
register
;;
deregister)
deregister
;;
*)
echo "Использование:"
echo " $0 register [имя] [порт] [тег1 тег2 ...]"
echo " $0 deregister [имя]"
exit 1
;;
esac