Si alguna vez ha trabajado con Terraform por más de un par de meses, seguramente se habrá encontrado con la situación de tener que mantener varios proyectos en diferentes versiones a la vez. Empieza entonces el baile clásico: descarga una versión, trabajas, la eliminas, descargas otra... Además Terragrunt quiere su versión, y herramientas como Terrascan o Infracost las suyas. En algún momento su ~/Downloads se convierte en un cementerio de binarios de distintos tamaños y olvida qué versión colocó en cada sitio. ¿Le suena? Entonces conozcamos tenv — la herramienta que resuelve este dolor de cabeza de una vez por todas.
Qué es tenv y por qué lo necesita
tenv es un gestor de versiones universal para herramientas del ecosistema de Terraform, inspirado en soluciones como pyenv, nvm y rbenv. En esencia, es una envoltura elegante alrededor del proceso de descarga, instalación y cambio entre distintas versiones de Terraform y de las herramientas relacionadas.
Piense en esta situación: trabaja en tres proyectos a la vez. El primero es un monstruo corporativo antiguo en Terraform 0.12, el segundo es relativamente reciente en 1.0, y el tercero es nuevo en 1.5. Sin una herramienta específica tendría que estar siempre manejando binarios, renombrando archivos o usando alias complejos. Con tenv todo es mucho más sencillo: un comando y cambia a la versión que necesita.
Pero eso no es todo. tenv no solo gestiona versiones de Terraform, sino también de muchas otras herramientas:
- Terraform — el propio Terraform
- Terragrunt — envoltura sobre Terraform para configuraciones DRY
- Terrascan — escáner de seguridad para IaC
- Infracost — calculadora de costes de infraestructura
- Terraform-docs — generador de documentación
- TFLint — linter para configuraciones de Terraform
- Y otras herramientas afines
¿Cómodo? Sin duda. Especialmente cuando en su equipo diez personas trabajan en diez proyectos distintos y la incompatibilidad de versiones provoca dolores de cabeza constantes.
Instalación de tenv: inicio rápido
Instalar tenv no llevará mucho tiempo — solo unos pocos comandos y estará listo. Dependiendo de su sistema operativo, hay varias formas de instalarlo.
Instalación en Linux y macOS
La forma más sencilla es usar el script de instalación automática:
curl -sSL https://raw.githubusercontent.com/tofuutils/tenv/main/install.sh | bash
Si prefiere una instalación más controlada, puede hacerlo manualmente:
git clone https://github.com/tofuutils/tenv.git ~/.tenv
echo 'export PATH="$HOME/.tenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(tenv init -)"' >> ~/.bashrc
source ~/.bashrc
Para usuarios de macOS con Homebrew la instalación es aún más simple:
brew tap tofuutils/tap
brew install tenv
Instalación en Windows
En Windows se recomienda usar WSL (Windows Subsystem for Linux) y seguir las instrucciones para Linux. Alternativamente, puede usar Chocolatey:
choco install tenv
Tras la instalación verifique que todo funcione correctamente:
tenv --version
Si ve el número de versión — perfecto, puede continuar.
Comandos básicos de tenv: empezar a trabajar
Ahora que tenv está instalado, aprendamos los comandos principales. Si ya ha utilizado algo como pyenv o nvm, la interfaz le resultará muy familiar.
Instalar versiones de Terraform
Para ver la lista de versiones disponibles de Terraform:
tenv list-remote terraform
Esto mostrará una lista larguísima de todas las versiones publicadas por HashiCorp. No se asuste — solo necesita algunas de ellas. Para instalar una versión concreta:
tenv install terraform 1.5.7
Si desea instalar la última versión estable, indique "latest":
tenv install terraform latest
Aquí empieza la magia — puede instalar varias versiones y cambiar entre ellas en cualquier momento.
Cambiar entre versiones
Para ver qué versiones tiene instaladas:
tenv list terraform
Para cambiar a una versión concreta de forma global:
tenv use terraform 1.4.6
Y lo que resulta realmente práctico — puede establecer una versión para un proyecto concreto:
cd ~/projects/legacy-infrastructure
tenv local terraform 0.12.31
Este comando creará el archivo .terraform-version en el directorio actual, y tenv cambiará automáticamente a la versión indicada cuando entre en ese directorio. ¡Nada de cambios manuales!
Yo suelo instalar distintas versiones para distintos clientes — un proyecto en Terraform 1.0, otro en 1.5, y tenv cambia entre ellas automáticamente cuando paso de un directorio a otro. Para mí, es una salvación frente al caos.
Funciones avanzadas: más que solo Terraform
Una de las mayores ventajas de tenv es el soporte no solo para Terraform, sino para toda la ecosistema de herramientas alrededor. Veamos cómo trabajar con otras herramientas.
Gestión de Terragrunt
La instalación y gestión de versiones de Terragrunt funciona exactamente igual que con Terraform:
tenv list-remote terragrunt
tenv install terragrunt 0.50.0
tenv use terragrunt 0.50.0
De forma similar puede crear el archivo .terragrunt-version para proyectos:
tenv local terragrunt 0.45.0
Otras herramientas compatibles
tenv soporta una lista impresionante de herramientas. Aquí algunas:
- 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
Para mí fue especialmente útil la gestión de versiones de Terragrunt — a menudo los proyectos requieren compatibilidad específica entre Terraform y Terragrunt, y tenv hace que ese problema deje de existir.
Detección automática de versiones
Una de las funciones más útiles de tenv es la detección automática de la versión requerida a partir de los archivos del proyecto. Si en el directorio existe un archivo .terraform-version o .terragrunt-version, tenv cambiará automáticamente a la versión indicada.
Esto es especialmente práctico en trabajo en equipo — fija la versión requerida en el repositorio y cada miembro del equipo usará automáticamente la versión correcta. No más mensajes en Slack del tipo "¿En qué versión ejecutamos este proyecto?"
Integración con CI/CD: automatice todo
Si usa CI/CD para sus proyectos de infraestructura (¿quién no?), tenv puede convertirse en una parte importante del pipeline. Así se puede integrar en sistemas CI/CD populares.
GitHub Actions
Para GitHub Actions puede crear un flujo de trabajo simple:
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
De este modo, su CI usará exactamente las versiones de herramientas que el proyecto especifica. Sin sorpresas ni diferencias entre el entorno local y el de CI.
GitLab CI
La configuración para GitLab CI es parecida:
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
Una vez pasé dos días depurando un bug extraño en un pipeline hasta que descubrí que en local usaba Terraform 1.3 y en CI 1.2. Desde entonces incorporo tenv como estándar en todos lados. Créame, ahorra tiempo y nervios.
Limitaciones y advertencias
Ninguna herramienta es perfecta, y tenv también tiene matices. Hablemos con honestidad sobre posibles problemas.
Rendimiento en proyectos grandes
Si tiene muchas versiones instaladas y un proyecto muy grande con múltiples subdirectorios, la detección automática de versión puede ralentizar un poco la shell. En la mayoría de los casos es imperceptible, pero si nota retrasos puede optimizar la configuración:
tenv config autoswitch off
Y activar el cambio automático solo cuando lo necesite:
tenv config autoswitch on
Integración con otras shells
tenv funciona bien con bash y zsh, pero si usa shells exóticos pueden requerirse ajustes adicionales. La documentación oficial incluye instrucciones para la mayoría de shells populares.
Gestión de plugins de Terraform
tenv no gestiona las versiones de los plugins de Terraform — eso lo hace el propio Terraform mediante el archivo .terraform.lock.hcl. Pero gestionar la versión del propio Terraform ya resuelve gran parte de los problemas de compatibilidad.
Una vez intenté gestionar manualmente las versiones de los proveedores... fue uno de esos momentos en que se arrepiente de haberse metido en DevOps. Afortunadamente, Terraform moderno con archivos lock lo resuelve mucho mejor.
Alternativas a tenv: análisis comparativo
Por supuesto, tenv no es la única herramienta para gestionar versiones de Terraform. Comparemos con otras soluciones populares.
tfenv
Tfenv es una solución más antigua y extendida, pero solo gestiona versiones del propio Terraform. Si solo necesita controlar Terraform, tfenv es suficiente; pero si usa un conjunto más amplio de herramientas, tenv ofrece una solución más completa.
La sintaxis de tfenv es muy parecida:
tfenv install 1.5.7
tfenv use 1.5.7
asdf
Asdf es un gestor de versiones universal para muchos lenguajes y herramientas, incluyendo Terraform a través de plugins. La ventaja de asdf es que puede gestionar versiones de casi todo: Node.js, Python, Ruby, Java, etc.
Sin embargo, para gestionar específicamente el ecosistema de Terraform, tenv ofrece una solución más especializada y cómoda con mejor integración.
Contenedores Docker
Algunos equipos prefieren ejecutar Terraform y herramientas relacionadas en contenedores Docker:
docker run -it --rm -v $(pwd):/workspace -w /workspace hashicorp/terraform:1.5.7 plan
Esta opción es aislada y reproducible, pero algo pesada para el uso diario y requiere acceso constante a Docker.
Tras probar todas estas opciones, me decidí por tenv por su versatilidad y sencillez. Especialmente cuando trabajas con varios clientes, cada uno con su propio stack y requisitos — una herramienta única para todo lo salva.
Conclusión: vale la pena implantar tenv en su equipo
Después de varios meses usando tenv en proyectos reales puedo decir con seguridad — sí, es una de esas herramientas raras que realmente facilita la vida en vez de añadir problemas.
Principales ventajas de tenv:
- Interfaz unificada para gestionar todo el ecosistema de Terraform
- Facilidad de instalación y uso
- Detección y cambio automático entre versiones
- Excelente integración con CI/CD
- Soporte y desarrollo activo
Si su equipo trabaja regularmente con Terraform, especialmente con varios proyectos en distintas versiones, implantar tenv puede simplificar mucho el flujo de trabajo y reducir errores por incompatibilidades de versión.
Y para quienes empiezan con infraestructura como código, tenv puede ser un asistente fiable que permita experimentar con distintas versiones y herramientas sin riesgo para el entorno de trabajo.
Un consejo personal: dedique media hora hoy a configurar tenv y ahorrará días de frustración en el futuro. Como se dice en el mundo DevOps: "Automatiza todo lo que haces más de dos veces". Gestionar versiones es sin duda una de esas tareas.
Enlaces útiles: