Add wild-cluster-node-ip
script.
This commit is contained in:
180
bin/wild-cluster-node-ip
Executable file
180
bin/wild-cluster-node-ip
Executable file
@@ -0,0 +1,180 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
set -o pipefail
|
||||
|
||||
# Usage function
|
||||
usage() {
|
||||
echo "Usage: wild-cluster-node-ip <node-name> [options]"
|
||||
echo ""
|
||||
echo "Get the current IP address of a cluster node by name."
|
||||
echo ""
|
||||
echo "Arguments:"
|
||||
echo " node-name Name of the node to get IP for"
|
||||
echo ""
|
||||
echo "Options:"
|
||||
echo " --from-config Get IP from local config.yaml"
|
||||
echo " --from-talosctl Get IP from Talos API"
|
||||
echo " Default: Query Kubernetes API (kubectl)"
|
||||
echo " -h, --help Show this help message"
|
||||
echo ""
|
||||
echo "Examples:"
|
||||
echo " wild-cluster-node-ip control-1"
|
||||
echo " wild-cluster-node-ip worker-1"
|
||||
echo " wild-cluster-node-ip control-2 --from-config"
|
||||
echo " wild-cluster-node-ip worker-2 --from-talosctl"
|
||||
echo ""
|
||||
echo "This script will:"
|
||||
echo " - Query the specified source for the node's IP address"
|
||||
echo " - Return only the internal IP address or exit with error if not found"
|
||||
echo ""
|
||||
echo "Requirements:"
|
||||
echo " - Must be run from a Wild Cloud directory"
|
||||
echo " - kubectl and/or talosctl must be configured for cluster access"
|
||||
}
|
||||
|
||||
# Parse arguments
|
||||
NODE_NAME=""
|
||||
SOURCE="kubectl"
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
--from-config)
|
||||
SOURCE="config"
|
||||
shift
|
||||
;;
|
||||
--from-talosctl)
|
||||
SOURCE="talosctl"
|
||||
shift
|
||||
;;
|
||||
-h|--help)
|
||||
usage
|
||||
exit 0
|
||||
;;
|
||||
-*)
|
||||
echo "Unknown option $1"
|
||||
usage
|
||||
exit 1
|
||||
;;
|
||||
*)
|
||||
if [ -z "$NODE_NAME" ]; then
|
||||
NODE_NAME="$1"
|
||||
else
|
||||
echo "Unexpected argument: $1"
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Check if node name was provided
|
||||
if [ -z "$NODE_NAME" ]; then
|
||||
echo "Error: Node name is required"
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Initialize Wild Cloud environment
|
||||
if [ -z "${WC_ROOT}" ]; then
|
||||
echo "Error: WC_ROOT is not set" >&2
|
||||
exit 1
|
||||
else
|
||||
source "${WC_ROOT}/scripts/common.sh"
|
||||
init_wild_env
|
||||
fi
|
||||
|
||||
# Function to get IP from config.yaml
|
||||
get_ip_from_config() {
|
||||
local node_name="$1"
|
||||
local ip
|
||||
|
||||
ip=$(yq eval ".cluster.nodes.active.\"${node_name}\".currentIp" "${WC_HOME}/config.yaml" 2>/dev/null || echo "")
|
||||
|
||||
if [ -n "$ip" ] && [ "$ip" != "null" ]; then
|
||||
echo "$ip"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to get IP from kubectl
|
||||
get_ip_from_kubectl() {
|
||||
local node_name="$1"
|
||||
local ip
|
||||
|
||||
# Check if kubectl is available and configured
|
||||
if ! command -v kubectl >/dev/null 2>&1; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Try to get node info from kubectl
|
||||
if ! kubectl get nodes "$node_name" >/dev/null 2>&1; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Get internal IP address
|
||||
ip=$(kubectl get node "$node_name" -o jsonpath='{.status.addresses[?(@.type=="InternalIP")].address}' 2>/dev/null || echo "")
|
||||
|
||||
if [ -n "$ip" ]; then
|
||||
echo "$ip"
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to get IP from talosctl
|
||||
get_ip_from_talosctl() {
|
||||
local node_name="$1"
|
||||
local ip
|
||||
|
||||
# Check if talosctl is available and configured
|
||||
if ! command -v talosctl >/dev/null 2>&1; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Try to get node info from talosctl
|
||||
if talosctl get members >/dev/null 2>&1; then
|
||||
# Find the specific node and get its first IP address
|
||||
ip=$(talosctl get members -o json 2>/dev/null | jq -r --arg hostname "$node_name" 'select(.spec.hostname == $hostname) | .spec.addresses[0]' 2>/dev/null | grep -v "null" | head -n1 || echo "")
|
||||
|
||||
if [ -n "$ip" ]; then
|
||||
echo "$ip"
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
|
||||
# Main logic
|
||||
case $SOURCE in
|
||||
config)
|
||||
if ip=$(get_ip_from_config "$NODE_NAME"); then
|
||||
echo "$ip"
|
||||
else
|
||||
echo "Error: Node $NODE_NAME not found in config.yaml or no currentIp set" >&2
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
kubectl)
|
||||
if ip=$(get_ip_from_kubectl "$NODE_NAME"); then
|
||||
echo "$ip"
|
||||
else
|
||||
echo "Error: Could not get IP for node $NODE_NAME via kubectl" >&2
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
talosctl)
|
||||
if ip=$(get_ip_from_talosctl "$NODE_NAME"); then
|
||||
echo "$ip"
|
||||
else
|
||||
echo "Error: Could not get IP for node $NODE_NAME via talosctl" >&2
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
esac
|
Reference in New Issue
Block a user