練習 - 查詢有關 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

提示

請注意,我們會以 -o 的形式使用 --output 旗標的縮寫語法。 您可以將 Azure CLI 命令的大部分參數縮短為單一虛線和字母。 例如,您可以將 --name 縮短為 -n,並將 --resource-group 縮短為 -g。 這便於輸入鍵盤字元,但為了清楚起見,建議您在指令碼中使用完整選項名稱。 如需每個命令的詳細資料,請參閱文件。

取得 VM 詳細資料

我們可以執行 vm show 命令,依名稱或識別碼取得特定虛擬機器的詳細資訊。

az vm show --resource-group "<rgn>[sandbox resource group name]</rgn>" --name SampleVM

這會傳回相當大的 JSON 區塊,其中包含關於 VM 的各種資訊,包括連結的存放裝置、網路介面,以及 VM 所連接之資源的所有物件識別碼。 同樣地,我們可以變更為表格格式,但這會省略幾乎所有有趣的資料。 反之,我們可以轉為使用 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

或者,若要擷取網路介面的所有識別碼,我們可以執行此查詢:

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