练习 - 查询有关 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/20f4b944-fc7a-4d38-b02c-900c8223c3a0/resourceGroups/2568d0d0-efe3-4d04-a08f-df7f009f822a/providers/Microsoft.Network/networkInterfaces/SampleVMVMNic