Configuración de una máquina virtual Linux con infraestructura en Azure mediante Terraform
Terraform permite definir y crear implementaciones completas de infraestructura de Azure. Se crean plantillas de Terraform en un formato legible para el usuario para crear y configurar recursos de Azure de forma coherente y reproducible. En este artículo se muestra cómo crear un entorno completo de Linux y recursos de apoyo con Terraform.
En este artículo aprenderá a:
- Creación de una red virtual
- Creación de una subred
- Crear una dirección IP pública
- Crear un grupo de seguridad de red
- Creación de una tarjeta de interfaz de red virtual
- Creación de una cuenta de almacenamiento para diagnóstico
- Creación de una máquina virtual
1. Configurar su entorno
- Suscripción de Azure: Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.
Configuración de Terraform: si aún no lo ha hecho, configure Terraform con una de las siguientes opciones:
2. Implementación del código de Terraform
Cree un directorio en el que probar el código de ejemplo de Terraform y conviértalo en el directorio actual.
Cree un archivo llamado
main.tfe inserte el siguiente código:# Configure the Microsoft Azure Provider terraform { required_providers { azurerm = { source = "hashicorp/azurerm" version = "~>2.0" } } } provider "azurerm" { features {} } # Create a resource group if it doesn't exist resource "azurerm_resource_group" "myterraformgroup" { name = "myResourceGroup" location = "eastus" tags = { environment = "Terraform Demo" } } # Create virtual network resource "azurerm_virtual_network" "myterraformnetwork" { name = "myVnet" address_space = ["10.0.0.0/16"] location = "eastus" resource_group_name = azurerm_resource_group.myterraformgroup.name tags = { environment = "Terraform Demo" } } # Create subnet resource "azurerm_subnet" "myterraformsubnet" { name = "mySubnet" resource_group_name = azurerm_resource_group.myterraformgroup.name virtual_network_name = azurerm_virtual_network.myterraformnetwork.name address_prefixes = ["10.0.1.0/24"] } # Create public IPs resource "azurerm_public_ip" "myterraformpublicip" { name = "myPublicIP" location = "eastus" resource_group_name = azurerm_resource_group.myterraformgroup.name allocation_method = "Dynamic" tags = { environment = "Terraform Demo" } } # Create Network Security Group and rule resource "azurerm_network_security_group" "myterraformnsg" { name = "myNetworkSecurityGroup" location = "eastus" resource_group_name = azurerm_resource_group.myterraformgroup.name security_rule { name = "SSH" priority = 1001 direction = "Inbound" access = "Allow" protocol = "Tcp" source_port_range = "*" destination_port_range = "22" source_address_prefix = "*" destination_address_prefix = "*" } tags = { environment = "Terraform Demo" } } # Create network interface resource "azurerm_network_interface" "myterraformnic" { name = "myNIC" location = "eastus" resource_group_name = azurerm_resource_group.myterraformgroup.name ip_configuration { name = "myNicConfiguration" subnet_id = azurerm_subnet.myterraformsubnet.id private_ip_address_allocation = "Dynamic" public_ip_address_id = azurerm_public_ip.myterraformpublicip.id } tags = { environment = "Terraform Demo" } } # Connect the security group to the network interface resource "azurerm_network_interface_security_group_association" "example" { network_interface_id = azurerm_network_interface.myterraformnic.id network_security_group_id = azurerm_network_security_group.myterraformnsg.id } # Generate random text for a unique storage account name resource "random_id" "randomId" { keepers = { # Generate a new ID only when a new resource group is defined resource_group = azurerm_resource_group.myterraformgroup.name } byte_length = 8 } # Create storage account for boot diagnostics resource "azurerm_storage_account" "mystorageaccount" { name = "diag${random_id.randomId.hex}" resource_group_name = azurerm_resource_group.myterraformgroup.name location = "eastus" account_tier = "Standard" account_replication_type = "LRS" tags = { environment = "Terraform Demo" } } # Create (and display) an SSH key resource "tls_private_key" "example_ssh" { algorithm = "RSA" rsa_bits = 4096 } output "tls_private_key" { value = tls_private_key.example_ssh.private_key_pem sensitive = true } # Create virtual machine resource "azurerm_linux_virtual_machine" "myterraformvm" { name = "myVM" location = "eastus" resource_group_name = azurerm_resource_group.myterraformgroup.name network_interface_ids = [azurerm_network_interface.myterraformnic.id] size = "Standard_DS1_v2" os_disk { name = "myOsDisk" caching = "ReadWrite" storage_account_type = "Premium_LRS" } source_image_reference { publisher = "Canonical" offer = "UbuntuServer" sku = "18.04-LTS" version = "latest" } computer_name = "myvm" admin_username = "azureuser" disable_password_authentication = true admin_ssh_key { username = "azureuser" public_key = tls_private_key.example_ssh.public_key_openssh } boot_diagnostics { storage_account_uri = azurerm_storage_account.mystorageaccount.primary_blob_endpoint } tags = { environment = "Terraform Demo" } }Puntos clave:
- La máquina se creará con una nueva clave pública SSH. Para obtener la clave privada correspondiente, ejecute
terraform output -raw tls_private_key. Guarde la salida en un archivo de la máquina local y úsela para iniciar sesión en la máquina virtual.
- La máquina se creará con una nueva clave pública SSH. Para obtener la clave privada correspondiente, ejecute
3. Inicialización de Terraform
Para inicializar la implementación de Terraform, ejecute terraform init.
terraform init
Puntos clave:
- Este comando descarga los módulos de Azure necesarios para crear un grupo de recursos de Azure.
4. Creación de un plan de ejecución de Terraform
Ejecute terraform plan para crear un plan de ejecución.
terraform plan -out main.tfplan
Puntos clave:
- El comando
terraform plancrea un plan de ejecución, pero no lo ejecuta. En su lugar, determina qué acciones son necesarias para crear la configuración especificada en los archivos de configuración. Este patrón le permite comprobar si el plan de ejecución coincide con sus expectativas antes de realizar cambios en los recursos reales. - El parámetro
-outopcional permite especificar un archivo de salida para el plan. El uso del parámetro-outgarantiza que el plan que ha revisado es exactamente lo que se aplica. - Para más información acerca de la seguridad y conservar los planes de ejecución, consulte la sección Advertencia de seguridad.
5. Aplicación de un plan de ejecución de Terraform
Ejecute terraform apply para aplicar el plan de ejecución a su infraestructura en la nube.
terraform apply main.tfplan
Puntos clave:
- El comando
terraform applyanterior da por hecho que ejecutó anteriormenteterraform plan -out main.tfplan. - Si especificó un nombre de archivo diferente para el parámetro
-out, use ese mismo nombre de archivo en la llamada aterraform apply. - Si no ha utilizado el parámetro
-out, simplemente llame aterraform applysin ningún parámetro.
Solución de problemas de Terraform en Azure
Solución de problemas comunes al usar Terraform en Azure