Skip to content

Instantly share code, notes, and snippets.

@devenes
Created January 28, 2025 00:06
Show Gist options
  • Save devenes/7fa4188ac3267c49e949076b7a4ab7d7 to your computer and use it in GitHub Desktop.
Save devenes/7fa4188ac3267c49e949076b7a4ab7d7 to your computer and use it in GitHub Desktop.
#!/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