Добавить 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