JMESPath sorgusu kullanarak Azure CLı komut çıkışını sorgulama

Azure CLI, komutlarınızın sonuçları üzerinde bir JMESPath sorgusu çalıştırmak için --query bağımsız değişkenini kullanır. JMESPath, CLı çıktısından veri seçme ve değiştirme olanağı sunan JSON için bir sorgu dilidir. Sorgular, herhangi bir görüntü biçimlendirmesinin önüne JSON çıktısında yürütülür.

--query bağımsız değişkeni, tüm Azure CLI komutları tarafından desteklenir. Bu makalede, JMESPath 'in özelliklerinin bir dizi küçük ve basit örneklerle nasıl kullanılacağı ele alınmaktadır.

Not

Windows üzerinde PowerShell 'de Azure clı kullanırken, sorgu bağımsız değişkeni için bazı ek kaçış gerekebilir. Daha fazla ayrıntı için lütfen bkz. PowerShell Ile alıntı sorunları .

Sözlük ve liste CLı sonuçları

JSON dışında bir çıkış biçimi kullanılırken, CLı komut sonuçları ilk olarak sorgular için JSON olarak değerlendirilir. CLı sonuçları bir JSON dizisi ya da sözlüğüdür. Diziler dizinlenebilir nesnelerin dizileridir ve sözlüklerde anahtarlarla erişilen sıralanmamış nesneler vardır. Birden fazla nesne döndüren komutlar bir dizi döndürür ve her zaman yalnızca tek bir nesne döndüren komutlar bir sözlük döndürür.

Bir sözlükte özellikleri al

Sözlük sonuçlarıyla çalışma, en üst düzeydeki özelliklere yalnızca anahtarla erişebilirsiniz. .(Alt ifade) karakteri, iç içe sözlüklerdeki özelliklere erişmek için kullanılır. Sorgu almadan önce, komutun değiştirilmemiş çıktısına göz atın az vm show :

az vm show -g QueryDemo -n TestVM -o json

Komut bir sözlükten çıkış olur. Bazı içerikler atlandı.

{
  "additionalCapabilities": null,
  "availabilitySet": null,
  "diagnosticsProfile": {
    "bootDiagnostics": {
      "enabled": true,
      "storageUri": "https://xxxxxx.blob.core.windows.net/"
    }
  },
  ...
  "osProfile": {
    "adminPassword": null,
    "adminUsername": "azureuser",
    "allowExtensionOperations": true,
    "computerName": "TestVM",
    "customData": null,
    "linuxConfiguration": {
      "disablePasswordAuthentication": true,
      "provisionVmAgent": true,
      "ssh": {
        "publicKeys": [
          {
            "keyData": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMobZNJTqgjWn/IB5xlilvE4Y+BMYpqkDnGRUcA0g9BYPgrGSQquCES37v2e3JmpfDPHFsaR+CPKlVr2GoVJMMHeRcMJhj50ZWq0hAnkJBhlZVWy8S7dwdGAqPyPmWM2iJDCVMVrLITAJCno47O4Ees7RCH6ku7kU86b1NOanvrNwqTHr14wtnLhgZ0gQ5GV1oLWvMEVg1YFMIgPRkTsSQKWCG5lLqQ45aU/4NMJoUxGyJTL9i8YxMavaB1Z2npfTQDQo9+womZ7SXzHaIWC858gWNl9e5UFyHDnTEDc14hKkf1CqnGJVcCJkmSfmrrHk/CkmF0ZT3whTHO1DhJTtV stramer@contoso",
            "path": "/home/azureuser/.ssh/authorized_keys"
          }
        ]
      }
    },
    "secrets": [],
    "windowsConfiguration": null
  },
  ....
}

Aşağıdaki komut, bir sorgu ekleyerek VM 'ye bağlanma yetkisi olan SSH ortak anahtarlarını alır:

az vm show -g QueryDemo -n TestVM --query osProfile.linuxConfiguration.ssh.publicKeys -o json
[
  {
    "keyData": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMobZNJTqgjWn/IB5xlilvE4Y+BMYpqkDnGRUcA0g9BYPgrGSQquCES37v2e3JmpfDPHFsaR+CPKlVr2GoVJMMHeRcMJhj50ZWq0hAnkJBhlZVWy8S7dwdGAqPyPmWM2iJDCVMVrLITAJCno47O4Ees7RCH6ku7kU86b1NOanvrNwqTHr14wtnLhgZ0gQ5GV1oLWvMEVg1YFMIgPRkTsSQKWCG5lLqQ45aU/4NMJoUxGyJTL9i8YxMavaB1Z2npfTQDQo9+womZ7SXzHaIWC858gWNl9e5UFyHDnTEDc14hKkf1CqnGJVcCJkmSfmrrHk/CkmF0ZT3whTHO1DhJTtV stramer@contoso",
    "path": "/home/azureuser/.ssh/authorized_keys"
  }
]

