Как удалить все группы ресурсов Azure, кроме одной

Я хочу удалить все группы ресурсов, кроме той, которая используется облачной оболочкой.

$ az group list --query [].name --output tsv | grep -i -v cloud >> resGroups.txt

$ while read RGS; do echo $RGS;done<resGroups.txt
DefaultResourceGroup-EUS
NetworkWatcherRG

$ while read RGS; do az group delete -n $RGS --no-wait -y;done<resGroups.txt
validation error: Parameter 'resource_group_name' must conform to the following pattern: '^[-\\w\\._\\(\\)]+$'.
validation error: Parameter 'resource_group_name' must conform to the following pattern: '^[-\\w\\._\\(\\)]+$'.

$ while read RGS; do echo $RGS | sha256sum ;done<resGroups.txt
8ea64f061e7d52cd16b4c8a89e55ce06275c538ed91a0544b9db720281350dc2  -
b3bc010b955260f143c4b2d860020b36de391bddcbbdf31ce5a608d705f25829  -

$ echo DefaultResourceGroup-EUS | sha256sum
c06416f056e76d1c6642a3df6dd646a91b46ee40791b04db32d9c374e7ab790d  -

$ echo NetworkWatcherRG | sha256sum
c0aee8c9e5d3be7fe8a0748031ca1f5f762b2f6aa6a5e3de95dc0b1dbbc54120  -

Основываясь на ошибке и просто выполняя эхо, похоже, что цикл работает, но что-то не так с тем, как имена печатаются в файле.

Я не понимаю, почему хеши не совпадают.

xxxxxxxxxxxxxxxxxxxxxxxxxxxxx РЕШЕНИЕ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Спасибо всем за их вклад, это заставило меня задуматься, и я понял, что проблема в том, как я выводю строку.

Это не работает, потому что в конце каждой строки добавляется табуляция:

notRG=$(az group list --query "[?contains(name, 'cloud')].name" --output tsv)

Это приведет к удалению всех групп ресурсов в вашей учетной записи Azure, кроме тех, которые включают облако слов:

notRG=$(az group list --query "[?contains(name, 'cloud')].name" --output json | jq .[] -r)
for i in $(az group list --query "[?name!='$notRG'].name" --output json | jq .[] -r); do az group delete -n $i -y; done

Когда я запустил цикл:

$ az group list | grep -i "name\|state"
    "name": "myResourceGroup",
      "provisioningState": "Deleting"
    "name": "DefaultResourceGroup-EUS",
      "provisioningState": "Succeeded"
    "name": "MC_myResourceGroup_myAKSCluster_eastus",
      "provisioningState": "Deleting"
    "name": "NetworkWatcherRG",
      "provisioningState": "Succeeded"
    "name": "cloud-shell-storage-westus",
      "provisioningState": "Succeeded"

После завершения цикла:

$ az group list | grep -i "name\|state"
    "name": "cloud-shell-storage-westus",
      "provisioningState": "Succeeded"

person Aaron    schedule 13.07.2020    source источник
comment
Не уверен, есть ли причина, по которой вы используете вывод первой части в файл. Вы смотрели в JQ. Он отлично подходит для обработки json, и вы можете делать циклы прямо из него. Таким образом, вы можете легко сохранить JSON в файл, обработать его JQ и использовать для цикла. starkandwayne.com/blog/bash-for-loop -over-json-array-using-jq   -  person Ron    schedule 14.07.2020


Ответы (2)


Удалить группу ресурсов с именем:

az group delete --name ExampleResourceGroup

Я попытался !("groupName") и ^((?!groupName).)*$ заменить ExampleResourceGroup, но ошибка (ошибка проверки) все еще отображается.

Поэтому я использую if-statement, чтобы исключить. Вы можете добавить код в цикл.

groupName='xxxxxxxx';
if [ $groupName!='the group name that you want to except' ]; then az group delete -n=$groupName; fi;

Я пробую это с az group show, и он хорошо работает.

введите описание изображения здесь

person Pamela Peng    schedule 14.07.2020
comment
У меня это тоже не сработало :( Оказывается, проблема в том, как Azure CLI выводит строку. - person Aaron; 15.07.2020

xxxxxxxxxxxxxxxxxxxxxxxxxxxxx РЕШЕНИЕ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Спасибо всем за их вклад, это заставило меня задуматься, и я понял, что проблема в том, как я выводю строку.

Это не работает, потому что в конце каждой строки добавляется табуляция:

notRG=$(az group list --query "[?contains(name, 'cloud')].name" --output tsv)

Это приведет к удалению всех групп ресурсов в вашей учетной записи Azure, кроме тех, которые включают облако слов:

notRG=$(az group list --query "[?contains(name, 'cloud')].name" --output json | jq .[] -r)
for i in $(az group list --query "[?name!='$notRG'].name" --output json | jq .[] -r); do az group delete -n $i -y; done

Когда я запустил цикл:

$ az group list | grep -i "name\|state"
    "name": "myResourceGroup",
      "provisioningState": "Deleting"
    "name": "DefaultResourceGroup-EUS",
      "provisioningState": "Succeeded"
    "name": "MC_myResourceGroup_myAKSCluster_eastus",
      "provisioningState": "Deleting"
    "name": "NetworkWatcherRG",
      "provisioningState": "Succeeded"
    "name": "cloud-shell-storage-westus",
      "provisioningState": "Succeeded"

После завершения цикла:

$ az group list | grep -i "name\|state"
    "name": "cloud-shell-storage-westus",
      "provisioningState": "Succeeded"
person Aaron    schedule 17.07.2020