基础设施即代码和 Pulumi 在 Azure 上的应用简介
在本文中,我们将通过 Pulumi 轻松了解基础设施即代码。
下载 Pulumi-Azure-VM-Examples-main.zip
随着云环境的不断成熟,基础设施即代码 (IaC) 已获得巨大普及。它涉及广泛的实践,但其核心是使用与开发团队相同的实践来构建环境。
本系列文章将探讨 Pulumi 平台,并使用它来构建现代 Web 应用程序中使用的 Azure 云资源——所有这些都将使用现有编程语言,包括 TypeScript。
在本文中,我们将研究 Pulumi 与其他 IaC 工具之间的一些区别,并设置和配置 Pulumi CLI。最后,我们将通过一些示例,使用 JavaScript、TypeScript 和 C# 在 Azure 中构建简单的虚拟机 (VM)。
什么是 IaC?
当我们传统上考虑构建用于托管应用程序的组件(例如服务器、数据库或网络)时,我们通常使用手动过程创建和配置这些项目。典型的工作流程可能是创建虚拟机、指定其大小和配置、安装和配置操作系统,以及使用用户界面将其添加到网络。
相比之下,IaC 使用包含我们规范的配置文件来处理此工作,通常使用与应用程序源代码相同的存储库和版本控制团队。这使我们能够在每次应用配置文件时生成相同的基础设施环境。
IaC 工具
有几个 IaC 平台允许您以这种方式构建基础设施。Terraform、Puppet 和 Ansible 都是 IaC 工具的示例,它们跨云提供商工作以构建您的基础设施。主要云平台还拥有特定于其云环境的 IaC 工具。AWS 有 CloudFormation,Azure 有 Azure Resource Manager (ARM),Google 有 Google Cloud Deployment Manager。
然而,这些工具大多使用自定义编程语言,或仅限于单一语言。这正是 Pulumi 的显著不同之处。您可以利用开发中常用的各种命令式语言,包括 JavaScript、TypeScript、C# 和 Java。因此,我们可以轻松集成常见的开发工具,例如 IDE、可重用代码和测试。
设置 Pulumi
这一切听起来很棒,但让我们看看如何用几种不同的语言在 Azure 上构建一个简单的虚拟机,以了解 Pulumi 的工作原理。
首先,我们需要设置和配置 Pulumi。Pulumi 是开源且免费的。它使用云服务来提供状态和秘密管理、源代码控制和其他功能。您也可以提供一个自托管服务,但这不在本文的讨论范围之内。
首先,使用 GitHub、GitLab 或 Atlassian 凭据创建帐户 — 或注册您的电子邮件地址。
接下来,我们需要使用提供的文档安装 Pulumi CLI。
我们还需要确保 Pulumi 可以访问 Azure,无论是通过使用 Azure CLI 还是服务主体。更简单的方法是通过 Azure 命令行,如果您经常使用 Azure,您可能已经设置了它。
最后,如果您使用 Pulumi 服务来存储状态和配置,您需要在 Pulumi 门户的设置部分生成一个访问令牌。创建新令牌后,您可以切换到命令提示符并使用命令pulumi login
并提供令牌将 Pulumi CLI 连接到服务。
使用 Pulumi 构建虚拟机
我们现在可以搭建一个 Azure 基础设施项目并开始构建我们的基础设施。Pulumi 为各种云提供商(包括 Azure)提供了几种基本模板,涵盖其支持的语言。构建基础设施可以是顺序的,但您应该始终寻找并行运行步骤的机会。
为了展示 Pulumi 的功能,让我们来看看使用不同语言构建的简单 Azure VM。我们将首先使用 Node.js 在 JavaScript 中构建一个 VM,然后查看 TypeScript 和 C# 中的相同基础设施。
Azure 中的一个简单 VM 需要以下资源
- 包含资源的资源组
- 用于存储我们在 VM 中使用的任何磁盘的存储帐户
- 用于网络访问的公共 IP 地址
- 用于允许和拒绝流量的安全组
- 包含虚拟机 IP 地址的虚拟网络
- 使虚拟机能够连接到网络的虚拟网络接口
- 虚拟机
用 JavaScript 构建虚拟机
构建基础设施的第一步是搭建一个项目。我们通过创建目录并使用 CLI 命令来完成此操作
pulumi new azure-javascript
然后 CLI 会提示输入项目名称、项目描述和堆栈。由于我们使用的是 Azure 模板,CLI 还会要求我们提供资源的默认位置,以防我们未在配置中指定此位置。
一旦这个初始项目设置完成,index.js 文件中将有一个示例基础设施配置,它会创建一个资源组和存储帐户,并检索存储帐户密钥。让我们将此默认值减少到只创建一个资源组
"use strict";
const azure = require("@pulumi/azure-native");
/**
Create an Azure Resource Group
*/
const resourceGroup = new azure.resources.ResourceGroup("gp-pulumi-example-rg");
此代码块在 Pulumi 中初始化azure-native
库,然后创建一个新的 Azure 资源组,该资源组将保存在resourceGroup
变量中。将创建的资源返回到变量中的一个巨大优势是我们可以使用返回的属性来配置其他资源。Pulumi 会跟踪依赖项,但我们也可以使用其他对象或函数指定依赖项。
让我们通过使用以下代码块创建一个新的存储帐户来了解这两个功能如何工作
/**
Create an Azure resource (Storage Account)
*/
const storageAccount = new azure.storage.StorageAccount("pulumiexamplesa", {
resourceGroupName: resourceGroup.name,
sku: {
name: "Standard_LRS",
},
kind: "StorageV2",
dependsOn: [
resourceGroup
]
});
此代码提供了更多配置,对存储名称、SKU 等进行硬编码。请注意,我们还使用了资源组的name
属性,并指定我们依赖于资源组的创建,然后才尝试创建存储帐户。
我们可以重复相同的过程来创建公共 IP 地址、安全组、虚拟网络、网络接口和虚拟机。构建整个虚拟机的最终代码可以在此处找到。
现在我们已经构建了所有虚拟机配置,我们可以使用pulumi up
命令在 Azure 中创建资源。Pulumi 会首先显示我们要构建的内容,然后我们才会构建资源。
现在,如果我们检查 Azure 环境,我们应该会看到一个包含虚拟机和其他资源的新资源组。要折叠此环境并删除所有资源,我们可以运行pulumi down
。
其他语言中的虚拟机
让我们看看相同的 VM,但是用 TypeScript 和 C# 构建的。TypeScript 代码可以在此处找到。
如您所见,当我们构建基础设施时,TypeScript 与 JavaScript 非常相似。主要区别在于导入更加具体。类型转换也使代码有点冗长。
例如,查看代码中的第 76 行,它看起来像这样
const subnet = virtualNetwork.subnets.apply(subnet => subnet![0])
此行专门检索虚拟网络的第一个子网,以便我们以后可以将其应用于网络接口。
现在,让我们快速看一下 C# 部署代码此处。
此代码有点不同。主程序在Program.cs文件中定义,其中一个异步任务运行MyStack.cs中的部署配置文件。这是因为 Pulumi 会像任何其他 dotnet 应用程序一样构建代码。
检查MyStack.cs文件中的代码,我们可以看到与 JavaScript 文件类似的构建过程。这个文件有点冗长,因为我们需要处理 C# 类型和命名空间以确保一致性。
后续步骤
在 Azure 中编写一个简单的 VM 并不是一项过于复杂的任务,Pulumi 可以处理使用您选择的语言构建虚拟机的所有细微差别。虽然我们刚刚触及了使用 Pulumi 设置和部署基础设施的基础知识,但我们接下来的两篇文章将更深入地探讨这个概念。
从下一篇文章开始,我们将开始使用 TypeScript 开发一个完整的 Web 应用程序基础设施。稍后,我们还将创建测试以确保我们的配置正确部署。请务必查看 Pulumi 大量的文档及其 GitHub 存储库上的众多示例。
要了解有关使用 Azure Pulumi 进行云工程的更多信息,请查看资源使用 Azure Pulumi 进行云工程。