练习 - 查询有关 VM 的系统和运行时信息

已完成

注释

本练习可选做。 若要完成本练习,则需要在开始之前创建 Azure 订阅。 如果没有 Azure 帐户或不想暂时创建一个帐户,可以通读说明,以便了解所显示的信息。

注释

在本单元中,你将使用 Azure Cloud Shell 作为终端。 可以通过 Azure 门户Cloud Shell 登录访问 Cloud Shell。 无需在电脑或笔记本电脑上安装任何内容即可使用它。

注释

在本练习中,请将示例中的 myResourceGroupName 替换为现有资源组的名称或为此练习创建的资源组的名称。

现在已经创建了虚拟机,接下来可通过其他命令了解其相关信息。

首先运行 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 "myResourceGroupName" --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 "myResourceGroupName" \
    --name SampleVM \
    --query "osProfile.adminUsername"

可获取分配给 VM 的大小:

az vm show \
    --resource-group "myResourceGroupName" \
    --name SampleVM \
    --query hardwareProfile.vmSize

若要检索网络接口的所有 ID,可运行以下查询:

az vm show \
    --resource-group "myResourceGroupName" \
    --name SampleVM \
    --query "networkProfile.networkInterfaces[].id"

此查询技术适用于所有 Azure CLI 命令,并可用于在命令行上拉取出特定位的数据。 它还可用于编写脚本。 例如,你可以从 Azure 帐户中拉取出一个值,并将其存储到环境或脚本变量中。 如果决定按此方式使用它,添加一个 --output tsv 参数(可简写成 -o tsv)会很有用。 这样返回的结果中将仅包含带制表分隔符的实际数据值。

例如:

az vm show \
    --resource-group "myResourceGroupName" \
    --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