Добавить consul-register
This commit is contained in:
105
consul-register
Normal file
105
consul-register
Normal 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
|
||||||
|
|
||||||
Reference in New Issue
Block a user