¿Que es Terraform?
Terraform es un software de infraestructura como código (infrastructure as code) desarrollado por HashiCorp. Permite a los usuarios definir y configurar la infraestructura de un centro de datos en un lenguaje de alto nivel, generando un plan de ejecución para desplegar la infraestructura en OpenStack,3 por ejemplo, u otros proveedores de servicio tales como AWS, IBM Cloud (antiguamente Bluemix), Google Cloud Platform, Linode,45 Microsoft Azure, Oracle Cloud Infrastructure o VMware vSphere.678910 La infraestructura se define utilizando la sintaxis de configuración de HashiCorp denominada HashiCorp Configuration Language (HCL) o, en su defecto, el formato JSON.11
En este ejemplo, vamos a desplegar el servicio: Azure DNS private zone
En primer lugar configuramos el archivo «main.tf» en donde vamos a configurar el Resurce Group y la VNET
#Resource Group
resource "azurerm_resource_group" "RG-RedOrbita_frontend" {
name = "RedOrbita_frontend"
location = "westeurope"
}
#Virtual Network
resource "azurerm_virtual_network" "VNET-RedOrbita_frontend_Vnet" {
name = "RedOrbita_frontend_Vnet"
address_space = ["10.10.1.0/24"]
location = azurerm_resource_group.RG-RedOrbita_frontend.location
resource_group_name = azurerm_resource_group.RG-RedOrbita_frontend.name
}
En el fichero «providers.tf» configuremos todos los provider que vamos a utilizar.
#Configure the Azure provider
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "=3.39.0"
}
}
}
provider "azurerm" {
features {}
}
Por ultimo, crearemos un archivo llamado «redorbita.tf» el cual configuraremos la zona DNS y todos los record de dicha zona.
resource "azurerm_private_dns_zone" "DNS-REDORBITA" {
name = "redorbita.com"
resource_group_name = azurerm_resource_group.RG-RedOrbita_frontend.name
}
resource "azurerm_private_dns_zone_virtual_network_link" "DNS-REDORBITA-LINK-RedOrbita_frontend_Vnet" {
name = "dns_vnet_frontend"
resource_group_name = azurerm_resource_group.RG-RedOrbita_frontend.name
private_dns_zone_name = azurerm_private_dns_zone.DNS-REDORBITA.name
virtual_network_id = azurerm_virtual_network.VNET-RedOrbita_frontend_VNet.id
registration_enabled = "false"
}
# Record REDORBITA.COM
resource "azurerm_private_dns_a_record" "DNS-REDORBITA-COM" {
name = "redorbita.com"
zone_name = azurerm_private_dns_zone.DNS-REDORBITA.name
resource_group_name = azurerm_resource_group.RG-RedOrbita_frontend.name
ttl = 300
records = ["10.10.1.10"]
}
resource "azurerm_private_dns_a_record" "DNS-REDORBITA-COM" {
name = "srvweb001"
zone_name = azurerm_private_dns_zone.DNS-REDORBITA.name
resource_group_name = azurerm_resource_group.RG-RedOrbita_frontend.name
ttl = 300
records = ["10.10.1.12"]
}
resource "azurerm_private_dns_a_record" "DNS-REDORBITA-COM" {
name = "srvweb002"
zone_name = azurerm_private_dns_zone.DNS-REDORBITA.name
resource_group_name = azurerm_resource_group.RG-RedOrbita_frontend.name
ttl = 300
records = ["10.10.1.13"]
}
En caso que tengamos que importar algún estado como por ejemplo en mi caso el grupo de recurso y la vnet. Esto nos creará un fichero llamado «terraform.tfstate» el cual guarda todos los estados de los recursos importados.
terraform import azurerm_resource_group.RG-RedOrbita_frontend /subscriptions/XXXXXXXXXXXXXXXXXXXXXXXXXX/resourceGroups/RedOrbita_frontend
terraform import azurerm_virtual_network.VNET-RedOrbita_frontend_Vnet /subscriptions/XXXXXXXXXXXXXXXXXXXXXXXXXX/resourceGroups/RedOrbita_frontend/providers/Microsoft.Network/virtualNetworks/RedOrbita_frontend_Vnet
Nos logamos a Azure
az login
az account set -s "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
Desplegamos
terraform init
terraform plan
terraform apply
:wq!