Tek bir değer alın

Yaygın bir durum, bir Azure Kaynak KIMLIĞI, kaynak adı, Kullanıcı adı veya parola gibi bir CLı komutundan yalnızca bir değer almanız gerekir. Bu durumda, genellikle değeri bir yerel ortam değişkeninde depolamak istersiniz. Tek bir özelliği almak için, önce sorgunun yalnızca bir özelliğini kullandığınızdan emin olun. Son örneği yalnızca yönetici kullanıcı adını almak için değiştirme:

az vm show -g QueryDemo -n TestVM --query 'osProfile.adminUsername' -o json
"azureuser"

Bu geçerli bir tek değer gibi görünüyor, ancak " çıktının bir parçası olarak karakterlerin döndürüldüğünü unutmayın. Bu, nesnenin bir JSON dizesi olduğunu gösterir. Bu değeri, komuttan bir ortam değişkenine doğrudan çıkış olarak atadığınızda, tekliflerin kabuk tarafından yorumlanamadığına dikkat etmeniz önemlidir:

USER=$(az vm show -g QueryDemo -n TestVM --query 'osProfile.adminUsername' -o json)
echo $USER
"azureuser"

Bu, neredeyse kesinlikle istediğiniz şeydir. Bu durumda, döndürülen değerleri tür bilgileriyle çevremeyen bir çıkış biçimi kullanmak istersiniz. CLı 'nın bu amaç için sunduğu en iyi çıkış seçeneği tsv , sekmeyle ayrılmış değerlerdir. Özellikle tek bir değer olan (sözlük veya liste değil) bir değer alınırken, tsv çıktının tırnak içine alınması garanti edilir.

az vm show -g QueryDemo -n TestVM --query 'osProfile.adminUsername' -o tsv
azureuser

Çıkış biçimi hakkında daha fazla bilgi için tsv bkz. Çıkış BIÇIMLERI-TSV çıkış biçimi

Sorgu Boole değerleri

Boole değerlerinin sorgulanması biraz farklıdır. İki seçenek vardır:

# Boolean values are assumed to be true, so this syntax returns the current default subscription.
az account list --query "[?isDefault]"

# If you want a false value, use an escape character.
az account list --query "[?isDefault == \`false\`]"

Birden çok değer al

Birden fazla özellik almak için, ifadeleri köşeli ayraç içine [ ] ( Çoklu seçim listesi) virgülle ayrılmış bir liste olarak koyun. VM adı, Yönetici Kullanıcı ve SSH anahtarını her seferinde tek seferde almak için komutunu kullanın:

az vm show -g QueryDemo -n TestVM --query '[name, osProfile.adminUsername, osProfile.linuxConfiguration.ssh.publicKeys[0].keyData]' -o json
[
  "TestVM",
  "azureuser",
  "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMobZNJTqgjWn/IB5xlilvE4Y+BMYpqkDnGRUcA0g9BYPgrGSQquCES37v2e3JmpfDPHFsaR+CPKlVr2GoVJMMHeRcMJhj50ZWq0hAnkJBhlZVWy8S7dwdGAqPyPmWM2iJDCVMVrLITAJCno47O4Ees7RCH6ku7kU86b1NOanvrNwqTHr14wtnLhgZ0gQ5GV1oLWvMEVg1YFMIgPRkTsSQKWCG5lLqQ45aU/4NMJoUxGyJTL9i8YxMavaB1Z2npfTQDQo9+womZ7SXzHaIWC858gWNl9e5UFyHDnTEDc14hKkf1CqnGJVcCJkmSfmrrHk/CkmF0ZT3whTHO1DhJTtV stramer@contoso"
]

Bu değerler, sonuç dizisinde sorguda verilen sırada listelenir. Sonuç bir dizi olduğundan, sonuçlarla ilişkili bir anahtar yoktur.

Sorgudaki özellikleri yeniden adlandırma

Birden çok değer sorgulanırken dizi yerine sözlük almak için { } (MultiSelect karma) işlecini kullanın. Çoklu seçim karması için biçim {displayName:JMESPathExpression, ...} . displayName çıktıda gösterilen dize olur ve JMESPathExpression değerlendirmek Için JMESPath ifadesi olur. Çoklu seçim listesini bir karma olarak değiştirerek son bölümden örnek değiştirme:

