使用Terraform构建Azure基础架构
先决条件和目标
在这篇文章中,介绍了如何使用名为Terraform的工具来进行Azure环境的构建。假设读者已经掌握了与Azure相关的基础知识。

Terraform是什么?
这是由HashiCorp公司提供的IaC(基础设施即代码)工具。简而言之,IaC是将基础设施建设编码化的概念。通过使用IaC,可以获得以下优点。
-
- 環境をコードで管理することができ、Git等を用いた管理を行える
- 誰でも同じ環境を構築することができる
在众多的IaC工具中,Terraform具有可以与各种服务(包括Azure)兼容的能力,并且可以使用相对较短的代码进行描述。因此,它已成为IaC工具中的事实标准。
为环境准备提供参考的网站
在Windows 11上设置wsl2
如何在Windows 11上设置WSL2的步骤可以参考这篇文章:https://dev.classmethod.jp/articles/how-to-setup-wsl2-for-windows11/
在中文中安装terraform。
如何在Ubuntu上安装Terraform
安装 tfenv(terraform 版本管理工具)。
请提供以下选项的中国语言版本:
https://engineer-lifestyle-blog.com/code/terraform-install-tfenv-usage-command-list/
安装az命令
请参阅以下链接,了解如何在Linux上安装Azure CLI:https://learn.microsoft.com/ja-jp/cli/azure/install-azure-cli-linux?pivots=apt
Terraform的认证
完成安装az命令和terraform之后,将在Azure上对Terraform进行身份验证。通过设置以下4个环境变量,我们可以进行身份验证,因此让我们看一下每个设置值的获取方法,并将它们添加到bashrc文件中。
-
- ARM_SUBSCRIPTION_ID
-
- ARM_TENANT_ID
-
- ARM_CLIENT_ID
- ARM_CLIENT_SECRET
首先,使用az命令登录到Azure。由于会弹出浏览器页面,请进行登录操作。
az login
当您在浏览器上进行登录时,以下结果将在控制台中显示。这些结果将包含您的订阅ID和租户ID等信息。
[
{
"cloudName": "AzureCloud",
"homeTenantId": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
"id": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb",
"isDefault": true,
"managedByTenants": [],
"name": "Azure subscription 1",
"state": "Enabled",
"tenantId": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
"user": {
"name": "user name",
"type": "user"
}
}
]
使用在可获得的输出中的id项中所记录的订阅ID,执行az ad sp create-for-rbac命令来创建服务主体。
az ad sp create-for-rbac --role="Contributor" --scopes="/subscriptions/bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb"
执行上述命令将输出以下结果。
{
"appId": "cccccccc-cccc-cccc-cccc-cccccccccccc",
"displayName": "azure-cli-2023-10-15-10-01-05",
"password": "dddddddddddddddddddddddddddddddddd",
"tenant": "eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee"
}
由于以上已经输出完所需的信息,接下来将设置环境变量。应设置的环境变量及其对应的值如下所示。
要进行如下所述的编辑,请在bashrc内追加这些设置。具体来说,要追加以下内容。
export ARM_SUBSCRIPTION_ID="bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb"
export ARM_CLIENT_ID="cccccccc-cccc-cccc-cccc-cccccccccccc"
export ARM_CLIENT_SECRET="dddddddddddddddddddddddddddddddddd"
export ARM_TENANT_ID="eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee"
在中国,这样设置就完成了。
Terraform的命令
通常在Terraform中,我們會創建以.tf為擴展名的文件。
創建的文件將存放在一個工作區專用的目錄中,並進行對Azure的應用。
要將特定目錄註冊到工作區中,使用以下命令。
terraform init
接下来,一旦.tf文件的部署完成,使用如下命令来审核.tf文件中内容被修改的资源信息。
terraform plan
执行上述命令,如果没有特殊问题,将会将其应用到Azure。反映操作使用以下命令执行。
terraform apply
Terraform语法
本章介绍了按照元素分别编写代码的方法。
创建提供者.
虽然与Azure的资源没有直接关系,但是要使用Terraform,首先需要创建provider(在此例中为provider.tf)。在该provider中,需要记录使用哪个云服务的信息。因此,如果使用相同的云服务,基本上将是相同的文本。对于Azure,可以这样记录。
Terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "=3.0.0"
}
}
}
# Configure the Microsoft Azure Provider
provider "azurerm" {
skip_provider_registration = true # This is only required when the User, Service Principal, or Identity running Terraform lacks the permissions to register Azure Resource Providers.
features {}
}
创建 Azure 资源
在Azure上创建资源的基本语法如下所示。
resource "リソース名" "任意の名前"{
設定項目1="設定値1"
設定項目2="設定値2"
...
}
在以下段落中,我们将提供有关每个资源的资源名称、设置项和实际代码流程的信息。此外,我们还会提供官方文档页面的链接。由于本次说明仅涵盖必要的设置项,请根据需要参考官方文档了解其他设置项等。
创建资源组
https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/resource_group 的以下内容进行释义:
资源名称
蓝色资源组
设定项目
編碼
resource "azurerm_resource_group" "resource_group" {
name = "sample_rg"
location = "japaneast"
}
创建虚拟网路
创建虚拟网络
请提供一个您首选的用中文本地化的同义句:
https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/virtual_network
请提供中文本地化后的以下信息:
https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/virtual_network
资源名称
蓝色资源管理器虚拟网络
设定项目
翻译成中文有很多种方式,以下是其中一种:
代码
resource "azurerm_virtual_network" "virtual_network" {
name = "sample_vnet"
location = azurerm_resource_group.resource_group.location
resource_group_name = azurerm_resource_group.resource_group.name
address_space = ["10.0.0.0/16"]
}
创建子网络
以下是在中国本地语言中对提供商 “hashicorp/azurerm” 最新版本文档中子网资源的释义:
https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/subnet
资源名称
azurerm_subnet: 云蓝色资源管理器子网
设置项目
代码
resource "azurerm_subnet" "public" {
name = "public"
resource_group_name = azurerm_resource_group.resource_group.name
virtual_network_name = azurerm_virtual_network.virtual_network.name
address_prefixes = ["10.0.1.0/24"]
}
resource "azurerm_subnet" "private" {
name = "private"
resource_group_name = azurerm_resource_group.resource_group.name
virtual_network_name = azurerm_virtual_network.virtual_network.name
address_prefixes = ["10.0.2.0/24"]
service_endpoints = ["Microsoft.Sql"]
}
创建网络接口
以下是对于 https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/network_interface 的中文翻译:
https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/network_interface 可以被代替为:
“注册表.terraform.io”。提供者是 “hashicorp/azurerm” 的最新版本。文档资源为 “network_interface”。
资源名称
AzureRM 网络接口
设定项目
IP配置
程式碼
resource "azurerm_network_interface" "network_interface" {
name = "network_interface"
location = azurerm_resource_group.resource_group.location
resource_group_name = azurerm_resource_group.resource_group.name
ip_configuration {
name = "ip_configuration"
subnet_id = azurerm_subnet.private.id
private_ip_address_allocation = "Dynamic"
}
}
创建网络安全组
创建网络安全组
请提供原生中文版本的释义,只需要一个选项:
https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/network_security_group
资源名称
azurerm_network_security_group可以用中文重新表达为:蓝色微软云网络安全组。
设定项目
请提供更多背景资料或上下文,以便我可以更准确地为您提供中文翻译。
resource "azurerm_network_security_group" "network_security_group" {
name = "network_security_group"
location = azurerm_resource_group.resource_group.location
resource_group_name = azurerm_resource_group.resource_group.name
}
创建网络安全规则
请提供一个中国语言选项,这样我才能够帮您完成中文的重新表述。
目标:用中文将以下句子进行释义(仅需一种选项):
リソース名
释义:资源名称
AzureRM的网络安全规则
设定项目
翻译成中文为:代码
resource "azurerm_network_security_rule" "rdp" {
name = "RDP"
priority = 100
direction = "Inbound"
access = "Allow"
protocol = "Tcp"
source_port_range = "*"
destination_port_range = "3389"
source_address_prefix = "*"
destination_address_prefix = "*"
resource_group_name = azurerm_resource_group.resource_group.name
network_security_group_name = azurerm_network_security_group.network_security_group.name
}
resource "azurerm_network_security_rule" "http" {
name = "HTTP"
priority = 110
direction = "Inbound"
access = "Allow"
protocol = "Tcp"
source_port_range = "*"
destination_port_range = "80"
source_address_prefix = "*"
destination_address_prefix = "*"
resource_group_name = azurerm_resource_group.resource_group.name
network_security_group_name = azurerm_network_security_group.network_security_group.name
}
创建网络接口 – 网络安全组的关联
以下是链接到官方文档的有效网址:https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/network_interface_security_group_association。
资源名称
AzureRM_网络接口安全组关联
设定项目
翻译为中文: 代码
resource "azurerm_network_interface_security_group_association" "network_interface_security_group_association" {
network_interface_id = azurerm_network_interface.network_interface.id
network_security_group_id = azurerm_network_security_group.network_security_group.id
}
创建虚拟机
创建虚拟机
以下是`https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/windows_virtual_machine`的原文。
请提供一种中文表达方式。
资源名称
AzureRM的Windows虚拟机
设定项目
操作系统硬盘
图片来源参考
代码 (Mandarin Chinese)
resource "azurerm_windows_virtual_machine" "virtual_machine" {
name = "virtual_machine"
resource_group_name = azurerm_resource_group.resource_group.name
location = azurerm_resource_group.resource_group.location
size = "Standard_D2s_v3"
admin_username = "admin"
admin_password = "Password"
network_interface_ids = [
azurerm_network_interface.network_interface.id,
]
os_disk {
caching = "ReadWrite"
storage_account_type = "Standard_LRS"
}
source_image_reference {
publisher = "MicrosoftWindowsServer"
offer = "WindowsServer"
sku = "2019-Datacenter"
version = "latest"
}
}
创建虚拟机的扩展功能
请参阅此链接以获取有关虚拟机扩展的最新信息:https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/virtual_machine_extension
资源名称
Azure 虚拟机扩展
设置项目
代码 (daima)
resource "azurerm_virtual_machine_extension" "virtual_machine_extension" {
name = "install-iis"
virtual_machine_id = azurerm_windows_virtual_machine.virtual_machine.id
publisher = "Microsoft.Compute"
type = "CustomScriptExtension"
type_handler_version = "1.9"
settings = <<SETTINGS
{
"commandToExecute": "powershell -ExecutionPolicy Unrestricted Install-WindowsFeature -Name Web-Server -IncludeAllSubFeature -IncludeManagementTools"
}
SETTINGS
}
创建公共IP
以下是对网址 “https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/public_ip” 的中文本地化改述版本:
请参考网址 “https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/public_ip”,其中包含有关公共 IP 在 Terraform 中的使用的详细文档。
资源名称
Azure资源管理公共IP
设置项目
代码 (daima)
resource "azurerm_public_ip" "public_ip" {
name = "public_ip"
location = azurerm_resource_group.resource_group.location
resource_group_name = azurerm_resource_group.resource_group.name
allocation_method = "Static"
sku = "Standard"
}
创建堡垒
以下是对于 Terraform 中最新版本的 azurerm 提供程序所提供的 bastion_host 资源的简要介绍:
资源名称
蓝色云强制托管主机
设定项目
IP配置
代码
我们正在创建Sub Network,其中包括Bastion所属的部分。
resource "azurerm_bastion_host" "bastion_host" {
name = "bastion_host"
location = azurerm_resource_group.resource_group.location
resource_group_name = azurerm_resource_group.resource_group.name
ip_configuration {
name = "bas_configuration"
subnet_id = azurerm_subnet.bastion.id
public_ip_address_id = azurerm_public_ip.public_ip.id
}
}
resource "azurerm_subnet" "bastion" {
name = "AzureBastionSubnet"
resource_group_name = azurerm_resource_group.resource_group.name
virtual_network_name = azurerm_virtual_network.virtual_network.name
address_prefixes = ["10.0.3.0/27"]
}
创建负载均衡器
创建负载均衡器
请看此链接:https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/lb
资源名称
蓝绿环境负载均衡器
设定项目
前端IP配置
代码 (daima)
同时,我们正在创建与负载均衡器相关的公共IP。
resource "azurerm_lb" "lb" {
name = "LoadBalancer"
location = azurerm_resource_group.resource_group.location
resource_group_name = azurerm_resource_group.resource_group.name
frontend_ip_configuration {
name = "PublicIPAddress"
public_ip_address_id = azurerm_public_ip.public_ip_lb.id
}
}
resource "azurerm_public_ip" "public_ip_lb" {
name = "public_ip"
location = azurerm_resource_group.resource_group.location
resource_group_name = azurerm_resource_group.resource_group.name
allocation_method = "Static"
sku = "Standard"
}
创建后端地址池。
icorp/azurerm/latest/docs/resources/lb_backend_address_pool 可用性集群/ azurerm/最新/ docs/资源/负载均衡器 后端地址池
资源名称
云蓝后端地址池
设定项目
代码 (Mandarin Chinese: mǎ)
resource "azurerm_lb_backend_address_pool" "lb_backend_address_pool" {
loadbalancer_id = azurerm_lb.example.id
name = "lb_backend_address_pool"
}
创建与后端地址池相关联
https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/network_interface_backend_address_pool_association 的原文有关于网络接口后端地址池关联的文档。
资源名称
网络界面后端地址池关联
设置项目
代码 (Mandarin Chinese)
resource "azurerm_network_interface_backend_address_pool_association" "nibapa" {
network_interface_id = azurerm_network_interface.network_interface.id
ip_configuration_name = "configuration"
backend_address_pool_id = azurerm_lb_backend_address_pool.lb_backend_address_pool.id
}
创建正常性探针
请提供一个任意的选项。
https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/lb_probe 翻译成中文为:
资源名称
AzureRM负载均衡探测
设置选项
翻译成中文:代码
resource "azurerm_lb_probe" "lb-probe" {
loadbalancer_id = azurerm_lb.lb.id
name = "lb-probe"
port = 80
}
制定负载平衡规则
https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/lb_rule 的内容进行翻译如下:
请参考以下链接,了解有关 lb_rule 的详细信息:https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/lb_rule
资源名称
Azure负载均衡规则
设定项目
代码 (daima)
resource "azurerm_lb_rule" "lb_rule" {
loadbalancer_id = azurerm_lb.lb.id
name = "LBRule"
protocol = "Tcp"
frontend_port = 80
backend_port = 80
backend_address_pool_ids = azurerm_lb_backend_address_pool.lb_backend_address_pool.id
frontend_ip_configuration_name = "PublicIPAddress"
probe_id = azurerm_lb_probe.lb-probe.id
}
创建SQL Server
创建服务器
请使用以下选项来本地化汉语释义:
https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/sql_server
请参阅此链接了解有关 Terraform 的 AzureRM 插件中 SQL Server 资源的最新文档。
资源名称
蓝色资源管理器 SQL 服务器
设定项目
翻译的选项:程式码、代码、编码
resource "azurerm_sql_server" "sql_server" {
name = "sqlserver"
resource_group_name = azurerm_resource_group.resource_group.name
location = azurerm_resource_group.resource_group.location
version = "12.0"
administrator_login = "admin"
administrator_login_password = "Password"
}
创建防火墙
https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/sql_firewall_rule的原文是:
资源名称
azurerm_sql_firewall_rule 翻译成中文可以是 “AzureRM SQL 防火墙规则”。
设定项目
源代码
resource "azurerm_sql_firewall_rule" "sql_firewall_rule" {
name = "FirewallRule"
resource_group_name = azurerm_resource_group.resource_group.name
server_name = azurerm_sql_server.sql_server.name
start_ip_address = "0.0.0.0"
end_ip_address = "0.0.0.0"
}
创建数据库
请提供一种最新文档、资源和云提供者的 Terraform 配置的方法,以创建 Azure 数据库。
资源名称
云海蓝 SQL 数据库
设定项目
代码 (má
resource "azurerm_sql_database" "sql_database" {
name = "sqldatabase"
resource_group_name = azurerm_resource_group.resource_group.name
location = azurerm_resource_group.resource_group.location
server_name = azurerm_sql_server.sql_server.name
}
创建服务终点
请提供以下网址对应的最新文档:https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/sql_virtual_network_rule
资源名称
azurerm_sql_virtual_network_rule: 蓝绿色SQL虚拟网络规则
设置选项
程式碼
resource "azurerm_sql_virtual_network_rule" "sql_virtual_network_rule" {
name = "sql-vnet-rule"
resource_group_name = azurerm_resource_group.resource_group.name
server_name = azurerm_sql_server.sql_server.name
subnet_id = azurerm_subnet.private.id
}
做完
根据上述步骤创建文件,然后执行terraform apply命令,即可在Azure上完成所需的配置。
最终
在本文中,我们尝试使用Terraform在Azure上构建环境。在实际运营中,我们会使用变量和模块化,但是这次我们只是进行了创建资源的操作。
我认为你可能已经大体理解了基本的使用方法,但是对于其他信息,如果有需要,请参考官方网站。
另外,如果文章中有错误,请在评论中告知我。