Zřízení virtuálního počítače s Linuxem pomocí Terraformu
Terraform implementuje a řídí cílovou infrastrukturu pomocí konfiguračních souborů, které popisují požadovaný stav jeho součástí. Základní formát souborů a jejich obecná syntaxe vyjádřená v HCL (Hashicorp Configuration Language) jsou stejné bez ohledu na volbu cloudu. Popisy jednotlivých komponent jsou však závislé na cloudu podle odpovídajícího poskytovatele Terraformu.
Přestože existuje několik poskytovatelů Terraformu, kteří podporují správu infrastruktury Azure, azureRM má zvláštní význam. Poskytovatel AzureRM usnadňuje zřizování a konfiguraci běžných prostředků Azure IaaS, jako jsou virtuální počítače, účty úložiště a síťová rozhraní. Existují také další poskytovatelé, kteří nejsou cloudoví, které můžete chtít začlenit do svých nasazení. Patří mezi ně náhodný zprostředkovatel, který pomáhá vyhnout se konfliktům pojmenování prostředků generováním pseudonáhodných řetězců znaků; a poskytovatele tls, který zjednodušuje správu asymetrických klíčů pro zabezpečení ověřování v Linuxu.
Terraform je k dispozici jako jeden binární soubor, který si můžete stáhnout z webu Hashicorp. Tento binární soubor implementuje rozhraní příkazového řádku Terraformu (CLI), které pak můžete vyvolat z relace prostředí a inicializovat Terraform a zpracovat konfigurační soubory. Rozhraní příkazového řádku Terraformu můžete použít z libovolného prostředí, které podporují Azure CLI.
Poznámka:
Pokud používáte Azure Cloud Shell, ujistěte se, že používáte aktuální verzi Terraformu, a to podle pokynů uvedených v tématu Konfigurace Terraformu v Azure Cloud Shellu s Bashem.
Nasazení virtuálního počítače s Linuxem pomocí Terraformu
Terraform umožňuje definovat, preview a nasazovat prostředky do cloudové infrastruktury specifické pro poskytovatele. Proces zřizování začíná vytvářením konfiguračních souborů, které používají syntaxi HCL, což umožňuje určit cílové cloudové prostředí , jako je Azure, a prostředky, které tvoří vaši cloudovou infrastrukturu. Jakmile jsou všechny relevantní konfigurační soubory zavedené (obvykle ve stejném umístění systému souborů), můžete vygenerovat plán provádění, který umožňuje zobrazit náhled výsledných změn infrastruktury před skutečným nasazením. To vyžaduje, abyste Terraform inicializovali, abyste stáhli moduly poskytovatele potřebné k implementaci cloudových prostředků. Po ověření změn můžete plán provádění použít k nasazení infrastruktury.
Poznámka:
Generování plánu provádění je volitelné, ale doporučujeme to udělat, protože umožňuje identifikovat jakýkoli dopad plánovaného nasazení, aniž by to mělo vliv na cílové prostředí. Když prostředky Azure nasadíte interaktivně, Terraform transparentní ověřování Azure CLI podporuje opětovným použitím přihlašovacích údajů pro přístup k cílovému předplatnému Azure.
Proces zřizování virtuálního počítače Azure s Linuxem pomocí Terraformu obvykle zahrnuje následující posloupnost kroků vysoké úrovně:
- Identifikujte vhodnou image virtuálního počítače.
- Určete vhodnou velikost virtuálního počítače.
- Vytvořte konfigurační soubory, které definují prostředek virtuálního počítače Azure se závislostmi.
- Inicializujte Terraform.
- Vygenerujte plán provádění Terraformu.
- Zahajte nasazení Terraformu.
Pokud chcete identifikovat vhodnou image a velikost virtuálního počítače, postupujte podle kroků popsaných v lekci 4 tohoto modulu. Tato lekce se zaměřuje na úlohy specifické pro Terraform.
Vytvoření konfiguračních souborů
Poznámka:
Názvy souborů, které zvolíte pro soubory Terraformu, jsou libovolné, i když je vhodné zvolit název, který odpovídá obsahu nebo účelu souboru. Pro příponu souboru byste měli použít .tf .
Pokud chcete nasadit virtuální počítač s Linuxem pomocí Terraformu, začněte vytvořením adresáře pro hostování konfiguračních souborů. Dále vytvořte soubor s názvem providers.tf , který vynucuje verzi Terraformu a určí zprostředkovatele, na kterých budete při definování prostředků zahrnutých v nasazení spoléhat. Tento soubor by měl obsahovat obsah zobrazený v následujícím fragmentu kódu:
terraform {
required_version = ">=0.12"
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~>2.0"
}
random = {
source = "hashicorp/random"
version = "~>3.0"
}
tls = {
source = "hashicorp/tls"
version = "~>4.0"
}
}
}
provider "azurerm" {
features {}
}
Ve stejném adresáři vytvořte soubor s názvem main.tf pomocí následujícího kódu, který definuje konfiguraci virtuálního počítače Azure a její závislosti:
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" "terraform_network" {
name = "lnx-tf-vnet"
address_space = ["10.1.0.0/16"]
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
}
# Create subnet
resource "azurerm_subnet" "terraform_subnet" {
name = "subnet0"
resource_group_name = azurerm_resource_group.rg.name
virtual_network_name = azurerm_virtual_network.terraform_network.name
address_prefixes = ["10.1.0.0/24"]
}
# Create public IPs
resource "azurerm_public_ip" "terraform_public_ip" {
name = "lnx-tf-pip"
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" "terraform_nsg" {
name = "lnx-tf-nsg"
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
security_rule {
name = "ssh"
priority = 300
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" "terraform_nic" {
name = "lnx-tf-nic"
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
ip_configuration {
name = "nic_configuration"
subnet_id = azurerm_subnet.terraform_subnet.id
private_ip_address_allocation = "Dynamic"
public_ip_address_id = azurerm_public_ip.terraform_public_ip.id
}
}
# Connect the security group to the network interface
resource "azurerm_network_interface_security_group_association" "lnx-tf-nic-nsg" {
network_interface_id = azurerm_network_interface.terraform_nic.id
network_security_group_id = azurerm_network_security_group.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" "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 (and display) an SSH key
resource "tls_private_key" "lnx-tf-ssh" {
algorithm = "RSA"
rsa_bits = 4096
}
# Create virtual machine
resource "azurerm_linux_virtual_machine" "lnx-tf-vm" {
name = "lnx-tf-vm"
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
network_interface_ids = [azurerm_network_interface.terraform_nic.id]
size = "Standard_F4s"
os_disk {
name = "lnx-tf-vm-osdisk"
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 = "lnx-tf-vm"
admin_username = "azureuser"
disable_password_authentication = true
admin_ssh_key {
username = "azureuser"
public_key = tls_private_key.lnx-tf-ssh.public_key_openssh
}
boot_diagnostics {
storage_account_uri = azurerm_storage_account.storage_account.primary_blob_endpoint
}
}
Ve stejném adresáři vytvořte jiný soubor s názvem variables.tf pomocí následujícího kódu, který přiřadí hodnotu proměnným zobrazeným v souboru main.tf :
variable "resource_group_location" {
default = "eastus"
description = "Location of the resource group"
}
variable "resource_group_name_prefix" {
default = "rg"
description = "Prefix of the resource group name that's combined with a random ID so name is unique in your Azure subscription"
}
Nakonec vytvořte soubor s názvem outputs.tf pomocí následujícího kódu, který určuje výstup, který zobrazí po úspěšném nasazení:
output "resource_group_name" {
value = azurerm_resource_group.rg.name
}
output "public_ip_address" {
value = azurerm_linux_virtual_machine.lnx-tf-vm.public_ip_address
}
output "tls_private_key" {
value = tls_private_key.lnx-tf-ssh.private_key_pem
sensitive = true
}
Inicializace Terraformu
Pokud chcete inicializovat nasazení Terraformu, spusťte z příkazového řádku prostředí následující příkaz:
terraform init
Tento příkaz stáhne moduly Azure potřebné ke zřízení a správě prostředků Azure.
Vygenerování plánu provádění
Po inicializaci vytvořte plán provádění spuštěním terraform plan
. Příkaz vytvoří plán spuštění, ale nespustí ho. Místo toho určuje, jaké akce jsou nezbytné k vytvoření prostředků definovaných v konfiguračních souborech. Volitelný -out
parametr umožňuje zadat výstupní soubor pro plán, na který můžete odkazovat během skutečného nasazení. Použitím tohoto souboru zajistíte, že plán, který zkontrolujete, odpovídá přesnému výsledku nasazení. K vygenerování plánu provádění použijte následující příkaz:
terraform plan -out <terraform_plan>.tfplan
Zahájení nasazení
Až budete připraveni použít plán provádění pro vaše prostředí Azure, spusťte terraform apply
příkaz , včetně názvu souboru, který jste vygenerovali v předchozím kroku. Budete mít další šanci zkontrolovat očekávaný výsledek. Terraform vás vyzve k potvrzení, abyste mohli pokračovat, i když můžete výzvu odstranit přidáním -auto-approve
přepínače. K zahájení nasazení použijte následující příkaz:
terraform apply <terraform_plan>.tfplan
Virtuální počítač Azure brzy začne běžet, obvykle během několika minut. Výstup terraform apply
příkazu obsahuje seznam výstupů, ale terraform nahradí hodnotu tls_private_key
citlivým <> popiskem:
Apply complete! Resources: 12 added, 0 changed, 0 destroyed.
Výstupy:
public_ip_address = "74.235.10.136"
resource_group_name = "rg-flexible-shark"
tls_private_key = <sensitive>
Pokud chcete pro ověřování připojení SSH použít automaticky vygenerovaný privátní klíč, uložte ho do souboru a pak nastavte oprávnění k souboru, aby k němu ostatní neměli přístup. Pokud to chcete provést, spusťte následující příkazy:
terraform output -raw tls_private_key > id_rsa
chmod 600 id_rsa
V tomto okamžiku se budete moct připojit k virtuálnímu počítači Azure spuštěním následujícího příkazu (po nahrazení <zástupného symbolu public_ip_address> IP adresou, kterou jste identifikovali ve výstupu vygenerovaném použitím terraformu):
ssh -i id_rsa azureuser@<public_ip_address>