使用 ARM 模板和 Terraform 进行多云基础设施即代码(第二部分):Azure 和 Terraform 的多云 IaC





5.00/5 (1投票)
如何部署您自己的简单多云环境,托管在 Azure 和 DigitalOcean 上。
在上一篇文章中,我们讨论了支持多云的好处以及它可能带来的困难。部署到多云环境对已经投入时间和资源来优化一个环境基础设施即代码的 DevOps 团队构成了挑战。
如果您的应用程序目前在 Azure 上运行,那么您很可能正在使用仅适用于 Azure 的 Azure Resource Manager (ARM) 模板来自动化基础设施任务。然而,好消息是,为您的应用程序采用多云可能不像您想象的那么复杂,因为 ARM 模板也可以在多云场景中与 Terraform 一起使用。
在本文中,我们将介绍如何结合使用 Bicep 和 ARM 模板来为 Azure 部署一个简单的 Linux 虚拟机。然后,我们将使用 Terraform 将一个类似的 Linux 虚拟机部署到 DigitalOcean droplet,并将它们合并到一个 Terraform 中,该 Terraform 可以同时向两个云平台部署虚拟机。
这是我们今天将使用的 IaC 代码的链接。
要求
在开始之前,您需要以下准备
- 一个 Azure 订阅。如果您还没有,可以创建一个免费帐户。
- 一个DigitalOcean 帐户
准备就绪后,创建一个新的项目文件夹,然后在终端或命令提示符窗口中打开它。
使用 Bicep 和 ARM 部署 VM 到 Azure
Bicep 是一种声明式 IaC 语言,它构建于 ARM 模板之上。它更简洁、更易于阅读,并提供了一种在执行任务之前轻松验证云配置的方法。
我们将使用 Bicep 文件生成 ARM 模板并在 Azure 上部署一个简单的虚拟机。
配置 Azure
首先,请确保您已下载并安装Azure CLI。您可以使用它将 ARM 模板部署到您的 Azure 帐户。
您可以使用命令 az version
进行检查。
接下来,使用以下命令登录到您的 Azure 帐户:az login。
这将打开一个网页,供您使用 Azure 凭据登录。
登录后,您需要获取 Azure 订阅的 ID,以便将其设置为 CLI 中的活动订阅。
通过以下命令列出您的 Azure 帐户来执行此操作
az account list
然后设置当前订阅
az account set –subscription <YOUR-SUBSCRIPTION-ID>
为了完成配置,请创建一个 Azure 资源组,VM 将在该资源组下部署。我们可以使用一个名称,例如“armTest
”,区域可以设置为“eastus
”。
az group create --name armTest --location eastus
从 Bicep 文件生成 ARM 模板
现在我们已经设置好了 Azure,可以开始使用 IaC 创建一个简单的 VM 了。在本教程中,我们将使用 Azure QuickStart Templates 中的简单 Linux VM Bicep 文件。在此处下载它并将其保存到您的项目文件夹。
此 Bicep 文件会提示输入两个参数:adminUsername
和 adminPasswordOrKey
,并配置一个小型 Ubuntu 实例及其虚拟网络。
现在,我们可以通过运行以下命令将 Bicep 文件构建成 ARM 模板
az bicep build --file main.bicep
这将在与 main.json 相同的目录中生成 ARM 模板文件。
将 ARM 模板部署到 Azure
让我们使用生成的 ARM 模板将 VM 部署到 Azure。
运行以下命令,在提示时,输入您希望用于通过 SSH 登录 VM 的管理员密码
az deployment group create --resource-group armTest
--template-file main.json --parameters adminUsername=TestAdmin
测试虚拟机
部署完成后,您可能需要向上滚动到“outputs
”部分,找到主机名和 SSH 命令。我们将使用此命令直接连接到虚拟机。
清理
成功测试部署后,我们可以从 Azure 中删除虚拟机,以释放 Azure 订阅上的资源。为此,请运行 group delete
命令以删除该组内的所有资源
az group delete --name armTest
恭喜!您现在已经使用 Bicep 文件在 Azure 云上进行了部署!
使用 Terraform 将虚拟机部署到 DigitalOcean
Terraform 是一个流行的开源基础设施即代码工具,支持包括 Azure 和 DigitalOcean 在内的各种云提供商。
接下来,我们将创建一个 Terraform 配置,将我们在 Azure 上部署的 Linux 虚拟机部署到 DigitalOcean droplet。
配置 Terraform
首先,下载Terraform 命令行工具并将其解压到项目文件夹。
接下来,创建一个名为 main.tf 的文件并将以下代码粘贴进去
terraform {
required_providers {
digitalocean = {
source = "digitalocean/digitalocean"
version = "~> 2.0"
}
}
}
variable "do_token" {
default = "YOUR_ACCESS_TOKEN"
}
provider "digitalocean" {
token = var.do_token
}
resource "digitalocean_droplet" "web-1" {
image = "ubuntu-18-04-x64"
name = "web-1"
region = "nyc3"
size = "s-1vcpu-1gb"
}
此代码将 DigitalOcean 添加为必需的提供程序,从变量中设置访问令牌,并在 nyc3 区域中定义一个名为 web-1 的小型 Ubuntu 实例。
现在,打开您的DigitalOcean API Dashboard 页面,通过单击 Generate New Token,指定一个 Token Name,然后单击 Generate Token 来创建一个个人访问令牌。如果您希望长时间使用该令牌,也可以将 Expiration 选项更改为 No expiry。请务必妥善保管此令牌。
在 main.tf 文件中,将代码中的“YOUR_ACCESS_TOKEN“值替换为生成的令牌。这是 Terraform 将用于将 VM 部署到您的 DigitalOcean droplet 的访问令牌。
将 Terraform 部署到 DigitalOcean
在终端窗口中,运行 terraform init
来初始化项目文件夹。这将读取 main.tf 文件,并使用 Terraform 锁文件准备目录。
我们现在可以使用此命令测试我们的 Terraform
terraform plan
上面的代码片段执行一次试运行,并显示本地 Terraform 配置与已部署的基础设施之间存在哪些差异。由于我们还没有部署任何内容,因此它应该显示有一个虚拟机需要添加。
当一切看起来都很好时,尝试运行以下命令来部署 VM
terraform apply
测试虚拟机
将资源添加到 DigitalOcean 后,web-1 droplet 现在应该存在于您的 DigitalOcean 项目仪表板中,并附有公共 IP 地址。如果您愿意,可以使用此地址直接连接到 VM。暂时,让我们使用 Web 控制台进行连接。
单击 … 按钮,然后选择 Access console 以进入 Droplet 控制台页面。
单击 Launch Droplet Console 以通过 SSH 连接到虚拟机。
这将启动实例的 Web 控制台,并要求您更改 root 密码。
请务必检查您的收件箱,查找来自 DigitalOcean 的有关您的临时 root 密码的电子邮件。
清理
由于 Terraform 维护着本地基础设施代码与已部署云环境之间的差异,因此我们可以通过简单地删除 main.tf 中的资源列表来删除此 droplet。使用井号(#)注释掉资源,如下所示
#resource "digitalocean_droplet" "web-1" {
# image = "ubuntu-18-04-x64"
# name = "web-1"
# region = "nyc3"
# size = "s-1vcpu-1gb"
#}
现在,当您运行 terraform apply 时,它将从您的 DigitalOcean 帐户中销毁 VM。
部署您的多云环境使用 Terraform
是时候将我们的 ARM 模板和 Terraform 整合在一起了。
由于我们已经登录到 Azure CLI,因此这次不需要向 Terraform 指定 Azure 凭据。
修改 Terraform 以支持多云
首先,打开 main.tf 并将 Azure 添加为与 DigitalOcean 并列的必需提供程序,如下所示
terraform {
required_providers {
digitalocean = {
source = "digitalocean/digitalocean"
version = "~> 2.0"
}
azurerm = {
source = "hashicorp/azurerm"
version = "3.8.0"
}
}
}
在文件底部将 Azure 提供程序和两个参数 adminUsername
和 adminPasswordOrKey
指定为变量。这会在部署时像 ARM 模板一样提示用户输入密码参数。
provider "azurerm" {
features {}
}
variable "adminUsername" {
type = string
default = "TestAdmin"
}
variable "adminPasswordOrKey" {
type = string
sensitive = true
}
最后,我们可以定义资源并将我们之前创建的 ARM 模板作为文件加载到 template_content
中。
resource "azurerm_resource_group_template_deployment" "web-1" {
name = "web-1-deploy"
resource_group_name = "armTest"
deployment_mode = "Incremental"
parameters_content = jsonencode({
"adminUsername" = {
value = var.adminUsername
}
"adminPasswordOrKey" = {
value = var.adminPasswordOrKey
}
})
template_content = file("./main.json", )
}
将 Terraform 部署到 Azure 和 DigitalOcean
在部署之前,我们必须确保已创建 Azure 资源组。
如果您在教程的早期部分将其删除,请再次运行 az group create –name armTest –location eastus
来重新创建资源组。
现在,运行 terraform init
以注册 Azure 作为必需的提供程序。
我们现在可以使用 terraform plan 来试运行配置,以查看它是否将两个虚拟机识别为新资源。
不要忘记取消注释 Terraform 中的 DigitalOcean 资源块。
最后,运行 terraform apply
来运行 Terraform 并同时创建两个环境。
完成后,您可以通过 SSH 连接到虚拟机来测试已部署的环境,就像之前测试 Azure 和 DigitalOcean VM 一样。
最终清理
最后,我们将通过运行 terraform destroy
命令来完全销毁 Terraform 创建的资源。
就是这样!您已成功使用基础设施即代码部署和退役了多云配置。
下一步
在本文中,您学会了部署自己的托管在 Azure 和 DigitalOcean 上的简单多云环境。请记住,Terraform 不仅限于这两个提供程序,还有许多其他提供程序,例如 AWS、Google Cloud Platform、Kubernetes 和 Alibaba Cloud,如此处列出的。如果您想查看此项目的完整代码,请在此处下载。
现在我们有了适用于此多云配置的 Terraform 基础设施代码,让我们将其推送到 GitHub 存储库,并像真正的 DevOps 成员一样实现自动化。请在本系列的最后一部分中了解如何操作。
要详细了解如何在任何地方安全地保护、开发和操作基础设施、应用程序和 Azure 服务,请参阅我们的资源Azure Arc。