快速入门:使用 Terraform 创建 Azure Database for MySQL 灵活服务器的实例
此快速入门已使用以下 TerraForm 和 TerraForm 提供程序版本进行测试:
Azure Database for MySQL 灵活服务器是一种托管服务,可用于在云中运行、管理和缩放具有高可用性的 MySQL 数据库。 可使用 Azure 资源管理器模板(ARM 模板)来预配 Azure Database for MySQL 灵活服务器,以便部署多个服务器或在一个服务器上部署多个数据库。
本文介绍了如何使用 Terraform 在虚拟网络中部署 Azure Database for MySQL 灵活服务器实例和数据库。
在本文中,学习如何:
- 使用azurerm_resource_group创建 Azure 资源组。
- 使用azurerm_virtual_network创建 Azure 虚拟网络。
- 使用azurerm_subnet创建 Azure 子网。
- 使用azurerm_private_dns_zone在 Azure DNS 实例中定义专用 DNS 区域。
- 使用azurerm_private_dns_zone_virtual_network_link定义专用 DNS 区域虚拟网络链接。
- 使用azurerm_mysql_flexible_server部署 Azure Database for MySQL 灵活服务器。
- 使用azurerm_mysql_flexible_database部署数据库。
备注
本文中显示的示例代码位于Azure Terraform GitHub 存储库中。
-
如果没有 Azure 订阅,可在开始前创建一个 Azure 试用帐户。
创建用于测试示例 Terraform 代码的目录。 将 Terraform 目录设为当前目录。
创建名为
providers.tf
的文件并插入下列代码:
terraform {
required_version = ">=1.0"
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~>3.0"
}
random = {
source = "hashicorp/random"
version = "~>3.0"
}
}
}
provider "azurerm" {
features {}
environment = "china"
}
- 创建名为
main.tf
的文件并插入下列代码:
# Generate random resource group name
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
}
# Generate random value for the name
resource "random_string" "name" {
length = 8
lower = true
numeric = false
special = false
upper = false
}
# Generate random value for the login password
resource "random_password" "password" {
length = 8
lower = true
min_lower = 1
min_numeric = 1
min_special = 1
min_upper = 1
numeric = true
override_special = "_"
special = true
upper = true
}
# Manages the Virtual Network
resource "azurerm_virtual_network" "default" {
address_space = ["10.0.0.0/16"]
location = azurerm_resource_group.rg.location
name = "vnet-${random_string.name.result}"
resource_group_name = azurerm_resource_group.rg.name
}
# Manages the Subnet
resource "azurerm_subnet" "default" {
address_prefixes = ["10.0.2.0/24"]
name = "subnet-${random_string.name.result}"
resource_group_name = azurerm_resource_group.rg.name
virtual_network_name = azurerm_virtual_network.default.name
service_endpoints = ["Microsoft.Storage"]
delegation {
name = "fs"
service_delegation {
name = "Microsoft.DBforMySQL/flexibleServers"
actions = [
"Microsoft.Network/virtualNetworks/subnets/join/action",
]
}
}
}
# Enables you to manage Private DNS zones within Azure DNS
resource "azurerm_private_dns_zone" "default" {
name = "${random_string.name.result}.mysql.database.chinacloudapi.cn"
resource_group_name = azurerm_resource_group.rg.name
}
# Enables you to manage Private DNS zone Virtual Network Links
resource "azurerm_private_dns_zone_virtual_network_link" "default" {
name = "mysqlfsVnetZone${random_string.name.result}.com"
private_dns_zone_name = azurerm_private_dns_zone.default.name
resource_group_name = azurerm_resource_group.rg.name
virtual_network_id = azurerm_virtual_network.default.id
depends_on = [azurerm_subnet.default]
}
# Manages the MySQL Flexible Server
resource "azurerm_mysql_flexible_server" "default" {
location = azurerm_resource_group.rg.location
name = "mysqlfs-${random_string.name.result}"
resource_group_name = azurerm_resource_group.rg.name
administrator_login = random_string.name.result
administrator_password = random_password.password.result
backup_retention_days = 7
delegated_subnet_id = azurerm_subnet.default.id
geo_redundant_backup_enabled = false
private_dns_zone_id = azurerm_private_dns_zone.default.id
sku_name = "GP_Standard_D2ds_v4"
version = "8.0.21"
high_availability {
mode = "SameZone"
}
maintenance_window {
day_of_week = 0
start_hour = 8
start_minute = 0
}
storage {
iops = 360
size_gb = 20
}
depends_on = [azurerm_private_dns_zone_virtual_network_link.default]
}
- 创建名为
mysql-fs-db.tf
的文件并插入下列代码:
# Manages the MySQL Flexible Server Database
resource "azurerm_mysql_flexible_database" "main" {
charset = "utf8mb4"
collation = "utf8mb4_unicode_ci"
name = "mysqlfsdb_${random_string.name.result}"
resource_group_name = azurerm_resource_group.rg.name
server_name = azurerm_mysql_flexible_server.default.name
}
- 创建名为
variables.tf
的文件并插入下列代码:
variable "resource_group_location" {
type = string
default = "chinanorth3"
description = "Location of the resource group."
}
variable "resource_group_name_prefix" {
type = string
default = "mysql-fs-db-rg"
description = "Prefix of the resource group name that's combined with a random ID so name is unique in your Azure subscription."
}
- 创建名为
outputs.tf
的文件并插入下列代码:
output "azurerm_mysql_flexible_server" {
value = azurerm_mysql_flexible_server.default.name
}
output "admin_login" {
value = azurerm_mysql_flexible_server.default.administrator_login
}
output "admin_password" {
sensitive = true
value = azurerm_mysql_flexible_server.default.administrator_password
}
output "mysql_flexible_server_database_name" {
value = azurerm_mysql_flexible_database.main.name
}
output "resource_group_name" {
value = azurerm_resource_group.rg.name
}
运行 terraform init,将 Terraform 部署进行初始化。 此命令将下载管理 Azure 资源所需的 Azure 提供程序。
terraform init -upgrade
要点:
- 参数
-upgrade
可将必要的提供程序插件升级到符合配置版本约束的最新版本。
运行 terraform plan 以创建执行计划。
terraform plan -out main.tfplan
要点:
terraform plan
命令将创建一个执行计划,但不会执行它。 它会确定创建配置文件中指定的配置需要执行哪些操作。 此模式允许你在对实际资源进行任何更改之前验证执行计划是否符合预期。- 使用可选
-out
参数可以为计划指定输出文件。 使用-out
参数可以确保所查看的计划与所应用的计划完全一致。 - 若要详细了解如何使执行计划和安全性持久化,请参阅安全警告一节。
运行 terraform apply,将执行计划应用到云基础结构。
terraform apply main.tfplan
要点:
- 上面的
terraform apply
命令假设之前运行了terraform plan -out main.tfplan
。 - 如果为
-out
参数指定了不同的文件名,请在对terraform apply
的调用中使用该相同文件名。 - 如果未使用
-out
参数,则只需调用不带任何参数的terraform apply
。
要显示 Azure Database for MySQL 灵活服务器数据库,请运行az mysql flexible-server db show:
az mysql flexible-server db show \
--resource-group <resource_group_name> \
--server-name <azurerm_mysql_flexible_server> \
--database-name <mysql_flexible_server_database_name>
请考虑以下要点:
<resource_group_name>
、<azurerm_mysql_flexible_server>
和<mysql_flexible_server_database_name>
的值会显示在terraform apply
输出中。 还可以运行 terraform output命令以查看这些值。
不再需要通过 Terraform 创建的资源时,请执行以下步骤:
- 运行 terraform plan 并指定
destroy
标志。
terraform plan -destroy -out main.destroy.tfplan
要点:
terraform plan
命令将创建一个执行计划,但不会执行它。 它会确定创建配置文件中指定的配置需要执行哪些操作。 此模式允许你在对实际资源进行任何更改之前验证执行计划是否符合预期。- 使用可选
-out
参数可以为计划指定输出文件。 使用-out
参数可以确保所查看的计划与所应用的计划完全一致。 - 若要详细了解如何使执行计划和安全性持久化,请参阅安全警告一节。
- 运行 terraform apply 以应用执行计划。
terraform apply main.destroy.tfplan