리소스가 없는 리소스 그룹 찾기

7754 단어 scriptingazure
나는 많은 리소스와 많은 Azure 구독을 가지고 있기 때문에 모든 것이 무엇에 사용되는지 잊어버리는 경우가 많습니다. 물론, 리소스 그룹에 유용한 이름을 지정하고, 태그를 추가하고, 그러한 속성을 부여하려고 노력하지만, 그래도 빠르게 제어할 수 없게 될 수 있습니다. 예를 들어 현재 내 기본 구독에 47개의 리소스 그룹이 있습니다(두 번째 및 세 번째 그룹도 함께 살펴보겠습니다).

리소스가 없는 모든 리소스 그룹을 삭제하는 것이 좋은 시작이라고 생각했습니다. 자원이 없습니까? 글쎄요, 아마도 더 이상 필요하지 않을 것입니다(비싼 리소스를 삭제했을 가능성이 있지만 전체 정리를 수행하지 않았습니다).

그러나 포털을 통해 클릭하지 않고 어떻게 찾을 수 있습니까?

음, shell.azure.com 부터 시작하여 스크립팅을 시작하겠습니다.

이 작업을 수행하려면 모든 리소스 그룹의 이름과 해당 리소스 그룹의 항목 수라는 두 가지 정보가 필요합니다.

모든 리소스 그룹의 이름을 얻는 것은 간단합니다.

az group list | jq 'map(.name)'


그러면 다음이 출력됩니다.

[
  "aaron-cloud-cli",
  "dddsydney",
  "httpstatus",
  "personal-website",
  "restream-streamdeck",
  "NetworkWatcherRG",
  "stardust-codespace"
]


불행히도 이것은 그룹에 얼마나 많은 리소스가 있는지 알려주지 않습니다(예, name 속성만 가져오고 있지만 전체 JSON에는 포함되어 있지 않습니다). 실제로 az group로는 전혀 얻을 수 없으며 az group show --name <name>도 제공하지 않습니다. 이 문제를 다르게 처리해야 합니다. 대신 모든 리소스를 가져와 리소스 그룹별로 그룹화합니다. , az resource list로 할 수 있는 작업:

az resource list | jq 'map(.resourceGroup) | group_by(.) | map({ name: .[0], length: length }) | sort_by(.length) | reverse'


jq 명령은 약간 복잡하지만 분석하면 가장 먼저 map(.resourceGroup) 가 포함된 각 리소스에서 리소스 그룹 이름을 선택하여 리소스 그룹 이름의 배열을 제공합니다. 다음으로 group_by(.)를 사용하여 그룹화하고 자원 그룹의 이름(인덱스의 첫 번째 항목에서 가져옴)과 길이(자원이 얼마나 많은지 리소스 그룹). 마지막으로 mapsort_by 로 정렬하고 주문하여 다음과 같은 출력을 제공합니다.

[
  {
    "name": "httpstatus",
    "length": 11
  },
  {
    "name": "personal-website",
    "length": 3
  },
  {
    "name": "stardust-codespace",
    "length": 1
  },
  {
    "name": "restream-streamdeck",
    "length": 1
  },
  {
    "name": "dddsydney",
    "length": 1
  },
  {
    "name": "aaron-cloud-cli",
    "length": 1
  }
]


엄청난! 예외는... 리소스가 있는 리소스 그룹만 포함합니다.

따라서 모든 리소스 그룹 이름을 가져오려면 원래 쿼리가 필요하고 두 배열 사이의 음의 교차점을 찾을 수 있습니다. 나머지는 우리가 버릴 수 있는 리소스 그룹입니다.

항목이 있는 모든 리소스 그룹을 bash 변수로 푸시하여 시작합니다.

RG_NAMES=$(az resource list | jq -r 'map(.resourceGroup) | group_by(.) | map(.[0])')


다음으로 reverse에 대한 쿼리의 대체 항목으로 $RG_NAMES를 사용합니다.

az group list | jq -r "map(.name) | map(select(. as \$NAME | $RG_NAMES | any(. == \$NAME) | not)) | sort"


다시 한 번 이 더 복잡한 jq 문을 분해해 보겠습니다. az group list 를 사용하여 리소스 그룹의 이름을 가져오는 것으로 시작합니다(우리에게 필요한 전부이므로). 그런 다음 map(.name) 호출로 연결되어 배열의 각 항목에 대해 작업할 수 있습니다. 두 번째map에서 항목을 변수map(환경 변수$NAME로 대체하기 때문에 이스케이프 처리함)에 항목을 할당하고 $RG_NAMES 변수로 파이프하므로 파이프할 수 있습니다. 그것을 $RG_NAMES로 변경하고 any의 항목이 $RG_NAMES와 일치하는지 확인합니다. $NAME의 결과는 any를 통해 파이핑되어 반전되고 결과는 not에 제공되어 리소스가 없는 리소스 그룹 이름으로만 필터링됩니다!

["NetworkWatcherRG"]


두 줄의 코드를 성공적으로 실행했으며 비어 있고 삭제할 수 있는 리소스 그룹을 다시 얻었습니다.

요약



다시 그 두 줄이 있습니다.

RG_NAMES=$(az resource list | jq -r 'map(.resourceGroup) | group_by(.) | map(.[0])')
az group list | jq -r "map(.name) | map(select(. as \$NAME | $RG_NAMES | any(. == \$NAME) | not)) | sort"


예, select는 특히 실행 중인 파이프 수를 고려할 때 약간 벅차게 보일 수 있지만 대체로 광고된 대로 수행하고 항목이 없는 리소스 그룹 목록을 반환합니다.

그리고 예, 모든 것을 클릭하는 것보다 이것을 알아 내려고 노력하는 데 더 많은 시간을 할애했을 수 있지만 적어도 다음에는 준비가되어 있습니다! 🤣

좋은 웹페이지 즐겨찾기