From fb6499064f7560ce278e5a287402df2dd2115b9a Mon Sep 17 00:00:00 2001 From: adminer Date: Fri, 30 Jan 2026 00:21:16 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20consul-register?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- consul-register | 105 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 consul-register diff --git a/consul-register b/consul-register new file mode 100644 index 0000000..c6ff73e --- /dev/null +++ b/consul-register @@ -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 +