az vm show -g QueryDemo -n TestVM --query '{VMName:name, admin:osProfile.adminUsername, sshKey:osProfile.linuxConfiguration.ssh.publicKeys[0].keyData }' -o json
{
  "VMName": "TestVM",
  "admin": "azureuser",
  "ssh-key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMobZNJTqgjWn/IB5xlilvE4Y+BMYpqkDnGRUcA0g9BYPgrGSQquCES37v2e3JmpfDPHFsaR+CPKlVr2GoVJMMHeRcMJhj50ZWq0hAnkJBhlZVWy8S7dwdGAqPyPmWM2iJDCVMVrLITAJCno47O4Ees7RCH6ku7kU86b1NOanvrNwqTHr14wtnLhgZ0gQ5GV1oLWvMEVg1YFMIgPRkTsSQKWCG5lLqQ45aU/4NMJoUxGyJTL9i8YxMavaB1Z2npfTQDQo9+womZ7SXzHaIWC858gWNl9e5UFyHDnTEDc14hKkf1CqnGJVcCJkmSfmrrHk/CkmF0ZT3whTHO1DhJTtV stramer@contoso"
}

Bir dizideki özellikleri al

Bir dizinin kendi özellikleri yoktur, ancak dizine eklenebilir. Bu özellik, en son örnekte publicKeys[0] , dizinin ilk öğesini alan ifadesiyle gösterilir publicKeys . Herhangi bir garanti çıkışı sıralanmıştır, bu nedenle sıralamayı kullanmaktan kaçının veya aldığınız öğeyi önemsemediğiniz müddetçe Dizin oluşturmayı kullanmaktan kaçının. Bir dizideki öğelerin özelliklerine erişmek için iki işlemden birini yapın: düzleştirme ve filtreleme. Bu bölüm, bir dizinin nasıl düzleştiralınacağını ele alır.

Bir diziyi düzleştirme, [] jmespath işleci ile yapılır. İşlecinden sonraki tüm ifadeler [] geçerli dizideki her öğeye uygulanır. []Sorgunun başlangıcında görünürse, CLI komut sonucunu düzleştirir. Sonuçları az vm list Bu özellikle incelenebilir. Bir kaynak grubundaki her sanal makinenin adını, işletim sistemini ve yönetici adını almak için:

az vm list -g QueryDemo --query '[].{Name:name, OS:storageProfile.osDisk.osType, admin:osProfile.adminUsername}' -o json
[
  {
    "Name": "Test-2",
    "OS": "Linux",
    "admin": "sttramer"
  },
  {
    "Name": "TestVM",
    "OS": "Linux",
    "admin": "azureuser"
  },
  {
    "Name": "WinTest",
    "OS": "Windows",
    "admin": "winadmin"
  }
]

--output tableÇıkış biçimiyle birleştirildiğinde, sütun adları, displayKey Çoklu seçim karmasının değeri ile eşleşir:

az vm list -g QueryDemo --query '[].{Name:name, OS:storageProfile.osDisk.osType, Admin:osProfile.adminUsername}' --output table
Name     OS       Admin
-------  -------  ---------
Test-2   Linux    sttramer
TestVM   Linux    azureuser
WinTest  Windows  winadmin

Not

Belirli anahtarlar filtrelenir ve tablo görünümünde yazdırılmaz. Bunlar id, type ve etag anahtarlarıdır. Bu değerleri görmek için, bir çoklu seçim karmasında anahtar adını değiştirebilirsiniz.

az vm show -g QueryDemo -n TestVM --query "{objectID:id}" -o table

Yalnızca komut tarafından döndürülen en üst düzey sonuç değil, herhangi bir dizi düzleştirilebilecek. Son bölümde, ifade, osProfile.linuxConfiguration.ssh.publicKeys[0].keyData oturum açma IÇIN SSH ortak anahtarını almak için kullanılmıştır. Her SSH ortak anahtarını almak için, ifadesi bunun yerine olarak yazılabilir osProfile.linuxConfiguration.ssh.publicKeys[].keyData . Bu sorgu ifadesi diziyi düzleştirir osProfile.linuxConfiguration.ssh.publicKeys ve sonra keyData her bir öğe üzerinde ifadeyi çalıştırır:

az vm show -g QueryDemo -n TestVM --query '{VMName:name, admin:osProfile.adminUsername, sshKeys:osProfile.linuxConfiguration.ssh.publicKeys[].keyData }' -o json
{
  "VMName": "TestVM",
  "admin": "azureuser",
  "sshKeys": [
    "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMobZNJTqgjWn/IB5xlilvE4Y+BMYpqkDnGRUcA0g9BYPgrGSQquCES37v2e3JmpfDPHFsaR+CPKlVr2GoVJMMHeRcMJhj50ZWq0hAnkJBhlZVWy8S7dwdGAqPyPmWM2iJDCVMVrLITAJCno47O4Ees7RCH6ku7kU86b1NOanvrNwqTHr14wtnLhgZ0gQ5GV1oLWvMEVg1YFMIgPRkTsSQKWCG5lLqQ45aU/4NMJoUxGyJTL9i8YxMavaB1Z2npfTQDQo9+womZ7SXzHaIWC858gWNl9e5UFyHDnTEDc14hKkf1CqnGJVcCJkmSfmrrHk/CkmF0ZT3whTHO1DhJTtV stramer@contoso\n"
  ]
}

