ctx: одна команда вместо 6+ для смены DevOps-окружения

Проблема, с которой сталкивается каждый DevOps-инженер

3 часа ночи. Прод упал. Нужно срочно разбираться.

Что вы делаете?

$ export AWS_PROFILE=production
$ kubectx production-cluster
$ kubectl config set-context --current --namespace=api
$ ssh -f -N -L 5432:db.prod:5432 bastion.prod
$ export VAULT_ADDR=https://vault.prod
$ # ... стоп, а какой профиль сейчас активен?

6+ команд. Каждый. Раз.

И это при условии, что вы их все правильно помните. Одна неверная команда в три ночи — и вы только что задеплоили не в тот кластер. Или хуже: случайно изменили прод с активными dev-кредами.

Почему kubectx недостаточно

Не поймите неправильно — kubectx отлично справляется со своей задачей. Но он решает лишь одну часть головоломки: контексты Kubernetes (Kubernetes contexts).

А что насчёт:

  • Учётных данных AWS/GCP/Azure?

  • SSH-туннелей до баз данных?

  • VPN-соединений?

  • Переменных окружения?

  • Токенов Vault?

  • Конфигураций пользователя Git?

  • Профилей браузера для SSO?

В итоге вы по-прежнему жонглируете 7+ разными инструментами и надеетесь, что они все остаются синхронизированными.

Знакомьтесь: ctx — одна команда для всего окружения

ctx рассматривает всё ваше DevOps-окружение как единый переключаемый контекст (switchable context):

$ ctx use production
⚠ Switching to PRODUCTION environment: production
Type 'yes' to confirm: yes
✓ AWS profile: production (us-east-1)
✓ Kubernetes: prod-cluster/default
✓ VPN connected: wireguard (wg0)
✓ Tunnel postgres: localhost:5432 → db.prod:5432
✓ Tunnel redis: localhost:6379 → cache.prod:6379
✓ Browser: Chrome (Production Profile)
✓ Environment variables loaded
✓ Secrets loaded from Vault
[ctx: production] $

Одна команда. Всё переключается.

Сравнение с другими инструментами

Посмотрим, как разные инструменты справляются с типичной мультиоблачной, многосредовой конфигурацией:

Функция kubectx direnv aws-vault ctx

Контекст Kubernetes

Мультиоблако (AWS/GCP/Azure)

Только AWS

Переменные окружения

SSH-туннели

Управление VPN

Защита production

Авто-получение K8s-кредов

Наследование контекстов

Интерполяция переменных

Управление секретами

Профили браузера

Быстрые ссылки на URL

Чем ctx отличается от остальных

1. Защита production (потому что вы в три ночи — опасный человек)

$ ctx use production
⚠ Switching to PRODUCTION environment: production
Type 'yes' to confirm: yes
✓ Context 'production' is now active.
⚠ You are now in PRODUCTION environment.

Вы должны сознательно хотеть попасть в прод. Больше никаких «ой, не тот кластер».

Тип окружения production требует явного подтверждения. Никаких флагов, никаких коротких путей — просто введите «yes», чтобы подтвердить, что вы действительно хотите получить доступ к производственной среде.

2. Автоматическое получение учётных данных Kubernetes от облачных провайдеров

ctx автоматически получает K8s-учётные данные при переключении контекстов:

# Конфиг контекста
kubernetes:
  context: my-cluster
  namespace: default
  eks:
    cluster: my-cluster
    region: us-west-2

При переключении ctx автоматически выполняет нужную команду:

  • EKS: aws eks update-kubeconfig --name <cluster> --region <region>

  • GKE: gcloud container clusters get-credentials <cluster> --zone <zone> --project <project>

  • AKS: az aks get-credentials --name <cluster> --resource-group <rg>

Больше никакого ручного обновления кредов. Всё работает само.

3. Наследование контекстов и интерполяция переменных для DRY-конфигов

Управляете 50 похожими кластерами? Объедините наследование с переменными:

# base-acme.yaml (абстрактная база)
name: acme-base
abstract: true
cloud: acme
kubernetes:
  context: "acme-${CLUSTER_NAME}-cluster"
  kubeconfig: "~/clusters/acme/${CLUSTER_NAME}/config"
env:
  API_URL: "https://api.${CLUSTER_NAME}.acme.com"
  CLUSTER: "${CLUSTER_NAME}"
# daisy.yaml (наследует базу + задаёт переменную)
name: daisy
extends: acme-base
env:
  CLUSTER_NAME: daisy
# eve.yaml (наследует базу + задаёт переменную)
name: eve
extends: acme-base
env:
  CLUSTER_NAME: eve

Два кластера. 8 строк суммарно. Переменные раскрываются после слияния при наследовании, поэтому можно ссылаться на них прямо в базовом конфиге.

4. SSH-туннели через бастион с автоматическим переподключением

Туннели, которые реально держатся, — все идут через ваш бастионный хост:

ssh:
  bastion:
    host: bastion.example.com
    user: deploy # по умолчанию $USER, если не задан
    port: 22
  tunnels:
    - name: postgres
      remote_host: db.internal
      remote_port: 5432
      local_port: 5432
      timeout: 10s # настраиваемый таймаут
    - name: redis
      remote_host: cache.internal
      remote_port: 6379
      local_port: 6379

Все туннели идут через бастион. ctx управляет жизненным циклом SSH-соединения. При переключении контекста старые туннели корректно завершаются. Никаких осиротевших SSH-процессов.

$ ctx tunnel list
Active tunnels for context 'staging':
  postgres: localhost:5432 → db.internal:5432 (PID: 12345)
  redis: localhost:6379 → cache.internal:6379 (PID: 12346)
$ ctx tunnel down postgres
✓ Tunnel 'postgres' stopped
$ ctx tunnel up postgres
✓ Tunnel 'postgres' started

Если локальный порт уже занят, ctx обнаружит конфликт и сообщит об этом.

5. Секреты из множества хранилищ

Получайте секреты из любого поддерживаемого менеджера:

secrets:
  # Bitwarden
  bitwarden:
    DB_PASSWORD: "Production DB#password"
    API_KEY: "Production API Key"
  # 1Password
  onepassword:
    SMTP_PASSWORD: "SendGrid#password"
  # HashiCorp Vault
  vault:
    CONSUL_TOKEN: "operations/consul#http_token"
    NOMAD_TOKEN: "operations/nomad#token"
  # AWS Secrets Manager
  aws_secrets_manager:
    DATADOG_API_KEY: "prod/datadog#api_key"
  # AWS SSM Parameter Store
  aws_ssm:
    DATABASE_URL: "/prod/database/url"
  # GCP Secret Manager
  gcp_secret_manager:
    SENTRY_DSN: "prod-sentry-dsn"
# Конфиги хранилищ
bitwarden:
  auto_login: true
vault:
  address: https://vault.prod.internal
  namespace: operations

При переключении контекста ctx получает все настроенные секреты и экспортирует их как переменные окружения. Никаких захардкоженных кредов.

Все хранилища секретов поддерживают автоматическую аутентификацию:

  • Bitwarden: автовход с поддержкой SSO (org_identifier)

  • 1Password: биометрическая/системная аутентификация

  • Vault: управление токенами с авторефрешем

  • AWS: SSO, интеграция с aws-vault

  • GCP: аутентификация через gcloud с SSO

  • Azure: аутентификация через az CLI с SSO

6. Поддержка VPN (OpenVPN, WireGuard, Tailscale)

Автоматическое подключение к VPN при переключении контекста:

# OpenVPN
vpn:
  openvpn:
    config: /etc/openvpn/production.ovpn
    auth_file: /etc/openvpn/auth.txt
# WireGuard
vpn:
  wireguard:
    interface: wg0
    config: /etc/wireguard/prod.conf
# Tailscale
vpn:
  tailscale:
    network: prod-network
# Произвольная команда
vpn:
  command: /usr/local/bin/connect-prod-vpn.sh

VPN подключается автоматически при активации контекста и отключается при его деактивации.

7. Профили браузера (Chrome и Firefox)

Запускайте нужный профиль браузера для каждого контекста:

browser:
  type: chrome
  profile: Production Profile # имя профиля Chrome
# Или Firefox
browser:
  type: firefox
  profile: work-prod # имя профиля Firefox

