Azure 管理グループをツリー形式で表示するシェルスクリプトを作ってみた

Azure 管理グループをツリー形式で表示するシェルスクリプトを作ってみた

2026.01.16

Azure の管理グループをツリー形式で表示させたいと思い、簡単なシェルスクリプトを作成してみました。Azure Cloud Shell から実行もできます。次のような出力結果例になり、管理グループ ID と管理グループの表示名を表示します。ルート管理グループの ID はマスクしています。

00000000-0000-0000-0000-000000000000 (Root)
└── mg-intermediate-root (IntermediateRoot)
    ├── mg-sandbox (Sandbox)
    ├── mg-security (Security)
    │   ├── mg-log-archive (LogArchive)
    │   └── mg-security-tools (SecurityTools)
    └── mg-workloads (Workloads)
        ├── mg-workloads-external (WorkloadsExternal)
        └── mg-workloads-internal (WorkloadsInternal)

ツリー形式で管理グループを出力するスクリプト

ツリー形式で管理グループを出力するシェルスクリプトです。例外処理などは実装していない簡易的な内容になっています。

#!/bin/bash

# 管理グループの情報を取得
management_group_names=$(az account management-group list --query "[].name" -o tsv)
management_groups_json=$(echo "$management_group_names" | while read -r mg_name; do
  az account management-group show --name "$mg_name" \
    --query "{displayName: displayName, name: name, parent: details.parent.name}" -o json
done | jq -s '.')

# ルート管理グループを特定
root_group_name=$(echo "$management_groups_json" | jq -r '.[] | select(.parent == null) | .name')
root_group_display_name=$(echo "$management_groups_json" | jq -r '.[] | select(.parent == null) | .displayName')

# 再帰的にツリー形式で出力する関数
print_tree() {
  local parent_name=$1
  local indent=$2

  # 子の管理グループを取得
  local children=$(echo "$management_groups_json" | jq -r --arg parent "$parent_name" '.[] | select(.parent == $parent) | "\(.name)|\(.displayName)"')

  # 子が存在しない場合は終了
  if [ -z "$children" ]; then
    return
  fi

  # 子の管理グループ数をカウント
  local child_count=$(echo "$children" | grep -c '^')

  # 各子を順番に処理
  local index=0
  while IFS='|' read child_name child_display_name; do
    index=$((index + 1))

    # 最後の子かどうかを判定
    local is_last_child=false
    if [ $index -eq $child_count ]; then
      is_last_child=true
    fi

    # ツリー表記の記号を決定して出力
    if $is_last_child; then
      echo "${indent}└── $child_name ($child_display_name)"
      local new_indent="${indent}    "
    else
      echo "${indent}├── $child_name ($child_display_name)"
      local new_indent="${indent}│   "
    fi

    # 再帰呼び出し
    print_tree "$child_name" "$new_indent"
  done <<< "$children"
}

echo "$root_group_name ($root_group_display_name)"
print_tree "$root_group_name" ""

management_groups_json には各管理グループの ID と表示名、親管理グループの ID を抽出して格納しています。例えば、冒頭の出力結果の場合では、下記の情報が management_groups_json に格納されています。

[
    {
        "displayName": "Root",
        "name": "00000000-0000-0000-0000-000000000000",
        "parent": null
    },
    {
        "displayName": "IntermediateRoot",
        "name": "mg-intermediate-root",
        "parent": "00000000-0000-0000-0000-000000000000"
    },
    {
        "displayName": "LogArchive",
        "name": "mg-log-archive",
        "parent": "mg-security"
    },
    {
        "displayName": "Sandbox",
        "name": "mg-sandbox",
        "parent": "mg-intermediate-root"
    },
    {
        "displayName": "Security",
        "name": "mg-security",
        "parent": "mg-intermediate-root"
    },
    {
        "displayName": "SecurityTools",
        "name": "mg-security-tools",
        "parent": "mg-security"
    },
    {
        "displayName": "Workloads",
        "name": "mg-workloads",
        "parent": "mg-intermediate-root"
    },
    {
        "displayName": "WorkloadsExternal",
        "name": "mg-workloads-external",
        "parent": "mg-workloads"
    },
    {
        "displayName": "WorkloadsInternal",
        "name": "mg-workloads-internal",
        "parent": "mg-workloads"
    }
]

root_group_name と root_group_display_name のルート管理グループ情報の取得は、親管理グループが null であることを条件に特定しています。例えば、management_groups_json に格納されている次の管理グループが該当します。

    {
        "displayName": "Root",
        "name": "00000000-0000-0000-0000-000000000000",
        "parent": null
    },

print_tree() 関数で、再帰的にツリー構成の出力をします。第一引数に 管理グループの ID、第二引数に出力する際のインデントを指定します。第二引数のインデントの文字列分がツリー構成の一行の表示における最初のインデントとなります。そのため、最初に関数を呼び出す際は、第一引数にルート管理グループの ID、第二引数はインデントなしを示す "" を指定しています。

本シェルスクリプトは Azure Cloud Shell 上でも実行できます。私の環境では、表示には 1〜2 分かかりました。

さいごに

AWS Organizations の OU をツリー構成で表示させるブログを見かけて、Azure の管理グループでもツリー構成で表示させたいと思い、作成してみました。初めて見る環境などで管理グループを把握する際に利用できると思います。
以上、このブログがどなたかのご参考になれば幸いです。

この記事をシェアする

FacebookHatena blogX

関連記事