Created
January 28, 2025 00:06
-
-
Save devenes/7fa4188ac3267c49e949076b7a4ab7d7 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# Set the Azure subscription for the script to run | |
# Example: az account set --subscription <subscription_id> | |
# Parallel throttle limit - modify this based on your system capability | |
parallelThrottleLimit=16 | |
logFileName="LogAnalyticsAgentUninstallUtilityScriptLog.log" | |
inventoryFile="LogAnalyticsAgentExtensionInventory.csv" | |
# Function to handle logging | |
log_message() { | |
echo "$1" | tee -a $logFileName | |
} | |
# Function to get Arc servers with Log Analytics Agent extension installed | |
get_arc_servers_with_extension_installed() { | |
local fileName=$1 | |
log_message "Getting Arc server list..." | |
# Get the list of all resource groups | |
resourceGroups=$(az group list --query "[].name" --output tsv) | |
# Check if we got any resource groups | |
if [[ -z "$resourceGroups" ]]; then | |
log_message "No resource groups found in this subscription." | |
return | |
fi | |
arcServersCount=0 | |
# Iterate over each resource group | |
for rg in $resourceGroups; do | |
# Get the list of connected machines in the current resource group | |
serverList=$(az connectedmachine list -g "$rg" --query "[].{ResourceId:id, ResourceGroup:resourceGroup, ServerName:name}" --output json) | |
# Check if serverList is not empty | |
if [[ -n "$serverList" ]]; then | |
# Process each connected machine (Arc server) | |
echo "$serverList" | jq -c '.[]' | while read -r server; do | |
resourceId=$(echo "$server" | jq -r ".ResourceId") | |
resourceGroup=$(echo "$server" | jq -r ".ResourceGroup") | |
serverName=$(echo "$server" | jq -r ".ServerName") | |
# Get extensions for Arc server | |
extensions=$(az connectedmachine extension list -g "$resourceGroup" --machine-name "$serverName" --query "[?contains([\"MicrosoftMonitoringAgent\", \"OmsAgentForLinux\", \"AzureMonitorLinuxAgent\", \"AzureMonitorWindowsAgent\"], properties.type)].{type: properties.type, name: name}" --output json) | |
if [[ -n "$extensions" ]]; then | |
extensionName="" | |
amaExtensionInstalled="False" | |
# Determine extension name | |
if echo "$extensions" | jq -e '.[] | .type == "MicrosoftMonitoringAgent"' > /dev/null; then | |
extensionName="MicrosoftMonitoringAgent" | |
elif echo "$extensions" | jq -e '.[] | .type == "OmsAgentForLinux"' > /dev/null; then | |
extensionName="OmsAgentForLinux" | |
fi | |
# Check for AMA extensions | |
if echo "$extensions" | jq -e '.[] | .type == "AzureMonitorWindowsAgent" or .type == "AzureMonitorLinuxAgent"' > /dev/null; then | |
amaExtensionInstalled="True" | |
fi | |
# Export the result to CSV | |
echo "$resourceId,$serverName,$resourceGroup,ArcServer,$extensionName,$amaExtensionInstalled" >> "$fileName" | |
((arcServersCount++)) | |
fi | |
done | |
fi | |
done | |
log_message "Detected $arcServersCount Arc servers in this subscription." | |
} | |
# Function to get VMs with Log Analytics Agent extension installed | |
get_vms_with_extension_installed() { | |
local fileName=$1 | |
log_message "Getting VM list..." | |
vmList=$(az vm list --query "[].{ResourceId:id, ResourceGroup:resourceGroup, VmName:name}" --output json) | |
if [[ -z "$vmList" ]]; then | |
log_message "Cannot get the VM list" | |
return | |
fi | |
vmsCount=$(echo "$vmList" | jq length) | |
log_message "Detected $vmsCount VMs in this subscription." | |
echo "$vmList" | jq -c '.[]' | while read -r vm; do | |
resourceId=$(echo "$vm" | jq -r ".ResourceId") | |
resourceGroup=$(echo "$vm" | jq -r ".ResourceGroup") | |
vmName=$(echo "$vm" | jq -r ".VmName") | |
# Get extensions for VM | |
extensions=$(az vm extension list -g "$resourceGroup" --vm-name "$vmName" --query "[?contains([\"MicrosoftMonitoringAgent\", \"OmsAgentForLinux\", \"AzureMonitorLinuxAgent\", \"AzureMonitorWindowsAgent\"], typePropertiesType)].{type: typePropertiesType, name: name}" --output json) | |
if [[ -n "$extensions" ]]; then | |
extensionName="" | |
amaExtensionInstalled="False" | |
# Determine extension name | |
if echo "$extensions" | jq -e '.[] | .type == "MicrosoftMonitoringAgent"' > /dev/null; then | |
extensionName="MicrosoftMonitoringAgent" | |
elif echo "$extensions" | jq -e '.[] | .type == "OmsAgentForLinux"' > /dev/null; then | |
extensionName="OmsAgentForLinux" | |
fi | |
# Check for AMA extensions | |
if echo "$extensions" | jq -e '.[] | .type == "AzureMonitorWindowsAgent" or .type == "AzureMonitorLinuxAgent"' > /dev/null; then | |
amaExtensionInstalled="True" | |
fi | |
# Export the result to CSV | |
echo "$resourceId,$vmName,$resourceGroup,VM,$extensionName,$amaExtensionInstalled" >> "$fileName" | |
fi | |
done | |
} | |
# Function to get VMSS with Log Analytics Agent extension installed | |
get_vmss_with_extension_installed() { | |
local fileName=$1 | |
log_message "Getting VMSS list..." | |
vmssList=$(az vmss list --query "[?provisioningState=='Succeeded'].{ResourceId:id, ResourceGroup:resourceGroup, VmssName:name}" --output json) | |
vmssCount=$(echo "$vmssList" | jq length) | |
log_message "Detected $vmssCount VMSS in this subscription." | |
echo "$vmssList" | jq -c '.[]' | while read -r vmss; do | |
resourceId=$(echo "$vmss" | jq -r ".ResourceId") | |
resourceGroup=$(echo "$vmss" | jq -r ".ResourceGroup") | |
vmssName=$(echo "$vmss" | jq -r ".VmssName") | |
# Get extensions for VMSS | |
extensions=$(az vmss extension list -g "$resourceGroup" --vmss-name "$vmssName" --query "[?contains([\"MicrosoftMonitoringAgent\", \"OmsAgentForLinux\", \"AzureMonitorLinuxAgent\", \"AzureMonitorWindowsAgent\"], typePropertiesType)].{type: typePropertiesType, name: name}" --output json) | |
if [[ -n "$extensions" ]]; then | |
extensionName="" | |
amaExtensionInstalled="False" | |
# Determine extension name | |
if echo "$extensions" | jq -e '.[] | .type == "MicrosoftMonitoringAgent"' > /dev/null; then | |
extensionName="MicrosoftMonitoringAgent" | |
elif echo "$extensions" | jq -e '.[] | .type == "OmsAgentForLinux"' > /dev/null; then | |
extensionName="OmsAgentForLinux" | |
fi | |
# Check for AMA extensions | |
if echo "$extensions" | jq -e '.[] | .type == "AzureMonitorWindowsAgent" or .type == "AzureMonitorLinuxAgent"' > /dev/null; then | |
amaExtensionInstalled="True" | |
fi | |
# Export the result to CSV | |
echo "$resourceId,$vmssName,$resourceGroup,VMSS,$extensionName,$amaExtensionInstalled" >> "$fileName" | |
fi | |
done | |
} | |
# Main execution | |
if [[ "$1" == "GetInventory" ]]; then | |
log_message "Getting inventory..." | |
echo "ResourceId,Name,ResourceGroup,ResourceType,ExtensionName,AMA_Extension_Installed" > "$inventoryFile" | |
get_vms_with_extension_installed "$inventoryFile" | |
get_vmss_with_extension_installed "$inventoryFile" | |
get_arc_servers_with_extension_installed "$inventoryFile" | |
log_message "Inventory generated at $inventoryFile" | |
else | |
log_message "Invalid argument. Usage: ./logAnalyticsAgentUninstallUtility.sh GetInventory" | |
fi |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment