Los enfoques heredados de "Click-Ops" para tratar con aplicaciones SaaS modernas y servicios empresariales se están convirtiendo rápidamente en enfoques heredados para muchas organizaciones. Los equipos preocupados por asegurar el futuro y codificar sus configuraciones han comenzado a buscar enfoques amigables con GitOps para gestionar estos sistemas.
Y por buena razón, también.
Introducción a la Infraestructura como Código ("IaC") e Integración Continua / Implementación Continua (CI/CD)
Un número cada vez mayor de organizaciones prefiere implementar cambios a través de código o archivos de definición de configuración en lugar de depender de administradores haciendo clic en una consola, comúnmente conocido como ClickOps. En un enfoque CI/CD (o "GitOps"), se define un estado deseado, típicamente en un archivo YAML u otro formato bien estructurado, y el archivo se confirma en una rama Git. Se envía una solicitud de incorporación de cambios para iniciar un flujo de trabajo de prueba, revisión y aprobación, seguido de una serie de fusiones a una rama donde una acción automatizada implementa el cambio en Jamf Pro a través de API. Estas técnicas también se pueden utilizar para mover un cambio a través de etapas de prueba y aceptación del usuario antes de que algo suceda en producción donde afectará a toda la flota.
Definir la configuración como código permite flujos de trabajo de revisión de código, aprobación y solicitud de incorporación de cambios bien definidos de la misma manera que el desarrollo profesional de software. Esto significa que su entorno se vuelve comprobable, repetible y escalable, al tiempo que proporciona una ruta para revertir a una versión anterior si un cambio causa problemas inesperados.
Puede iterar rápidamente y revertir rápidamente sin tener que examinar una interfaz de usuario junto con la documentación para entender dónde ocurrió la falla.
Nuestro equipo habló sobre este enfoque completo en JNUC 2025 en Denver. En este artículo, pretendemos avanzar un poco más e idealmente darle una pista clara para comenzar a explorar esto por su cuenta.
Primero, ¿por qué elegimos Terraform?
Terraform es una herramienta muy poderosa en el mundo de la Infraestructura como Código - es ágil y puede adaptarse para asignarse a cualquier API con la que desee comunicarse. Cuando comenzamos a explorar este enfoque, nos conectamos con Deployment Theory que ya había construido un Proveedor de Terraform para Jamf Pro. Nuestro equipo comenzó a trabajar con ellos para entender la aplicación y desde entonces hemos contribuido bastante a ese proyecto. Además, incluso hemos construido nuestros propios proveedores para Apple Business y Apple School Manager, así como construir un nuevo proveedor para la API de Plataforma Jamf.
Hemos documentado estas piezas y continuaremos actualizando esto en el futuro en nuestro sitio de Desarrolladores aquí: https://developer.jamf.com/jamf-pro/docs/jamf-pro-api-developer-resources#terraform-providers
Antes de continuar, por favor no pruebe esto en una instancia de producción. Terraform es una herramienta poderosa, por lo que recomendamos utilizar una instancia de prueba. Puede adquirir una instancia beta de Jamf Pro de Jamf Account para usar con este propósito si no tiene una instancia sandbox o de prueba.
Ahora, comencemos a utilizar Terraform para construir algunos recursos en Jamf Pro.
Nota: Para mantener las cosas simples, usaremos autenticación básica, pero puede cambiar a usar OAuth en el futuro.
Instalación de Terraform
Usaremos Homebrew para instalar Terraform por razones de simplicidad. Si no tiene Homebrew instalado, siga los pasos aquí.
Abra Terminal y siga estos pasos:
Primero, accederemos al directorio oficial de HashiCorp.
brew tap hashicorp/tap
A continuación, instalaremos Terraform.
brew install hashicorp/tap/terraform
Finalmente, validaremos que todo funcionó correctamente. Ejecutar este comando debe mostrarle la versión de Terraform que tiene instalada. Si no es así, reintente los pasos anteriores.
terraform -version
Por supuesto, HashiCorp tiene sus pasos de instalación documentados como referencia aquí.
Instalación de Visual Studio Code
Realmente puede usar cualquier editor de texto o Entorno de Desarrollo Integrado (IDE) para escribir Terraform. Sin embargo, hemos encontrado que Visual Studio Code es muy compatible con Terraform con extensiones para resaltado de sintaxis fácilmente disponibles. Dado que VS Code también es una herramienta gratuita, es ideal para que la recomendemos para esta prueba.
Puede descargar VS Code aquí e instalar en su sistema.
Una vez que haya instalado VS Code, puede hacer clic en la pestaña Extensiones en el lado izquierdo (o escribir Shift + Command + X en su teclado) y buscar "HashiCorp Terraform." Adelante e instale esta extensión para obtener resaltado de sintaxis completo de Terraform.
Inicio de un Proyecto de Terraform
Un archivo de Proyecto de Terraform contendrá muchos elementos específicos que son necesarios para ponerse en marcha y comenzar a construir su proyecto. La mayoría de los archivos relevantes terminarán con la extensión de archivo .tf o algo similar como .tfvars.
Hay muchos componentes que componen la funcionalidad aquí pero los cubriremos en un momento posterior.
Comenzar aquí puede parecer un poco desalentador: hay mucho que poner en marcha. Entonces, quisimos hacer esto un poco más fácil.
Primero, abra Terminal y cree una carpeta para poder almacenar su proyecto de Terraform. Crearemos esta carpeta a nivel de usuario para un acceso fácil.
mkdir jamf-terraform
Luego, cambiaremos de directorio en Terminal a la carpeta recién creada
cd ~/jamf-terraform
Ahora, clonaremos nuestra rama de plantilla desde nuestro repositorio del módulo de Terraform principal.
git clone -b template https://github.com/Jamf-Concepts/terraform-jamf-platform
Después de haber hecho esto, tendrá un proyecto de Terraform de plantilla completamente funcional listo para Jamf Pro y Jamf Security Cloud.
Adición de un Archivo de Variables
Algo que no desea que termine en su repositorio Github: sus credenciales de inicio de sesión o secretos de cliente. Afortunadamente, Terraform tiene un camino para esto.
Abra el editor de texto de su elección y copie el siguiente texto:
jamfpro_auth_method = "basic" ## oauth2 o basic
jamfpro_instance_url = "https://<tenant-name>.jamfcloud.com"
jamfpro_username = ""
jamfpro_password = ""
jamfpro_client_id = ""
jamfpro_client_secret = ""
## Detalles de Cuenta de Jamf Protect
jamfprotect_url = "https://<tenant-name>.protect.jamfcloud.com"
jamfprotect_clientid = ""
jamfprotect_client_password = ""
## (Jamf Pro) Controles de Configuración General ##
include_categories = false
Nombrará este archivo terraform.tfvars y lo guardará en el nivel superior de su repositorio de plantilla recién clonado.
Ahora, puede comenzar a rellenar la información en su archivo terraform.tfvars recién creado. He configurado el método de autenticación en basic para simplificar las cosas para usted, pero sepa que puede cambiar a oauth2 en el futuro. Entonces, por ahora, simplemente ingrese su nombre de usuario y contraseña local en los campos jamfpro_username y jamfpro_password respectivamente. También puede ingresar su información de Jamf Protect: simplemente necesitará crear un Cliente API en su inquilino Protect.
También hemos incluido un control para el módulo incluido en este repositorio de plantilla. Esta es efectivamente una variable booleana simple que nos permite declarar si aplicaremos algún módulo en particular. Puede optar por usar este tipo de enfoque con los módulos adicionales que construyó en el futuro o simplemente elimine todos los requisitos booleanos y deje que todo se ejecute cada vez.
Archivo de Estado de Terraform
Dado que aún no hemos asignado realmente recursos a nuestra instancia: ahora es el momento perfecto para hablar sobre qué es el archivo de estado en Terraform.
Cada vez que agrega, cambia o destruye recursos a través de Terraform, esas actualizaciones se guardan en un archivo llamado terraform.tfstate y luego se respaldan en un archivo llamado terraform.tfstate.backup.
Así es como Terraform recuerda lo que ha hecho en su instancia y es crítico para la funcionalidad futura. Cada vez que ejecuta Terraform contra una instancia, se consulta este archivo de estado antes de que se haga cualquier cosa. Cada archivo de estado debe estar asociado a su propia instancia, por lo que es importante mantenerlos separados para mantener la funcionalidad y evitar cruzar los flujos.
Ejecución de Terraform
Ahora, está en una buena posición: tiene Terraform instalado, un repositorio de plantilla y sus credenciales definidas en un archivo de variables.
Ahora, está listo para ejecutar nuestro módulo de plantilla contra su instancia de prueba o beta de Jamf Pro. Para hacerlo, abrirá Terminal y ejecutará los siguientes comandos.
terraform init -upgrade
Esto inicializará Terraform y actualizará cualquier proveedor requerido a las versiones más recientes para cualquiera que haya utilizado esto antes en sus máquinas, pero también realizará la instalación inicial de los proveedores de Terraform requeridos si usted es completamente nuevo en el tema.
terraform fmt -recursive
Esto formateará recursivamente cualquier código de Terraform en su rama clonada local para asegurar que todo se vea correcto y funcione correctamente.
terraform plan
Esto examinará su instancia de prueba de Jamf Pro, su archivo de estado de Terraform y su código de módulo de Terraform para cualquier cambio o cosas nuevas para aplicar o eliminar de su instancia y devolverá un plan completo o un resumen de lo que sucederá cuando ejecute el módulo completamente.
terraform apply
Esto primero ejecutará el plan e informará qué se agregará, cambiará o destruirá. Luego le pedirá que confirme esta acción. El campo solo aceptará 2 entradas: yes o no.
terraform apply -parallelism=1
Esto obligará a que todos los recursos que se crean tomen sus turnos y vayan uno a la vez. Dado que muchas aplicaciones SaaS tienen sistemas establecidos para detectar posibles ataques, a veces esta es la mejor manera de abordar la ejecución de Terraform.
terraform destroy -parallelism=1
Esto destruirá cualquier recurso creado que se referencia en su archivo de estado en Terraform.
Cada ejecución posterior de cualquiera de los comandos plan, apply, o destroy consultará su archivo de estado, evaluará qué necesita agregarse, cambiarse o destruirse y luego ejecutará la acción adecuada.
Ejecución de Este Módulo en Particular
Cuando ejecute el módulo de plantilla que hemos incluido, creará 7 categorías en su Jamf Pro con nombres para cada misión Apolo del 11 al 17 como una prueba simple.
Una vez que se agreguen, puede destruirlos fácilmente usando los comandos anteriores.
El objetivo más amplio aquí es mostrarle la estructura de Terraform para que pueda comenzar a construir módulos relevantes para su entorno, lo que me lleva a la siguiente sección de este artículo.
La Anatomía de Terraform
El núcleo de la funcionalidad aquí es la jerarquía de archivos .tf. El main.tf a nivel raíz se refiere al main.tf del módulo hijo que referencia los archivos .tfvars y archivos variables.tf. Aquí hay un desglose completo del hilo y el orden de comunicación:
Cuando ejecuta terraform apply:
Se consulta el archivo de estado.
Se evalúa el main.tf raíz para módulos secundarios que se están solicitando.
Se escanea el variables.tf raíz para variables relevantes para los módulos secundarios que se aplican.
Se escanea terraform.tfvars para todas las variables relevantes para ejecutar cada módulo secundario.
Luego se llaman y ejecutan los archivos main.tf del módulo secundario haciendo referencia a sus propios archivos variables.tf locales para variables locales del módulo secundario relevantes.
Luego se crea cada recurso y se guardan referencias en terraform.tfstate.
Terraform informará de éxito o fracaso junto con códigos relevantes y mensajería de respuesta para que use en la solución de problemas si es necesario.
Cosas a Tener en Cuenta
Cuando comience a construir sus propios módulos, puede copiar el módulo de plantilla que incluimos y modificarlo según sea necesario.
Cada módulo secundario debe tener sus propios archivos main.tf y variables.tf.
Cada módulo secundario necesita estar representado en el main.tf a nivel raíz.
Lea cuidadosamente a través del módulo en el repositorio de plantilla y busque cada punto de referencia para que comprenda completamente cómo cada pieza funciona juntos para lograr el objetivo.
Puede usar operaciones booleanas (también conocidas como controles) en su archivo terraform.tfvars para llamar módulos secundarios o simplemente dejarlos siendo siempre llamados cuando ejecute terraform apply.
También puede hacer que sus llamadas de módulo dependan de una variable siendo completada o incluso puede establecer declaraciones simples de inclusión o exclusión para determinar cuándo se ejecutan los módulos en función de sus propios criterios.
Terraform es una herramienta muy poderosa con muchas funciones integradas que puede usar. Algunas de estas serán necesarias cuando construya funciones específicas y algunas nunca las usará, pero todas están muy bien documentadas en https://developer.hashicorp.com/terraform
Referencias
Proveedor de Jamf Pro de Deployment Theory