Идеально для SSO-сценариев. Каждый контекст может иметь свой профиль браузера с сохранёнными кредами, куками и сессиями.

$ ctx open https://console.aws.amazon.com
# Открывает URL в Chrome с профилем "Production Profile"

8. Поддержка нескольких облаков

Бесшовное переключение между AWS, GCP и Azure:

# Контекст AWS
aws:
  profile: myapp-prod
  region: us-east-1
  sso: true
# Контекст GCP
gcp:
  project: myapp-prod
  region: us-central1
  zone: us-central1-a
# Контекст Azure
azure:
  subscription: myapp-prod
  tenant: 12345-abcde
  resource_group: production

Один интерфейс. Множество облаков.

9. Быстрые ссылки на контекстно-зависимые URL

Храните часто используемые URL для каждого контекста:

urls:
  dashboard: https://grafana.prod.internal/d/prod-overview
  logs: https://kibana.prod.internal/app/logs
  console: https://console.aws.amazon.com
  docs: https://docs.prod.internal

Быстрый доступ к ним:

$ ctx open dashboard
# Открывает https://grafana.prod.internal/d/prod-overview в браузере контекста
$ ctx open logs
# Открывает https://kibana.prod.internal/app/logs

Идеально для организации всех ссылок на прод в одном месте с учётом контекста.

10. Разумные значения по умолчанию

Не указали пользователя SSH? ctx возьмёт системного пользователя — так же, как это делает сам SSH:

ssh:
  bastion:
    host: bastion.internal
    # user: по умолчанию $USER
    port: 22

Команды могут делиться базовыми контекстами без захардкоженных имён пользователей. Каждый автоматически использует своё имя.

Примеры из реальной жизни

Переключение между несколькими окружениями

$ ctx list
NAME             ENVIRONMENT   CLOUD   ORCHESTRATION
myapp-dev        development   aws     kubernetes
myapp-staging    staging       aws     kubernetes
myapp-prod       production    aws     kubernetes
$ ctx use myapp-staging
✓ Context 'staging' is now active
$ ctx use myapp-prod
⚠ Type 'yes' to confirm: yes
✓ Context 'production' is now active

Консультант с несколькими клиентами

Ведёте 10 клиентов с разными облаками, кластерами и инструментами?

$ ctx list
NAME              ENVIRONMENT   CLOUD   ORCHESTRATION
client-a-prod     production    aws     kubernetes
client-b-prod     production    gcp     kubernetes
client-c-staging  staging       azure   nomad
$ ctx use client-b-prod
⚠ Type 'yes' to confirm: yes
✓ GCP project: client-b-production
✓ GKE cluster: prod-cluster-eu
✓ VPN connected

Никакой путаницы. Никаких ошибок.

Реагирование на инцидент в 3 ночи

[03:42] ALERT: Production API down!
[03:43] $ ctx use api-prod
[03:43] ⚠ Type 'yes' to confirm: yes
[03:43] ✓ AWS profile: production
[03:43] ✓ Kubernetes: prod-cluster/api
[03:43] ✓ VPN connected
[03:43] ✓ Tunnels connected
[03:43] ✓ Secrets loaded
[03:44] $ kubectl get pods
[03:44] # Отладка и исправление...
[03:56] $ kubectl apply -f hotfix.yaml
[03:56] ✓ Incident resolved
[03:57] $ ctx deactivate
[03:57] ✓ Safely exited production

Под давлением. Без ошибок. Быстро.

Как это работает

ctx — это единый бинарник на Go без каких-либо зависимостей. Он читает YAML-конфиги из ~/.config/ctx/contexts/:

name: myapp-prod
description: "MyApp Production"
environment: production
aws:
  profile: prod
  region: us-west-2
kubernetes:
  context: prod-cluster
  namespace: default
  eks:
    cluster: prod-cluster
    region: us-west-2
ssh:
  bastion:
    host: bastion.prod.internal
    user: deploy
  tunnels:
    - name: postgres
      remote_host: db.internal
      remote_port: 5432
      local_port: 5432
vpn:
  wireguard:
    interface: wg0
    config: /etc/wireguard/prod.conf
browser:
  type: chrome
  profile: Production
urls:
  dashboard: https://grafana.prod.internal
  console: https://console.aws.amazon.com
  logs: https://kibana.prod.internal
