在 Azure PowerShell 中使用脚本创建 Azure 资源

已完成

在交互模式中,使用 PowerShell 可以编写命令并立即执行它们。

回想一下,客户关系管理 (CRM) 示例中的总体目标是创建三个包含虚拟机的测试环境。 使用资源组来确保已将 VM 组织到单独的环境中:一个用于单元测试、一个用于集成测试、一个用于验收测试。 只需要创建一次资源组,因此在此用例中使用 PowerShell 交互模式是一个不错的选择。

在 PowerShell 中输入命令时,PowerShell 会将命令与 cmdlet 匹配,然后执行请求的操作。 首先,我们将了解一些可用的常见命令,然后研究如何安装 PowerShell 的 Azure 支持。

什么是 PowerShell cmdlet?

PowerShell 命令称为“cmdlet”(读成“command-let”)。 cmdlet 是操纵单个功能的命令。 “cmdlet”一词用于表示“小命令”。按照惯例,cmdlet 作者应使 cmdlet 保持简单且用途单一。

基本 PowerShell 产品附带可用于会话和后台作业等功能的 cmdlet。 你可将模块添加到 PowerShell 安装以获取操纵其他功能的 cmdlet。 例如,有些第三方模块可用于 ftp、管理操作系统、访问文件系统等。

Cmdlet 遵循谓词-名词命名约定,例如 Get-ProcessFormat-TableStart-Service。 谓词选择也有一个约定:“get”用于检索数据、“set”用于插入或更新数据、“format”用于格式化数据、“out”用于将输出定向到目标等。

建议 cmdlet 创建者为每个 cmdlet 随附一个帮助文件。 Get-Help cmdlet 显示任何 cmdlet 的帮助文件。 例如,要获取有关 Get-ChildItem cmdlet 的帮助,请在 Windows PowerShell 会话中输入以下语句:

Get-Help -Name Get-ChildItem -Detailed

什么是 PowerShell 模块?

Cmdlet 在模块中提供。 PowerShell 模块是一个动态链接库 (DLL),其中包含用于处理每个可用 cmdlet 的代码。 通过加载包含 cmdlet 的模块,将这些 cmdlet 载入 PowerShell。 可以使用 Get-Module 命令获取已加载的模块列表:

Get-Module

