Azure 管理グループをツリー形式で表示するシェルスクリプトを作ってみた
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 の管理グループでもツリー構成で表示させたいと思い、作成してみました。初めて見る環境などで管理グループを把握する際に利用できると思います。
以上、このブログがどなたかのご参考になれば幸いです。






