使用下列 Terraform 和 Terraform 提供者版本進行測試的文章:
Terraform 可啟用雲端基礎結構的定義、預覽和部署。 使用 Terraform,您可以使用 HCL 語法建立組態檔。 HCL 語法可讓您指定雲端提供者,例如 Azure,以及構成雲端基礎結構的專案。 建立組態檔之後,您會建立一個 執行計劃 ,讓您在部署基礎結構變更之前先預覽這些變更。 驗證變更之後,您會套用執行計劃來部署基礎結構。
本文說明如何使用 Terraform 部署 PostgreSQL 彈性伺服器資料庫 。
在本文中,您將學會如何:
- 使用 azurerm_resource_group 建立 Azure 資源群組
- 使用 azurerm_virtual_network 建立 Azure 虛擬網路
- 使用 azurerm_network_security_group 建立 Azure 網路安全組 (NSG)
- 建立 Azure 子網azurerm_subnet
- 使用 azurerm_subnet_network_security_group_association 建立 Azure 子網網路安全組 (NSG)
- 使用 azurerm_private_dns_zone 在 Azure DNS 內定義私人 DNS 區域
- 使用 azurerm_private_dns_zone_virtual_network_link 定義私人 DNS 區域 VNet 連結
- 部署 Azure PostgreSQL 彈性伺服器,該伺服器使用 azurerm_postgresql_flexible_server 運行資料庫
- 使用 azurerm_postgresql_flexible_server_database 具現化 Azure PostgreSQL 資料庫
備註
本文中的範例程式代碼位於 Azure Terraform GitHub 存放庫中。
1.設定您的環境
- Azure 訂用帳戶:如果您沒有 Azure 訂用帳戶,請在開始之前建立 免費帳戶 。
設定 Terraform:如果您尚未這麼做,請使用下列其中一個選項來設定 Terraform:
2.實作 Terraform 程式代碼
建立目錄,在其中測試並執行範例 Terraform 程式代碼,並將其設為目前目錄。
建立名為
providers.tf的檔案,並插入下列程序代碼:terraform { required_version = ">=1.0" required_providers { azurerm = { source = "hashicorp/azurerm" version = "~>3.0" } random = { source = "hashicorp/random" version = ">= 3.4.0" } } } provider "azurerm" { features {} }建立名為
main.tf的檔案,並插入下列程式代碼,以部署資料庫執行所在的 PostgreSQL 彈性伺服器。resource "random_pet" "name_prefix" { prefix = var.name_prefix length = 1 } resource "azurerm_resource_group" "default" { name = random_pet.name_prefix.id location = var.location } resource "azurerm_virtual_network" "default" { name = "${random_pet.name_prefix.id}-vnet" location = azurerm_resource_group.default.location resource_group_name = azurerm_resource_group.default.name address_space = ["10.0.0.0/16"] } resource "azurerm_network_security_group" "default" { name = "${random_pet.name_prefix.id}-nsg" location = azurerm_resource_group.default.location resource_group_name = azurerm_resource_group.default.name security_rule { name = "test123" priority = 100 direction = "Inbound" access = "Allow" protocol = "Tcp" source_port_range = "*" destination_port_range = "*" source_address_prefix = "*" destination_address_prefix = "*" } } resource "azurerm_subnet" "default" { name = "${random_pet.name_prefix.id}-subnet" virtual_network_name = azurerm_virtual_network.default.name resource_group_name = azurerm_resource_group.default.name address_prefixes = ["10.0.2.0/24"] service_endpoints = ["Microsoft.Storage"] delegation { name = "fs" service_delegation { name = "Microsoft.DBforPostgreSQL/flexibleServers" actions = [ "Microsoft.Network/virtualNetworks/subnets/join/action", ] } } } resource "azurerm_subnet_network_security_group_association" "default" { subnet_id = azurerm_subnet.default.id network_security_group_id = azurerm_network_security_group.default.id } resource "azurerm_private_dns_zone" "default" { name = "${random_pet.name_prefix.id}-pdz.postgres.database.azure.com" resource_group_name = azurerm_resource_group.default.name depends_on = [azurerm_subnet_network_security_group_association.default] } resource "azurerm_private_dns_zone_virtual_network_link" "default" { name = "${random_pet.name_prefix.id}-pdzvnetlink.com" private_dns_zone_name = azurerm_private_dns_zone.default.name virtual_network_id = azurerm_virtual_network.default.id resource_group_name = azurerm_resource_group.default.name } resource "random_password" "pass" { length = 20 } resource "azurerm_postgresql_flexible_server" "default" { name = "${random_pet.name_prefix.id}-server" resource_group_name = azurerm_resource_group.default.name location = azurerm_resource_group.default.location version = "13" delegated_subnet_id = azurerm_subnet.default.id private_dns_zone_id = azurerm_private_dns_zone.default.id administrator_login = "adminTerraform" administrator_password = random_password.pass.result zone = "1" storage_mb = 32768 sku_name = "GP_Standard_D2s_v3" backup_retention_days = 7 depends_on = [azurerm_private_dns_zone_virtual_network_link.default] }建立名為
postgresql-fs-db.tf的檔案,並插入下列程式代碼來具現化資料庫:resource "azurerm_postgresql_flexible_server_database" "default" { name = "${random_pet.name_prefix.id}-db" server_id = azurerm_postgresql_flexible_server.default.id collation = "en_US.utf8" charset = "UTF8" }建立名為
variables.tf的檔案,並插入下列程序代碼:variable "name_prefix" { default = "postgresqlfs" description = "Prefix of the resource name." } variable "location" { default = "eastus" description = "Location of the resource." }建立名為
outputs.tf的檔案,並插入下列程式代碼,以輸出資源組名、Azure PostgreSQL 伺服器名稱和 Azure PostgreSQL 資料庫名稱:output "resource_group_name" { value = azurerm_resource_group.default.name } output "azurerm_postgresql_flexible_server" { value = azurerm_postgresql_flexible_server.default.name } output "postgresql_flexible_server_database_name" { value = azurerm_postgresql_flexible_server_database.default.name } output "postgresql_flexible_server_admin_password" { sensitive = true value = azurerm_postgresql_flexible_server.default.administrator_password }
3. 初始化 Terraform
執行 terraform init 以初始化 Terraform 部署。 此命令會下載管理 Azure 資源所需的 Azure 提供者。
terraform init -upgrade
要點:
-
-upgrade參數會將必要的提供者外掛程式升級至符合組態版本條件約束的最新版本。
4.建立 Terraform 執行計劃
執行 terraform 計劃 以建立執行計劃。
terraform plan -out main.tfplan
要點:
-
terraform plan命令會建立執行計劃,但不會執行它。 然而,它會決定哪些動作是必要的,以建立您組態檔中所指定的設定。 此模式可讓您在對實際資源進行任何變更之前,先確認執行計劃是否符合您的預期。 - 選擇性
-out參數可讓您指定計劃的輸出檔。 使用-out參數可確保您查看的計劃確切地被套用。
5.套用 Terraform 執行計劃
執行 terraform apply 將執行計劃套用至您的雲端基礎設施。
terraform apply main.tfplan
要點:
- 範例
terraform apply命令假設您先前已執行terraform plan -out main.tfplan。 - 如果您為
-out參數指定了不同的檔案名,請在呼叫terraform apply時使用相同的檔案名。 - 如果您未使用
-out參數,請呼叫沒有任何參數的terraform apply。
6.驗證結果
執行 az postgres flexible-server db show 以顯示 Azure PostgreSQL 資料庫。
az postgres flexible-server db show --resource-group <resource_group_name> --server-name <server_name> --database-name <database_name>
要點:
-
<resource_group_name>、<server_name>和<database_name>的值會顯示在terraform apply輸出中。
7.清除資源
當您不再需要透過 Terraform 建立的資源時,請執行下列步驟:
執行 terraform 計劃 並指定
destroy旗標。terraform plan -destroy -out main.destroy.tfplan要點:
-
terraform plan命令會建立執行計劃,但不會執行它。 然而,它會決定哪些動作是必要的,以建立您組態檔中所指定的設定。 此模式可讓您在對實際資源進行任何變更之前,先確認執行計劃是否符合您的預期。 - 選擇性
-out參數可讓您指定計劃的輸出檔。 使用-out參數可確保您查看的計劃確切地被套用。
-
執行 terraform apply 以套用執行計畫。
terraform apply main.destroy.tfplan
排除 Azure 上 Terraform 的故障
針對在 Azure 上使用 Terraform 時的常見問題進行疑難解答