Tenv — лучший менеджер версий для Terraform и экосистемы: избавьтесь от хаоса с инструментами IaC

Tenv — лучший менеджер версий для Terraform и экосистемы: избавьтесь от хаоса с инструментами IaC

Если вы когда-нибудь работали с Terraform дольше пары месяцев, наверняка сталкивались с ситуацией, когда приходилось одновременно поддерживать несколько проектов на разных версиях. И тут начинается классический танец с бубном: скачал одну версию, поработал, удалил, скачал другую... А ещё Terragrunt хочет свою версию, а инструменты вроде Terrascan или Infracost — свои. В какой-то момент ваш ~/Downloads превращается в кладбище разнокалиберных бинарников, а вы забываете, какую версию куда положили. Знакомо? Тогда давайте знакомиться с tenv — инструментом, который решает эту головную боль раз и навсегда.

Что такое tenv и почему он вам нужен

Tenv — это универсальный менеджер версий для инструментов из экосистемы Terraform, вдохновлённый такими решениями как pyenv, nvm и rbenv. По сути, это элегантная обёртка вокруг процесса скачивания, установки и переключения между разными версиями Terraform и сопутствующих инструментов.

Представьте ситуацию: вы работаете над тремя проектами одновременно. Первый — старый корпоративный монстр на Terraform 0.12, второй — относительно свежий на 1.0, а третий — совсем новый на 1.5. Без специального инструмента вам придётся постоянно жонглировать бинарниками, переименовывать файлы или использовать сложные алиасы. С tenv же всё гораздо проще — одна команда, и вы переключились на нужную версию.

Но это ещё не всё. Tenv умеет управлять не только версиями самого Terraform, но и множеством других инструментов:

  • Terraform — собственно, сам Terraform
  • Terragrunt — обёртка над Terraform для DRY-конфигураций
  • Terrascan — сканер безопасности для IaC
  • Infracost — калькулятор стоимости инфраструктуры
  • Terraform-docs — генератор документации
  • TFLint — линтер для конфигураций Terraform
  • И другие смежные инструменты

Удобно? Безусловно. Особенно когда в вашей команде десять человек с десятью разными проектами и постоянной головной болью от несовместимостей.

Установка tenv: быстрый старт

Установка tenv не займёт много времени — всего несколько команд, и вы готовы к работе. В зависимости от вашей операционной системы, есть несколько способов установки.

Установка на Linux и macOS

Самый простой способ — использовать скрипт автоматической установки:

curl -sSL https://raw.githubusercontent.com/tofuutils/tenv/main/install.sh | bash

Если вы предпочитаете более контролируемую установку, можно сделать это вручную:

git clone https://github.com/tofuutils/tenv.git ~/.tenv
 echo 'export PATH="$HOME/.tenv/bin:$PATH"' >> ~/.bashrc
 echo 'eval "$(tenv init -)"' >> ~/.bashrc
 source ~/.bashrc

Для пользователей macOS с Homebrew установка ещё проще:

brew tap tofuutils/tap
 brew install tenv

Установка на Windows

Для Windows рекомендуется использовать WSL (Windows Subsystem for Linux) и следовать инструкциям для Linux. Альтернативно, можно использовать Chocolatey:

choco install tenv

После установки проверьте, что всё работает правильно:

tenv --version

Если вы видите номер версии — отлично, можно двигаться дальше!

Базовые команды tenv: начинаем работу

Теперь, когда tenv установлен, давайте разберёмся с основными командами. Честно говоря, если вы уже использовали что-то вроде pyenv или nvm, то интерфейс покажется вам очень знакомым.

Установка версий Terraform

Чтобы увидеть список доступных версий Terraform:

tenv list-remote terraform

Это выведет длиииинный список всех версий, когда-либо выпущенных HashiCorp. Не пугайтесь — вам нужны только некоторые из них. Установить конкретную версию можно так:

tenv install terraform 1.5.7

Если вы хотите установить последнюю стабильную версию, просто укажите "latest":

tenv install terraform latest

А вот тут начинается магия — вы можете установить несколько версий и переключаться между ними в любой момент!

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

Чтобы увидеть, какие версии у вас уже установлены:

tenv list terraform

Для переключения на конкретную версию глобально:

tenv use terraform 1.4.6

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

cd ~/projects/legacy-infrastructure
 tenv local terraform 0.12.31

Эта команда создаст файл .terraform-version в текущей директории, и tenv автоматически будет переключаться на указанную версию, когда вы входите в эту директорию. Никаких ручных переключений!

Я обычно устанавливаю разные версии для разных клиентов — один проект на Terraform 1.0, другой на 1.5, и tenv автоматически переключается между ними, когда я перехожу из директории в директорию. Как по мне, это настоящее спасение от хаоса.

Продвинутые функции: больше, чем просто Terraform

Одно из главных преимуществ tenv — поддержка не только Terraform, но и всей экосистемы инструментов вокруг него. Давайте посмотрим, как работать с другими инструментами.

Управление Terragrunt

Установка и управление версиями Terragrunt работает точно так же, как и с Terraform:

tenv list-remote terragrunt
 tenv install terragrunt 0.50.0
 tenv use terragrunt 0.50.0

Аналогично можно создать файл .terragrunt-version для проектов:

tenv local terragrunt 0.45.0

Другие поддерживаемые инструменты

Tenv поддерживает впечатляющий список инструментов. Вот некоторые из них:

  • terrascan: tenv install terrascan 1.18.0
  • infracost: tenv install infracost 0.10.28
  • terraform-docs: tenv install terraform-docs 0.16.0
  • tflint: tenv install tflint 0.47.0

Для меня особенно полезным оказалось управление версиями Terragrunt — часто проекты требуют специфическую совместимость между Terraform и Terragrunt, и tenv делает эту проблему несуществующей.

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

Одна из самых крутых функций tenv — автоматическое определение нужной версии из файлов проекта. Если в директории есть файл .terraform-version или .terragrunt-version, tenv автоматически переключится на указанную там версию.

Это особенно удобно при командной работе — вы фиксируете требуемую версию в репозитории, и каждый член команды автоматически использует правильную версию. Никаких больше сообщений в Slack вроде "А на какой версии мы этот проект запускаем?"

Интеграция с CI/CD: автоматизация всего и вся

Если вы используете CI/CD для своих инфраструктурных проектов (а кто сейчас этого не делает?), tenv может стать важной частью пайплайна. Вот как можно интегрировать его в популярные CI/CD системы.

GitHub Actions

Для GitHub Actions можно создать simple workflow:

name: Terraform Plan
 
 on:
   pull_request:
     branches: [ main ]
 
 jobs:
   terraform:
     runs-on: ubuntu-latest
     steps:
       - uses: actions/checkout@v3
       
       - name: Setup tenv
         run: |
           curl -sSL https://raw.githubusercontent.com/tofuutils/tenv/main/install.sh | bash
           echo 'export PATH="$HOME/.tenv/bin:$PATH"' >> $GITHUB_ENV
           echo 'eval "$(tenv init -)"' >> $GITHUB_ENV
           
       - name: Install required versions
         run: |
           tenv install terraform $(cat .terraform-version)
           tenv install terragrunt $(cat .terragrunt-version)
           
       - name: Terraform Init and Plan
         run: |
           terragrunt plan

Таким образом, ваш CI будет использовать именно те версии инструментов, которые указаны в проекте. Никаких сюрпризов и расхождений между локальной и CI средой!

GitLab CI

Для GitLab CI настройка похожа:

terraform_plan:
   image: alpine:latest
   stage: plan
   script:
     - apk add --no-cache curl git bash
     - curl -sSL https://raw.githubusercontent.com/tofuutils/tenv/main/install.sh | bash
     - export PATH="$HOME/.tenv/bin:$PATH"
     - eval "$(tenv init -)"
     - tenv install terraform $(cat .terraform-version)
     - tenv install terragrunt $(cat .terragrunt-version)
     - terragrunt plan

Я когда-то потратил два дня на отладку странного бага в пайплайне, пока не понял, что локально использую Terraform 1.3, а CI использует 1.2. С тех пор везде внедряю tenv как стандарт. Поверьте, это экономит нервы и время.

Подводные камни и ограничения

Конечно, идеальных инструментов не бывает, и у tenv тоже есть свои нюансы. Давайте честно поговорим о потенциальных проблемах.

Производительность на больших проектах

Если у вас очень много установленных версий и очень большой проект с множеством вложенных директорий, автоматическое определение версии может немного замедлить работу оболочки. В большинстве случаев это незаметно, но если вы заметили задержки, можно оптимизировать конфигурацию:

tenv config autoswitch off

И включать автопереключение только когда нужно:

tenv config autoswitch on

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

Tenv отлично работает с bash и zsh, но если вы используете экзотические оболочки, могут потребоваться дополнительные настройки. Официальная документация содержит инструкции для большинства популярных оболочек.

Управление плагинами Terraform

Tenv не управляет версиями плагинов Terraform — этим занимается сам Terraform через файл .terraform.lock.hcl. Но управление версиями самого Terraform уже решает большую часть проблем совместимости.

Я однажды попытался вручную управлять версиями провайдеров... Это был тот случай, когда пожалеешь, что вообще занялся DevOps. К счастью, современный Terraform с lock-файлами решает эту проблему гораздо элегантнее.

Альтернативы tenv: сравнительный анализ

Разумеется, tenv — не единственный инструмент для управления версиями Terraform. Давайте сравним его с другими популярными решениями.

tfenv

Tfenv — более старое и распространённое решение, но оно управляет только версиями самого Terraform. Если вам нужно управлять только Terraform, tfenv вполне подойдёт, но если вы используете более широкий стек инструментов, tenv предлагает более комплексное решение.

Синтаксис tfenv очень похож:

tfenv install 1.5.7
 tfenv use 1.5.7

asdf

Asdf — универсальный менеджер версий для множества языков и инструментов, включая Terraform через плагины. Преимущество asdf в том, что вы можете управлять версиями практически всего: Node.js, Python, Ruby, Java и т.д.

Однако для управления именно экосистемой Terraform tenv предлагает более специализированное и удобное решение с лучшей интеграцией.

Docker-контейнеры

Некоторые команды предпочитают запускать Terraform и смежные инструменты в Docker-контейнерах:

docker run -it --rm -v $(pwd):/workspace -w /workspace hashicorp/terraform:1.5.7 plan

Это решение изолированное и воспроизводимое, но довольно громоздкое для ежедневного использования и требует постоянного доступа к Docker.

Честно говоря, после тестирования всех этих вариантов, я остановился на tenv из-за его универсальности и простоты. Особенно когда работаешь с несколькими разными клиентами, каждый со своим стеком и требованиями — единый инструмент для всего просто спасает.

Заключение: стоит ли внедрять tenv в вашу команду

После нескольких месяцев использования tenv в реальных проектах могу с уверенностью сказать — да, это тот редкий инструмент, который действительно упрощает жизнь, а не добавляет новые проблемы.

Основные преимущества tenv:

  • Единый интерфейс для управления всей экосистемой Terraform
  • Простота установки и использования
  • Автоматическое переключение между версиями
  • Отличная интеграция с CI/CD
  • Активная поддержка и разработка

Если ваша команда регулярно работает с Terraform, особенно с несколькими проектами на разных версиях, внедрение tenv может значительно упростить рабочий процесс и снизить количество ошибок, связанных с несовместимостью версий.

А для тех, кто только начинает свой путь с инфраструктурой как код, tenv может стать надёжным помощником, позволяющим экспериментировать с разными версиями и инструментами без риска испортить рабочее окружение.

И напоследок — личный совет: потратьте полчаса на настройку tenv сегодня, и вы сэкономите дни фрустрации в будущем. Как говорят в мире DevOps: "Автоматизируй всё, что делаешь больше двух раз". Управление версиями — определённо одна из таких задач!

Полезные ссылки:

Alt text
Обращаем внимание, что все материалы в этом блоге представляют личное мнение их авторов. Редакция SecurityLab.ru не несет ответственности за точность, полноту и достоверность опубликованных данных. Вся информация предоставлена «как есть» и может не соответствовать официальной позиции компании.

CTO Conf X — закрытая конференция только для технических директоров. Никакой случайной аудитории!

Практические кейсы от опытных экспертов.Только реальные истории и работающие подходы!.

Реклама.18+. ООО «Конференции Олега Бунина», ИНН 7733863233


Юрий Кочетов

Здесь я делюсь своими не самыми полезными, но крайне забавными мыслями о том, как устроен этот мир. Если вы устали от скучных советов и правильных решений, то вам точно сюда.