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
|
|
|