Dizileri filtrele

Bir diziden veri almak için kullanılan diğer işlem filtreleniyor. Filtre, [?...] jmespath işleci ile yapılır. Bu işleç, içeriği olarak bir koşul alır. Koşul, ya da olarak değerlendirilebilecek herhangi bir ifadedir true false . Koşulun true çıkışa dahil edildiği ifadeler.

JMESPath, Standart karşılaştırma ve mantıksal işleçler sunmaktadır. Bunlar,,,, < <= ve içerir > >= == != . JMESPath Ayrıca Logical ve ( && ), OR ( || ) ve Not () destekler ! . İfadeler parantez içinde gruplanabilir ve daha karmaşık koşul ifadelerine izin verir. Koşullar ve mantıksal işlemlerle ilgili tüm ayrıntılar için bkz. Jmespath belirtimi.

Son bölümde, bir kaynak grubundaki tüm VM 'lerin listesini almak için bir diziyi düzleştirtik. Filtreler kullanılarak bu çıkış yalnızca Linux sanal makinelerinde kısıtlanabilir:

az vm list -g QueryDemo --query "[?storageProfile.osDisk.osType=='Linux'].{Name:name,  admin:osProfile.adminUsername}" --output table
Name    Admin
------  ---------
Test-2  sttramer
TestVM  azureuser

Önemli

JMESPath 'de dizeler her zaman tek tırnak () içine alınır ' . Bir filtre koşulunda bir dizenin parçası olarak çift tırnak işareti kullanırsanız, boş çıkış alırsınız.

JMESPath 'in, filtrelemeye yardımcı olabilecek yerleşik işlevleri de vardır. Bu gibi bir işlev ? contains(string, substring) , bir dizenin bir alt dize içerip içermediğini kontrol eder. İfadeler, işlev çağrılmadan önce değerlendirilir, bu nedenle ilk bağımsız değişken bir tam JMESPath ifadesi olabilir. Sonraki örnek, işletim sistemi diskleri için SSD depolama kullanan tüm VM 'Leri bulur:

az vm list -g QueryDemo --query "[? contains(storageProfile.osDisk.managedDisk.storageAccountType,'SSD')].{Name:name, Storage:storageProfile.osDisk.managedDisk.storageAccountType}" -o json
[
  {
    "Name": "TestVM",
    "Storage": "StandardSSD_LRS"
  },
  {
    "Name": "WinTest",
    "Storage": "StandardSSD_LRS"
  }
]

Bu sorgu biraz uzun. storageProfile.osDisk.managedDisk.storageAccountTypeAnahtar iki kez bahsedilir ve çıkışta yeniden anahtarlanır. Bunu kısaltmak için bir yol, düzleştirme ve veri seçildikten sonra filtreyi uygulamaktır.

az vm list -g QueryDemo --query "[].{Name:name, Storage:storageProfile.osDisk.managedDisk.storageAccountType}[? contains(Storage,'SSD')]" -o json
[
  {
    "Name": "TestVM",
    "Storage": "StandardSSD_LRS"
  },
  {
    "Name": "WinTest",
    "Storage": "StandardSSD_LRS"
  }
]

Büyük diziler için, verileri seçmeden önce filtreyi uygulamak daha hızlı olabilir.

İşlevlerin tam listesi için bkz. Jmespath belirtimi-yerleşik işlevler .

Çıktıyı Değiştir

JMESPath işlevlerinin Ayrıca bir sorgunun sonuçlarında işlem yapmak için başka bir amacı vardır. Boolean olmayan bir değer döndüren herhangi bir işlev, bir ifadenin sonucunu değiştirir. Örneğin, ile bir özellik değerine göre verileri sıralayabilirsiniz sort_by(array, &sort_expression) . JMESPath, & bir işlevin parçası olarak daha sonra değerlendirilmesi gereken ifadeler için özel bir işleç kullanır. Sonraki örnekte, bir VM listesinin işletim sistemi disk boyutuna göre nasıl sıralanması gösterilmektedir:

az vm list -g QueryDemo --query "sort_by([].{Name:name, Size:storageProfile.osDisk.diskSizeGb}, &Size)" --output table
Name     Size
-------  ------
TestVM   30
Test-2   32
WinTest  127

İşlevlerin tam listesi için bkz. Jmespath belirtimi-yerleşik işlevler .

Sorgularla etkileşimli olarak denemeler yapma

JMESPath ile deneme yapmaya başlamak için JMESPath-terminal Python paketi sorgularla çalışmak için etkileşimli bir ortam sunar. Veriler giriş olarak kanala yazılır ve ardından sorgular yazıldığı ve düzenleyicide çalıştırıldığı.

pip install jmespath-terminal
az vm list --output json | jpterm