Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a: ✔️ Linux VMs
Artigo testado com as seguintes versões do Terraform e do provedor Terraform:
Este artigo mostra como criar um ambiente Linux completo e recursos de suporte com o Terraform. Esses recursos incluem uma rede virtual, sub-rede, endereço IP público e muito mais.
Terraform permite a definição, visualização e implantação de infraestrutura em nuvem. Usando Terraform, você cria arquivos de configuração usando a sintaxe HCL. A sintaxe HCL permite especificar o provedor de nuvem - como o Azure - e os elementos que compõem sua infraestrutura de nuvem. Depois de criar os arquivos de configuração, você cria um plano de execução que permite visualizar as alterações na infraestrutura antes que elas sejam implantadas. Depois de verificar as alterações, você aplica o plano de execução para implantar a infraestrutura.
Neste artigo, você aprenderá a:
- Crie um valor aleatório para o nome do grupo de recursos do Azure usando random_pet.
- Crie um grupo de recursos do Azure usando azurerm_resource_group.
- Crie uma rede virtual (VNET) usando azurerm_virtual_network.
- Crie uma sub-rede usando azurerm_subnet.
- Crie um IP público usando azurerm_public_ip.
- Crie um grupo de segurança de rede usando azurerm_network_security_group.
- Crie uma interface de rede usando azurerm_network_interface.
- Crie uma associação entre o grupo de segurança de rede e a interface de rede usando azurerm_network_interface_security_group_association.
- Gere um valor aleatório para um nome de conta de armazenamento exclusivo usando random_id.
- Crie uma conta de armazenamento para diagnóstico de inicialização usando azurerm_storage_account.
- Criar uma VM Linux usando azurerm_linux_virtual_machine
- Crie um recurso AzAPI azapi_resource.
- Crie um recurso AzAPI para gerar um par de chaves SSH usando azapi_resource_action.
Pré-requisitos
Implementar o código Terraform
Observação
O código de exemplo para este artigo está localizado no repositório GitHub do Azure Terraform. Você pode visualizar o arquivo de log que contém os resultados do teste das versões atual e anterior do Terraform.
Veja mais artigos e código de exemplo mostrando como usar o Terraform para gerenciar recursos do Azure
Crie um diretório no qual testar o código Terraform de exemplo e torná-lo o diretório atual.
Crie um arquivo chamado
providers.tfe insira o seguinte código:terraform { required_version = ">=0.12" required_providers { azapi = { source = "azure/azapi" version = "~>1.5" } azurerm = { source = "hashicorp/azurerm" version = "~>3.0" } random = { source = "hashicorp/random" version = "~>3.0" } } } provider "azurerm" { features {} }Crie um arquivo chamado
ssh.tfe insira o seguinte código:resource "random_pet" "ssh_key_name" { prefix = "ssh" separator = "" } resource "azapi_resource_action" "ssh_public_key_gen" { type = "Microsoft.Compute/sshPublicKeys@2022-11-01" resource_id = azapi_resource.ssh_public_key.id action = "generateKeyPair" method = "POST" response_export_values = ["publicKey", "privateKey"] } resource "azapi_resource" "ssh_public_key" { type = "Microsoft.Compute/sshPublicKeys@2022-11-01" name = random_pet.ssh_key_name.id ___location = azurerm_resource_group.rg.___location parent_id = azurerm_resource_group.rg.id } output "key_data" { value = azapi_resource_action.ssh_public_key_gen.output.publicKey }Crie um arquivo chamado
main.tfe insira o seguinte código:resource "random_pet" "rg_name" { prefix = var.resource_group_name_prefix } resource "azurerm_resource_group" "rg" { ___location = var.resource_group_location name = random_pet.rg_name.id } # Create virtual network resource "azurerm_virtual_network" "my_terraform_network" { name = "myVnet" address_space = ["10.0.0.0/16"] ___location = azurerm_resource_group.rg.___location resource_group_name = azurerm_resource_group.rg.name } # Create subnet resource "azurerm_subnet" "my_terraform_subnet" { name = "mySubnet" resource_group_name = azurerm_resource_group.rg.name virtual_network_name = azurerm_virtual_network.my_terraform_network.name address_prefixes = ["10.0.1.0/24"] } # Create public IPs resource "azurerm_public_ip" "my_terraform_public_ip" { name = "myPublicIP" ___location = azurerm_resource_group.rg.___location resource_group_name = azurerm_resource_group.rg.name allocation_method = "Dynamic" } # Create Network Security Group and rule resource "azurerm_network_security_group" "my_terraform_nsg" { name = "myNetworkSecurityGroup" ___location = azurerm_resource_group.rg.___location resource_group_name = azurerm_resource_group.rg.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 = "*" } } # Create network interface resource "azurerm_network_interface" "my_terraform_nic" { name = "myNIC" ___location = azurerm_resource_group.rg.___location resource_group_name = azurerm_resource_group.rg.name ip_configuration { name = "my_nic_configuration" subnet_id = azurerm_subnet.my_terraform_subnet.id private_ip_address_allocation = "Dynamic" public_ip_address_id = azurerm_public_ip.my_terraform_public_ip.id } } # Connect the security group to the network interface resource "azurerm_network_interface_security_group_association" "example" { network_interface_id = azurerm_network_interface.my_terraform_nic.id network_security_group_id = azurerm_network_security_group.my_terraform_nsg.id } # Generate random text for a unique storage account name resource "random_id" "random_id" { keepers = { # Generate a new ID only when a new resource group is defined resource_group = azurerm_resource_group.rg.name } byte_length = 8 } # Create storage account for boot diagnostics resource "azurerm_storage_account" "my_storage_account" { name = "diag${random_id.random_id.hex}" ___location = azurerm_resource_group.rg.___location resource_group_name = azurerm_resource_group.rg.name account_tier = "Standard" account_replication_type = "LRS" } # Create virtual machine resource "azurerm_linux_virtual_machine" "my_terraform_vm" { name = "myVM" ___location = azurerm_resource_group.rg.___location resource_group_name = azurerm_resource_group.rg.name network_interface_ids = [azurerm_network_interface.my_terraform_nic.id] size = "Standard_DS1_v2" os_disk { name = "myOsDisk" caching = "ReadWrite" storage_account_type = "Premium_LRS" } source_image_reference { publisher = "Canonical" offer = "0001-com-ubuntu-server-jammy" sku = "22_04-lts-gen2" version = "latest" } computer_name = "hostname" admin_username = var.username admin_ssh_key { username = var.username public_key = azapi_resource_action.ssh_public_key_gen.output.publicKey } boot_diagnostics { storage_account_uri = azurerm_storage_account.my_storage_account.primary_blob_endpoint } }Crie um arquivo chamado
variables.tfe insira o seguinte código:variable "resource_group_location" { type = string default = "eastus" description = "Location of the resource group." } variable "resource_group_name_prefix" { type = string default = "rg" description = "Prefix of the resource group name that's combined with a random ID so name is unique in your Azure subscription." } variable "username" { type = string description = "The username for the local account that will be created on the new VM." default = "azureadmin" }Crie um arquivo chamado
outputs.tfe insira o seguinte código:output "resource_group_name" { value = azurerm_resource_group.rg.name } output "public_ip_address" { value = azurerm_linux_virtual_machine.my_terraform_vm.public_ip_address }
Inicializar Terraform
Execute terraform init para inicializar a implantação do Terraform. Este comando baixa o provedor do Azure necessário para gerenciar seus recursos do Azure.
terraform init -upgrade
Pontos principais:
- O parâmetro
-upgradeatualiza os plug-ins de provedor necessários para a versão mais recente que está em conformidade com as restrições de versão da configuração.
Criar um plano de execução do Terraform
Execute o comando terraform plan para criar um plano de execução.
terraform plan -out main.tfplan
Pontos principais:
- O comando
terraform plancria um plano de execução, mas não o executa. Em vez disso, ele determina quais ações são necessárias para criar a configuração especificada em seus arquivos de configuração. Esse padrão permite que você verifique se o plano de execução corresponde às suas expectativas antes de fazer quaisquer alterações nos recursos reais. - O parâmetro opcional
-outpermite especificar um arquivo de saída para o plano. O uso do-outparâmetro garante que o plano revisado seja exatamente o que é aplicado.
Aplicar um plano de execução do Terraform
Execute terraform apply para aplicar o plano de execução à sua infraestrutura de nuvem.
terraform apply main.tfplan
Pontos principais:
- O comando de exemplo
terraform applypressupõe que já executasteterraform plan -out main.tfplananteriormente. - Se você especificou um nome de arquivo diferente para o parâmetro
-out, use esse mesmo nome de arquivo na chamada paraterraform apply. - Se você não usou o parâmetro
-out, chameterraform applysem nenhum parâmetro.
As informações de custo para o Terraform não são apresentadas durante o processo de criação da máquina virtual como são no portal do Azure. Se você quiser saber mais sobre como o custo funciona para máquinas virtuais, consulte a página Visão geral da otimização de custos.
Verificar os resultados
Obtenha o nome do grupo de recursos do Azure.
resource_group_name=$(terraform output -raw resource_group_name)Execute az vm list com uma consulta JMESPath para exibir os nomes das máquinas virtuais criadas no grupo de recursos.
az vm list \ --resource-group $resource_group_name \ --query "[].{\"VM Name\":name}" -o table
Limpeza de recursos
Quando você não precisar mais dos recursos criados via Terraform, execute as seguintes etapas:
Execute terraform plan e especifique o parâmetro
destroy.terraform plan -destroy -out main.destroy.tfplanPontos principais:
- O comando
terraform plancria um plano de execução, mas não o executa. Em vez disso, ele determina quais ações são necessárias para criar a configuração especificada em seus arquivos de configuração. Esse padrão permite que você verifique se o plano de execução corresponde às suas expectativas antes de fazer quaisquer alterações nos recursos reais. - O parâmetro opcional
-outpermite especificar um arquivo de saída para o plano. O uso do-outparâmetro garante que o plano revisado seja exatamente o que é aplicado.
- O comando
Execute terraform apply para aplicar o plano de execução.
terraform apply main.destroy.tfplan
Solucionar problemas do Terraform no Azure
Solucionar problemas comuns ao usar o Terraform no Azure
Próximos passos
Neste início rápido, você implantou uma máquina virtual simples usando o Terraform. Para saber mais sobre as máquinas virtuais do Azure, continue para o tutorial das VMs do Linux.