在 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-Process
、Format-Table
和 Start-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 模块,请运行以下命令:
打开“开始”菜单,输入 PowerShell。
选择 PowerShell 图标。
键入以下命令并按 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”,则:
使用
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
输入 Y 或 A,然后按 Enter。
在命令提示符下处,使用键盘上的向上箭头并为 Azure 重新运行
Install-Module
命令。
应会看到 Az PowerShell 模块加载。 完成后,你将能够使用 Import-Module
加载 cmdlet。
在 Linux 或 macOS 上安装 Azure PowerShell 时可使用相同的命令。
在终端中,运行以下命令以启动 PowerShell。
pwsh
若要安装 Azure PowerShell,请在 PowerShell 提示符处运行以下命令。
Install-Module -Name Az -Scope CurrentUser -Repository PSGallery -Force
如果系统询问你是否信任来自 PSGallery 的模块,请回答“是”或“全部选是”。
更新 PowerShell 模块
你可能会收到一条警告或错误消息,指示已安装 Azure PowerShell 模块的某一版本。 如果是这样,可发出以下命令更新到最新版本。
Update-Module -Name Az
如同 Install-Module
cmdlet,如果系统提示是否信任该模块,则回答“是”或“全部选是”。 如果遇到问题,还可使用 Update-Module
命令来重新安装模块。
示例:如何使用 Azure PowerShell 创建资源组
安装 Azure 模块后,可以开始使用 Azure。 让我们执行一个常见任务:创建资源组。 我们知道,使用资源组可以统一管理相关的资源。 创建新资源组是启动新 Azure 解决方案时执行的首要任务之一。
需要执行四个步骤:
导入 Azure cmdlet。
连接到 Azure 订阅。
创建资源组。
验证创建是否成功。
下图显示了这些步骤的概述:
每个步骤对应于不同的 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 更改订阅。
使用
Get-AzSubscription
命令获取帐户中所有订阅名称的列表。通过传递要选择的订阅名称来更改订阅。
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-AzVMOperatingSystem
、Set-AzVMSourceImage
、Add-AzVMNetworkInterface
和 Set-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 中的交互模式适用于一次性任务。 在本示例中,我们在项目的生存期内使用相同的资源组,这样以交互方式创建它就是合理的。 针对此任务,交互模式通常比编写脚本并执行一次该脚本更快且更容易。