secrets:
  vault:
    NOMAD_TOKEN: "operations/nomad#token"
env:
  API_URL: https://api.prod.example.com
  LOG_LEVEL: info

Когда вы запускаете ctx use myapp-prod, инструмент:

  • Получает K8s-учётные данные от AWS (если настроено)

  • Переключает профиль AWS

  • Переключает контекст и namespace Kubernetes

  • Подключает VPN

  • Устанавливает SSH-соединение с бастионом

  • Запускает SSH-туннели через бастион

  • Получает секреты из Vault/Bitwarden/и т.д.

  • Экспортирует переменные окружения

  • Активирует быстрые ссылки на URL

  • Обновляет приглашение командной строки

Одна команда. Всё переключается.

Начало работы

Установка

# macOS / Linux
curl -fsSL https://github.com/vlebo/ctx/releases/latest/download/install.sh | sh

Интеграция с оболочкой

Добавьте в ~/.zshrc или ~/.bashrc:

eval "$(ctx shell-hook zsh)"  # для Zsh
eval "$(ctx shell-hook bash)" # для Bash

Создайте первый контекст

ctx init my-dev

Или создайте ~/.config/ctx/contexts/my-dev.yaml вручную:

name: my-dev
environment: development
aws:
  profile: dev
  region: us-west-2
kubernetes:
  context: dev-cluster
  namespace: default
env:
  API_URL: https://api.dev.example.com

Переключитесь

ctx use my-dev

Всё готово.

ctx против всех остальных

Набор инструментов Необходимо команд Защита production Командное использование

kubectx + aws-vault + свои скрипты

6+ команд

❌ Нет

❌ Нет

direnv + kubectx + aws-vault

3–4 команды

❌ Нет

⚠️ Только Git

ctx

1 команда

✅ Да

✅ Да (скоро)

ctx не просто заменяет один инструмент — он заменяет весь ваш рабочий процесс переключения контекстов.

Коротко о главном

ctx объединяет:

  • ✅ Интерполяцию переменных (${VAR} в конфигах)

  • ✅ Авто-получение K8s-кредов из EKS/GKE/AKS

  • ✅ Дополнительный параметр cloud для нестандартных провайдеров

  • ✅ Наследование контекстов для устранения дублирования

  • ✅ Защиту production-окружений

  • ✅ Поддержку нескольких облаков (AWS/GCP/Azure) с SSO

  • ✅ Управление VPN (OpenVPN/WireGuard/Tailscale)

  • ✅ SSH-туннели через бастион

  • ✅ Секреты из 6 хранилищ с автоаутентификацией

  • ✅ Переключение профилей браузера (Chrome/Firefox)

  • ✅ Быстрые ссылки на дашборды и консоли

  • ✅ Настройку пользователя Git

Что дальше?

Дорожная карта на 2026 год:

  • Q2 2026:

    • ✅ Наследование контекстов и интерполяция переменных

    • ✅ Авто-получение K8s-кредов

    • 🚧 Zsh-плагин с автодополнением

    • 🚧 Интеграция с GitHub Actions

  • Q3 2026:

    • ctx-cloud для командного обмена контекстами

    • Веб-интерфейс для управления контекстами

    • Интеграция с Docker context

    • Плагинная система для кастомных интеграций

Скоро: ctx-cloud

Командный обмен контекстами и централизованное управление:

$ ctx cloud login https://ctx-cloud-url
$ ctx cloud sync production
✓ Context 'production' synced

Возможности:

  • Командный обмен контекстами

  • Журналы аудита

  • Веб-интерфейс

  • Интеграция SAML/SSO

  • Централизованное управление секретами

Бета — в Q3 2026. Активная разработка идёт прямо сейчас. Поставьте звезду репозиторию, чтобы не пропустить обновления!

Попробуйте прямо сейчас

curl -fsSL https://github.com/vlebo/ctx/releases/latest/download/install.sh | sh

Пробовали ctx? Как вы сейчас переключаете контексты? Расскажите в комментариях!

Оказалось полезным? ⭐ Поставьте звезду репозиторию: github.com/vlebo/ctx

Логотип сообщества DEV
© 2026 meganuke