该命令输出如下信息:

ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Manifest   3.1.0.0    Microsoft.PowerShell.Management     {Add-Computer, Add-Content, Checkpoint-Computer, Clear-Con...
Manifest   3.1.0.0    Microsoft.PowerShell.Utility        {Add-Member, Add-Type, Clear-Variable, Compare-Object...}
Binary     1.0.0.1    PackageManagement                   {Find-Package, Find-PackageProvider, Get-Package, Get-Pack...
Script     1.0.0.1    PowerShellGet                       {Find-Command, Find-DscResource, Find-Module, Find-RoleCap...
Script     2.0.0      PSReadline                          {Get-PSReadLineKeyHandler, Get-PSReadLineOption, Remove-PS...

什么是 Az PowerShell 模块?

“Az”是 Azure PowerShell 模块的正式名称,其中包含用于处理 Azure 功能的 cmdlet。 它包含数百个 cmdlet,可以控制几乎每个 Azure 资源的所有方面。 你可以使用资源组、存储、虚拟机、Microsoft Entra ID、容器、机器学习,等等。 Az 模块是 GitHub 中提供的开源组件。

备注

你可能见过或使用过使用 -AzureRM 格式的 Azure PowerShell 命令。 由于 Az PowerShell 模块现在已具有 AzureRM PowerShell 模块的所有功能及更多功能,因此我们将于 2024 年 2 月 29 日停用 AzureRM PowerShell 模块。 若要避免服务中断,请更新脚本,在 2024 年 2 月 29 日结束之前将使用 AzureRM PowerShell 模块的脚本更新为使用 Az PowerShell 模块。 若要自动更新脚本,请按照快速入门指南操作。

安装 Az PowerShell 模块

名为“PowerShell 库”的全局存储库中提供了 Az PowerShell 模块。 可以通过 Install-Module cmdlet 在本地计算机上安装该模块。

若要安装最新的 Azure Az PowerShell 模块,请运行以下命令:

  1. 打开“开始”菜单,输入 PowerShell。

  2. 选择 PowerShell 图标。

  3. 键入以下命令并按 Enter

    Install-Module -Name Az -Scope CurrentUser -Repository PSGallery
    

上面的命令将为当前用户安装模块(由 Scope 参数控制)。

该命令依赖于使用 NuGet 来检索组件。 因此根据已安装的版本,系统可能会提示下载并安装最新版 NuGet。

NuGet provider is required to continue
PowerShellGet requires NuGet provider version '2.8.5.201' or newer to interact with NuGet-based repositories. The NuGet
 provider must be available in 'C:\Program Files\PackageManagement\ProviderAssemblies' or
'C:\Users\<username>\AppData\Local\PackageManagement\ProviderAssemblies'. You can also install the NuGet provider by running
'Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force'. Do you want PowerShellGet to install and import
 the NuGet provider now?
 [Y] Yes  [N] No  [S] Suspend  [?] Help (default is "Y"):

输入 Y,然后按 Enter

默认情况下,PowerShell 库未配置为 PowerShellGet 的受信任存储库。 每次从不受信任的存储库执行安装时,系统都会提示你确认是否要安装包含以下输出的模块:

You are installing the modules from an untrusted repository. If you trust this repository, change its
InstallationPolicy value by running the Set-PSRepository cmdlet. Are you sure you want to install the modules from
'PSGallery'?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "N"):

输入 Y 或 A,然后按 Enter

脚本执行失败

根据安全配置,Import-Module 可能会失败并返回如下所示的输出:

import-module : File C:\Program Files\PowerShell\Modules\az\6.3.0\Az.psm1 cannot be loaded
because running scripts is disabled on this system. For more information, see about_Execution_Policies at
https:/go.microsoft.com/fwlink/?LinkID=135170.
At line:1 char:1
+ import-module Az
+ ~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : SecurityError: (:) [Import-Module], PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess,Microsoft.PowerShell.Commands.ImportModuleCommand

它也可能因为完全不响应而失败。 在这种情况下,按 Ctrl+C 停止程序。

这两种行为通常表示执行策略“受限制”,即无法运行从外部源(包括 PowerShell 库)下载的模块。 可运行 Get-ExecutionPolicy cmdlet 进行检查。 如果 cmdlet 返回“Restricted”,则:

  1. 使用 Set-ExecutionPolicy cmdlet 将策略更改为“RemoteSigned”:

    Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
    

    系统提示你需要权限:

    The execution policy helps protect you from scripts that you do not trust. Changing the execution policy might expose
    you to the security risks described in the about_Execution_Policies help topic at
    https:/go.microsoft.com/fwlink/?LinkID=135170. Do you want to change the execution policy?
    [Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "N"): Y
    
  2. 输入 Y 或 A,然后按 Enter

  3. 在命令提示符下处,使用键盘上的向上箭头并为 Azure 重新运行 Install-Module 命令。

应会看到 Az PowerShell 模块加载。 完成后,你将能够使用 Import-Module 加载 cmdlet。

在 Linux 或 macOS 上安装 Azure PowerShell 时可使用相同的命令。

  1. 在终端中,运行以下命令以启动 PowerShell。

    pwsh
    
  2. 若要安装 Azure PowerShell,请在 PowerShell 提示符处运行以下命令。

    Install-Module -Name Az -Scope CurrentUser -Repository PSGallery -Force
    
  3. 如果系统询问你是否信任来自 PSGallery 的模块,请回答“是”或“全部选是”。

更新 PowerShell 模块

你可能会收到一条警告或错误消息,指示已安装 Azure PowerShell 模块的某一版本。 如果是这样,可发出以下命令更新到最新版本。

Update-Module -Name Az

如同 Install-Module cmdlet,如果系统提示是否信任该模块,则回答“是”或“全部选是”。 如果遇到问题,还可使用 Update-Module 命令来重新安装模块。

示例:如何使用 Azure PowerShell 创建资源组

安装 Azure 模块后,可以开始使用 Azure。 让我们执行一个常见任务:创建资源组。 我们知道,使用资源组可以统一管理相关的资源。 创建新资源组是启动新 Azure 解决方案时执行的首要任务之一。

需要执行四个步骤:

  1. 导入 Azure cmdlet。

  2. 连接到 Azure 订阅。

  3. 创建资源组。

  4. 验证创建是否成功。

下图显示了这些步骤的概述:

Diagram showing the steps to create a resource group.

每个步骤对应于不同的 cmdlet。

导入 Azure cmdlet

从 PowerShell 3.0 开始,在模块中使用 cmdlet 时会自动加载模块。 除非更改了默认模块自动加载设置,否则不再需要手动导入 PowerShell 模块。

连接

使用 Azure PowerShell 的本地安装时,在执行 Azure 命令之前需要进行身份验证。 Connect-AzAccount cmdlet 会提示输入 Azure 凭据,然后连接到 Azure 订阅。 它具有许多可选参数,但如果你只需要交互式提示,则不需要任何参数:

Connect-AzAccount

使用订阅

如果你是 Azure 的新手,也许只有一个订阅。 但是,如果你使用 Azure 有一段时间,可能已创建了多个 Azure 订阅。 可将 Azure PowerShell 配置为针对特定的订阅执行命令。

每次只能在一个订阅中操作。 使用 Get-AzContext cmdlet 确定哪个订阅处于活动状态。 如果它不正确,可以使用另一个 cmdlet 更改订阅。

  1. 使用 Get-AzSubscription 命令获取帐户中所有订阅名称的列表。

  2. 通过传递要选择的订阅名称来更改订阅。

Set-AzContext -Subscription '00000000-0000-0000-0000-000000000000'

如果需要查找“订阅 ID”,请打开 Azure,然后在主页上选择“订阅”。

获取包含所有资源组的列表

可检索包含有效订阅中所有资源组的列表。

Get-AzResourceGroup

为使视图显得更简洁,可以使用竖线“|”将 Get-AzResourceGroup 的输出发送到 Format-Table cmdlet。

Get-AzResourceGroup | Format-Table

输出的内容与以下类似:

ResourceGroupName                  Location       ProvisioningState Tags TagsTable ResourceId
-----------------                  --------       ----------------- ---- --------- ----------
cloud-shell-storage-southcentralus southcentralus Succeeded                        /subscriptions/00000000-0000-0000...
ExerciseResources                  eastus         Succeeded                        /subscriptions/00000000-0000-0000...

创建资源组

我们知道,在 Azure 中创建资源时,始终要将这些资源放入资源组,以便于管理。 启动新应用程序时,资源组通常是要创建的首要对象之一。

可以使用 New-AzResourceGroup cmdlet 创建资源组。 必须指定名称和位置。 名称在订阅中必须唯一。 该位置决定资源组元数据的存储位置(出于符合性原因,这可能很重要)。 使用“美国西部”、“北欧”或“印度西部”等字符串指定位置。 与大多数 Azure cmdlet 一样,New-AzResourceGroup 具有许多可选参数。 但核心语法是:

New-AzResourceGroup -Name <name> -Location <location>

注意

请记住,我们将在可自动创建资源组的活动 Azure 沙盒中操作。 如果更喜欢在自己的订阅中工作,请使用前面的命令。

验证资源

Get-AzResource 会列出你的 Azure 资源,这对于验证是否创建了资源以及资源组的创建是否成功非常有用。

Get-AzResource

Get-AzResourceGroup 命令一样,可通过 Format-Table cmdlet 来精简视图:

Get-AzResource | Format-Table

此外,还可以根据特定的资源组进行筛选,以便仅列出与该组关联的资源:

Get-AzResource -ResourceGroupName ExerciseResources

创建一个 Azure 虚拟机

可使用 PowerShell 执行的另一个常见任务是创建 VM。

Azure PowerShell 提供 New-AzVm cmdlet 用于创建虚拟机。 该 cmdlet 具有许多参数,可以处理大量 VM 配置设置。 大多数参数都有合理的默认值,因此我们只需要指定五个参数:

  • ResourceGroupName:应放置新 VM 的资源组。
  • 名称:Azure 中 VM 的名称。
  • 位置:应预配 VM 的地理位置。
  • 凭证:包含 VM 管理员帐户的用户名和密码的对象。 我们使用 Get-Credential cmdlet。 此 cmdlet 提示输入用户名和密码,并将其打包成凭证对象。
  • 映像:用于 VM 的操作系统映像,通常是 Linux 发行版或 Windows Server。
   New-AzVm
       -ResourceGroupName <resource group name>
       -Name <machine name>
       -Credential <credentials object>
       -Location <location>
       -Image <image name>

可按上一示例所示直接向 cmdlet 提供这些参数。 或者,可使用其他 cmdlet(例如 Set-AzVMOperatingSystemSet-AzVMSourceImageAdd-AzVMNetworkInterfaceSet-AzVMOSDisk)来配置虚拟机。

下面是将 Get-Credential cmdlet 和 -Credential 参数串接在一起的示例:

New-AzVM -Name MyVm -ResourceGroupName ExerciseResources -Credential (Get-Credential) ...

AzVM 后缀特定于 PowerShell 中基于 VM 的命令。 可以使用其他多个命令:

命令 说明
Remove-AzVM 删除 Azure VM
Start-AzVM 启动已停止的 VM
Stop-AzVM 停止正在运行的 VM
Restart-AzVM 重启 VM
Update-AzVM 更新 VM 的配置

示例:获取 VM 的信息

可使用 Get-AzVM -Status 命令列出订阅中的 VM。 此命令还支持通过添加 -Name 属性来输入特定 VM。 下面,我们将它分配到 PowerShell 变量:

$vm = Get-AzVM  -Name MyVM -ResourceGroupName ExerciseResources

有趣的是,现在 VM 是一个可与之交互的对象。 例如,可以对该对象进行更改,然后使用 Update-AzVM 命令将更改推送回 Azure:

$ResourceGroupName = "ExerciseResources"
$vm = Get-AzVM  -Name MyVM -ResourceGroupName $ResourceGroupName
$vm.HardwareProfile.vmSize = "Standard_DS3_v2"

Update-AzVM -ResourceGroupName $ResourceGroupName  -VM $vm

PowerShell 中的交互模式适用于一次性任务。 在本示例中,我们在项目的生存期内使用相同的资源组,这样以交互方式创建它就是合理的。 针对此任务,交互模式通常比编写脚本并执行一次该脚本更快且更容易。