106 lines
4.0 KiB
Bash
106 lines
4.0 KiB
Bash
#!/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
|
||
|