Справка по запросу Azure CLI — JMESpath — фильтр с использованием ключа, имеющего пробел, извлекает ключи с пробелом в них (из Powershell)

#azure #powershell #tags #azure-cli #jmespath

#azure #powershell #Теги #azure-cli #jmespath

Вопрос:

Всем доброго утра, счастливой пятницы!
Редактировать: в итоге я решил это сам во время отладки через него..
Думал, что я опубликую это здесь независимо от того, чтобы любой, кто приходит сюда, мог получить решение… Помогли документы Microsoft.

 https://learn.microsoft.com/en-us/cli/azure/use-cli-effectively
  

Оригинальный вопрос

У меня есть ресурсы Azure, которые помечены как :

 "tags":{
"Application Name":"The Best App",
"Budget Line":"Home project",
"Technology":"Best Tech",
"Environment":"Development",
"Project":"Learn"
}
  

Образец json с массивом ресурсов и тегов будет выглядеть следующим образом

 [{"name":"Resource1",
"tags": {
"Application Name":"The Best App",
"Budget Line":"Home project",
"Technology":"Best Tech",
"Environment":"Development",
"Project":"Learn"
 }},
{"name":"Resource2",
"tags": {
"Application Name":"The Best App",
"Budget Line":"Home project",
"Technology":"Best Tech",
"Environment":"Development",
"Project":"Learn"
 }},
{"name":"Resource3",
"tags": {
"Application Name":"Not App",
"Budget Line":"Home project",
"Technology":"Best Tech",
"Environment":"Development",
"Project":"Learn"
 }
}
]
  

Итак, теперь я хочу запросить все ресурсы Azure, где тег **Application Name** = **The Best App**.

Я просматривал учебное пособие по JMESpath и получил следующий синтаксис для работы на веб-сайте учебного пособия по JMESpath. Что я пытался сделать: отфильтровать ресурс на основе значения тега, а затем извлечь другое значение тега этих ресурсов.

 [?tags."Application Name"==`"The Best App"`].tags."Budget Line"
  

Фильтр пути JMES с пробелом в имени ключа и пробелом в имени ключа при проецировании

Следующим шагом было попробовать тот же запрос как часть запроса azure cli с помощью запроса фильтра JMESpath.
Обратите внимание, что я использую azure cli из PowerShell, поскольку мне в нем удобнее, чем в Bash.
Не удается заставить его работать

Решение после нескольких проб и ошибок

Рассмотрим примеры powershell для экранирования двойных кавычек из https://learn.microsoft.com/en-us/cli/azure/use-cli-effectively Это сработало: примеры приведены в PowerShell

  • Запрашивайте ресурс Azure на основе ключа тега, в котором нет пробела, но проецируйте / извлекайте значение тега, имеющего имя ключа с пробелом.
     az resource list -g RESOURCEGROUPNAME --query "[?tags.Technology==`'Best Tech'`].tags.`"Budget Line`"" # Works in powershell
      
  • Запрашивайте ресурс Azure на основе ключа тега, в котором есть пробел, и извлекайте / проецируйте значение тега, имеющего имя ключа с пробелом.
     az resource list -g RESOURCEGROUPNAME --query "[?tags.`"Budget Line`"==`'Home Project'`].tags.`"Application Name`"" # Works in powershell
      

Счастливой пятницы, ребята! Надеюсь, это кому-то поможет!

Ответ №1:

Решение после нескольких проб и ошибок

Рассмотрим примеры powershell для экранирования двойных кавычек из https://learn.microsoft.com/en-us/cli/azure/use-cli-effectively Это сработало: примеры приведены в PowerShell

  • Запрашивайте ресурс Azure на основе ключа тега, в котором нет пробела, но проецируйте / извлекайте значение тега, имеющего имя ключа с пробелом.
     az resource list -g RESOURCEGROUPNAME --query "[?tags.Technology==`'Best Tech'`].tags.`"Budget Line`"" # Works in powershell
      
  • Запрашивайте ресурс Azure на основе ключа тега, в котором есть пробел, и извлекайте / проецируйте значение тега, имеющего имя ключа с пробелом.
     az resource list -g RESOURCEGROUPNAME --query "[?tags.`"Budget Line`"==`'Home Project'`].tags.`"Application Name`"" # Works in powershell
      

Счастливой пятницы, ребята! Надеюсь, это кому-то поможет!

Ответ №2:

Это совершенно другой контекст, но на всякий случай, если это кому-то поможет, решение автора не сработало для меня при выполнении запроса JSON из Ansible (который также использует JMESpath). Вместо этого мне пришлось сделать следующее:

 storage_url: "{{ openstack_api_versions.stdout | from_json | json_query('[? "Service Type" == `object-store`].Endpoint') | first }}"
  

В этом контексте он работает только без обратных ссылок.