练习 - 查询有关 VM 的系统和运行时信息
现在已经创建了虚拟机,接下来可通过其他命令了解其相关信息。
首先运行 vm list
。
az vm list
此命令将返回此订阅中定义的所有虚拟机。 可通过 --resource-group
参数筛选输出结果,将范围缩小至特定的资源组。
输出类型
请注意,我们至今为止使用的所有命令的默认响应类型都是 JSON。 此类型非常适用于编写脚本,但大部分用户发现它更难读取。 你可通过 --output
标记更改任意响应的输出样式。 例如,在 Azure Cloud Shell 中运行以下命令,查看不同的输出样式。
az vm list --output table
除了 table
,你还可以指定 json
(默认值)、jsonc
(已着色的 JSON)或 tsv
(制表符分隔值)。 试着使用上述命令的一些变量,看看有何差别。
获取 IP 地址
还有一个有用的命令是 vm list-ip-addresses
,它会列出 VM 的公共和专用 IP 地址。 即使这些地址出现变化,或你未在创建时捕获它们,仍可随时检索到它们。
az vm list-ip-addresses -n SampleVM -o table
这会返回类似于以下的输出:
VirtualMachine PublicIPAddresses PrivateIPAddresses
---------------- ------------------- --------------------
SampleVM 168.61.54.62 10.0.0.4
提示
请注意,我们将使用 --output
的简写语法,即 -o
。 Azure CLI 命令的大部分参数都可简写成一个连接号加一个字母。 例如,可以将 --name
简写为 -n
,将 --resource-group
简写为 -g
。 这在键入时非常方便,但为清楚起见,建议在脚本中使用完整选项名称。 有关每个命令的详细信息,请查看相应文档。
获取 VM 详细信息
可运行 vm show
命令按名称或 ID 获取有关特定虚拟机的更详细信息。
az vm show --resource-group "<rgn>[sandbox resource group name]</rgn>" --name SampleVM
此命名将返回一个相当大的 JSON 块,其中包含各种类型的 VM 信息,例如附加的存储设备、网络接口,以及 VM 连接到的资源的所有对象 ID 等等。 同样地,我们可更改表格式,但这几乎会漏掉所有有趣的数据。 转而,我们可对 JSON 使用一种名为 JMESPath 的内置查询语言。
使用 JMESPath 将筛选器添加到查询中
JMESPath 是一个行业标准的查询语言,它围绕 JSON 对象进行构建。 最简单的查询是指定一个标识符,它在 JSON 对象中选择一个键。
例如,假定对象如下:
{
"people": [
{
"name": "Fred",
"age": 28
},
{
"name": "Barney",
"age": 25
},
{
"name": "Wilma",
"age": 27
}
]
}
我们可使用 people
查询针对 people
数组返回一组值。 如果我们只需要其中一个人员,则可使用索引程序。 例如,people[1]
将返回如下内容:
{
"name": "Barney",
"age": 25
}
我们还可以添加特定限定符,这些限定符将根据某些条件返回对象的子集。 例如,添加限定符 people[?age > '25']
将返回如下内容:
[
{
"name": "Fred",
"age": 28
},
{
"name": "Wilma",
"age": 27
}
]
最后,我们可添加只返回名称的 select: people[?age > '25'].[name]
,对结果进行限制:
[
[
"Fred"
],
[
"Wilma"
]
]
JMESQuery 还有很多有趣的查询功能。 如果你时间充裕,可查看 JMESPath.org 网站上提供的在线教程。
筛选 Azure CLI 查询
在基本了解了 JMES 查询之后,现可向 vm show
命令之类的查询所返回的数据添加筛选器。 例如,我们可检索管理员用户名:
az vm show \
--resource-group "<rgn>[sandbox resource group name]</rgn>" \
--name SampleVM \
--query "osProfile.adminUsername"
可获取分配给 VM 的大小:
az vm show \
--resource-group "<rgn>[sandbox resource group name]</rgn>" \
--name SampleVM \
--query hardwareProfile.vmSize
若要检索网络接口的所有 ID,可运行以下查询:
az vm show \
--resource-group "<rgn>[sandbox resource group name]</rgn>" \
--name SampleVM \
--query "networkProfile.networkInterfaces[].id"
此查询技术适用于所有 Azure CLI 命令,并可用于在命令行上拉取出特定位的数据。 它还可用于编写脚本。 例如,你可以从 Azure 帐户中拉取出一个值,并将其存储到环境或脚本变量中。 如果决定按此方式使用它,添加一个 --output tsv
参数(可简写成 -o tsv
)会很有用。 这样返回的结果中将仅包含带制表分隔符的实际数据值。
例如:
az vm show \
--resource-group "<rgn>[sandbox resource group name]</rgn>" \
--name SampleVM \
--query "networkProfile.networkInterfaces[].id" -o tsv
返回文本:/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/bbbb1b1b-cc2c-dd3d-ee4e-ffffff5f5f5f/providers/Microsoft.Network/networkInterfaces/SampleVMVMNic