Files
systemd_consul_register/consul-register

106 lines
4.0 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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