nomctx icon indicating copy to clipboard operation
nomctx copied to clipboard

Faster way to switch between clusters and namespaces in nomad

nomctx

Faster way to switch between Nomad clusters and namespaces. Inspired from kubectx.

nomctx demo GIF

Why was this created

If you're operating multiple Nomad clusters, switching between these clusters is a cumbersome task of exporting variables in shell. Ideally nomad, should use a file similar to ~/.kube/config for authenticating against multiple clusters as described in this issue. Since this feature isn't available as of yet, I've created nomctx which can emit the environment-variables required by nomad CLI for authentication.

Installation

  • Binaries: Releases.
  • Go: go install github.com/mr-karan/nomctx@latest

To run:

$ nomctx

By default nomctx searches for the file in ~/.nomctx/config.hcl but you can override that with --config=</path/to/config.hcl> flag.

Usage

NAME:
   nomctx - Faster way to switch across multiple Nomad clusters and namespaces

USAGE:
   nomctx [global options] command [command options] 

VERSION:
   v0.2.3 (Commit: 2023-12-05 13:09:16 +0530 (ff9fe08), Build: 2024-01-30 21:06:48 +0530)

COMMANDS:
   list-clusters     List all clusters
   list-namespaces   List all namespaces
   set-cluster       Set the current cluster context
   set-namespace     Set namespace
   switch-cluster    Switch cluster
   switch-namespace  Switch namespace
   current-context   Display the current context
   login             Login to a cluster
   add-cluster       Add a new cluster to the config
   help, h           Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --config value  Path to a config file to load. (default: "/Users/karan/.nomctx/config.hcl")
   --help, -h      show help
   --version, -v   print the version

Interactive Mode

If you have fzf installed, the tool will show an interactive prompt for switching clusters or namespace.

nomctx cluster img

nomctx namespace img

Login with SSO

If you've configured authentication with SSO, you can use login command to login to a cluster. This will open a browser window where you can authenticate with your SSO provider.

By default, nomctx will login to the active cluster set in the config file. If you want to login to a specific cluster, use --cluster=<cluster-name> flag.

# Login to the active cluster
nomctx login
# or specify a cluster
nomctx login --cluster=dev

# Persist the session token to a file in `~/.nomctx/<cluster>.env`
nomctx login --cluster=dev --persist

See Persist variables section for more details on how to persist the Nomad session tokens to a file.

Non Interactive Mode

If you don't have fzf, you can use switch manually with set-cluster=<> and set-namespace=<> commands.

List all clusters

nomctx list-clusters
local
bangalore
tokyo
paris
singapore

List all namespaces

nomctx list-namespaces
homelab
uat
qa
default

Set a cluster

nomctx set-cluster bangalore
export NOMAD_ADDR=http://10.0.0.1:4646
export NOMAD_TOKEN=f8cb5774-749a-4548-acc9-054df3b52e83
export NOMAD_HTTP_AUTH=user:pass
export NOMAD_NAMESPACE=pink

Set a namespace

nomctx set-namespace=uat    
export NOMAD_NAMESPACE=uat

View current context

$ nomctx current-context
Cluster: local
Namespace: default

Add a Cluster

nomctx add-cluster --cluster=<name> [--addr=<address>] [--token=<token>] [--namespace=<namespace>] [--region=<region>] [--auth-method=<method>]

The add-cluster command allows you to add a new cluster configuration to your nomctx setup. This command is useful for managing multiple Nomad clusters, enabling you to switch between them easily.

Parameters

  • --cluster: (Required) Name of the new cluster.
  • --addr: (Required) Address of the cluster (e.g., http://127.0.0.1:4646).
  • --token: (Optional) Access token for the cluster.
  • --namespace: (Optional) Default namespace for the cluster.
  • --region: (Optional) Region of the cluster.
  • --auth-method: (Optional) Authentication method for the cluster (e.g., "github").

Examples

Add a new cluster named my-cluster:

nomctx add-cluster --cluster="my-cluster" --addr="http://10.0.0.5:4646"

Add a new cluster with complete details:

nomctx add-cluster --cluster="my-cluster" --addr="http://10.0.0.5:4646" --token="abcd1234" --namespace="default" --region="us-west" --auth-method="github"

Notes

  • The new cluster configuration is appended to the existing ~/.nomctx/config.hcl file.
  • Ensure the cluster name is unique to avoid conflicts in the configuration.

Persist variables

With --persist flag, you can persist the environment variables to a file. This is useful if you want to use the variables in a script. The variables are written to ~/.nomctx/<cluster>.env file.

nomctx set-cluster --persist dev

# You can see the env variables are written to the file.
cat ~/.nomctx/dev.env
NOMAD_ADDR=http://127.0.0.1:4646
NOMAD_NAMESPACE=default

Set variables on shell

You can use eval to directly set the environment variables on shell. This works with both the interactive and non-interactive modes.

For eg, to switch a cluster in interactive mode and set the env vars on shell:

eval $(nomctx)

# You can see the env variables are automatically exported on shell.
env | grep NOMAD_
NOMAD_ADDR=http://10.0.0.1:4646
NOMAD_TOKEN=c0a7d714-46df-4c6e-954a-269578c3804d
NOMAD_NAMESPACE=pink
NOMAD_HTTP_AUTH=user:pass
NOMAD_REGION=paris

Configuration

Here's a sample config file which shows 2 clusters: dev and prod:

cluster "dev" {
  address   = "http://127.0.0.1:4646"
  namespace = "default"
}

cluster "uat" {
  address = "https://nomad.hashicorp.rocks"
  auth {
    method   = "gitlab"
    provider = "nomad"
  }
}

cluster "prod" {
  address   = "http://10.0.0.3:4646"
  namespace = "blue"
  region    = "blr"
  token     = "f8cb5774-749a-4548-acc9-054df3b52e83"
}

LICENSE

See LICENSE