Powershell script to get all parent resources - azure

Good day,
I am trying to figure out a way to get all the parent objects in my azure subcription to a csv from Azure.
By parent object, I am refering to objects like, VMs, Webapps, Kubernetes Clusters, ect. I want to strip away any data that is deemed illrevelant like Nics, PIPs, storage disks, ect. I am not super proficent in powershell. and I am not sure how to tackle this.
I have an azure workbook that I created that gives a good overview in a nice format, I would like to export the entire workbook for offline viewing but that doesn't seem to be possible.
Any help would be greatly appreiciated.

So, what's an "interesting" resource to you may not be to the next person, and vice versa - in some cases, for example, I may set up NICs independently of my VMs, and want to see them. I don't think there's a way to automatically get just the things you want. What you could do is create a list of resources that are interesting to you (by type), and then use Powershell to create your report:
Get 'em all and filter 'em
$resourceTypes = #(
'Microsoft.Compute/virtualMachines',
'Microsoft.Sql/servers',
'Microsoft.Sql/servers/databases'
)
$resources = #()
Get-AzResource | ForEach-Object {
if ($resourceTypes -contains $_.resourceType) {
$resources += [PSCustomObject] #{
ResourceGroupName = $_.ResourceGroupName
ResourceName = $_.ResourceName
ResourceType = $_.ResourceType
}
}
}
$resources | Sort-Object ResourceType, ResourceGroupName, ResourceName |
Export-Csv -Path <path to>\resources.csv
Get 'em type by type (this one loops through subscriptions to which you have access, will print out a line with the current context on each subscription, will restore context to the current subscription when done)
$resourceTypes = #(
'Microsoft.Compute/virtualMachines',
'Microsoft.Sql/servers',
'Microsoft.Sql/servers/databases'
)
$resources = #()
$currentContext = Get-AzContext
try {
Get-AzSubscription | ForEach-Object {
$_ | Set-AzContext
$subscriptionName = $_.Name
$resourceTypes | ForEach-Object {
Get-AzResource -ResourceType $_ | ForEach-Object {
$resources += [PSCustomObject] #{
SubscriptionName = $subscriptionName
ResourceGroupName = $_.ResourceGroupName
ResourceName = $_.ResourceName
ResourceType = $_.ResourceType
}
}
}
}
} finally {
$currentContext | Set-AzContext
}
$resources | Sort-Object ResourceType, SubscriptionName, ResourceGroupName, ResourceName |
Export-Csv -Path <path to>\resources.csv
Whichever approach you choose, just customize the $resourceTypes list to contain just the resource types that you want.
To get a list of resource types, I do something like this:
Get-AzResourceProvider -ProviderNamespace Microsoft.Sql |
Select ProviderNamespace -Expand ResourceTypes |
Select #{ L="Provider"; E={ "$($_.ProviderNameSpace)/$($_.ResourceTypeName)" } }
Leave off the -ProviderNamespace Microsoft.Sql if you want to get all resource types, but that will be a long list.

Related

Update Azure tags of resources

I am pretty new to powershell and please bear with me. I am building a script wherein I need to replace one of the key value pairs of a Tag of any resources in a certain subscription. It can be the "Name" or "Value" of a Tag.
I got a script that will find and old Tag key and replace it with a new Tag key. It checks all resources and locate the old tag and replace it with a new tag successfully. Now, my dilemma is it only do the job for the "Name" part of Tag but not with the "Value" of the tag. Can anyone help me on how to do the "Value" part of the Tag, please.
Over all, the code will search for a tag from $oldKey across all the resources and replace it with $newKey. It does create a report of what resources it made changes and put it to a csv file.
#Define old Tag key $oldkey and new Tag key $newKey
$oldKey = "camp"
$newKey = "Camp3"
#Find ResourceGroups with oldKey, backup findings to CSV, migrate existing oldKey value to newKey merging with existing tags, then delete oldKey.
$rgsOldKeyBackup = Get-AzResourceGroup | Where-Object {$_.Tags.Keys -match $oldKey}
$rgsOldKeyBackup.count
if ($rgsOldKeyBackup) {
Get-AzResourceGroup | Where-Object {$_.Tags.Keys -match $oldKey} | Out-File "C:\temp\AzRGs-Tag-Backup-$oldkey.csv"
$rgs = Get-AzResourceGroup | Where-Object {$_.Tags.Keys -match $oldKey}
$rgs | ForEach-Object {
$rgOldKeyValue = $_.Tags.$oldKey
$rgNewTag = #{$newKey=$rgOldKeyValue}
$rgOldTag = #{$oldKey=$rgOldKeyValue}
$resourceID = $_.ResourceId
Update-AzTag -ResourceId $resourceID -Tag $rgNewTag -Operation Merge
$Check = Get-AzResourceGroup -Id $resourceID | Where-Object {$_.Tags.Keys -match $newKey}
if ($Check) {
Update-AzTag -ResourceId $resourceID -Tag $rgOldTag -Operation Delete
}
}
}
#Find Resources with oldKey, backup findings to CSV, migrate existing oldKey value to newKey merging with existing tags, then delete oldKey.
$resourcesOldKeyBackup = Get-AzResource | Where-Object {$_.Tags.Keys -match $oldKey}
$resourcesOldKeyBackup.count
if ($resourcesOldKeyBackup) {
Get-AzResource | Where-Object {$_.Tags.Keys -match $oldKey} | Out-File "C:\temp\AzResources-Tag-Backup-$oldkey.csv"
$resources = Get-AzResource | Where-Object {$_.Tags.Keys -match $oldKey}
$resources | ForEach-Object {
$resourcesOldKeyValue = $_.Tags.$oldKey
$resourcesNewTag = #{$newKey=$resourcesOldKeyValue}
$resourcesOldTag = #{$oldKey=$resourcesOldKeyValue}
$resourceID = $_.ResourceId
Update-AzTag -ResourceId $resourceID -Tag $resourcesNewTag -Operation Merge
$Check = Get-AzResource -ResourceId $resourceID | Where-Object {$_.Tags.Keys -match $newKey}
if ($Check) {
Update-AzTag -ResourceId $resourceID -Tag $resourcesOldTag -Operation Delete
}
}
}
Also, I would appreciate if you can help as well to make it more interactive and will ask to input an old key I am looking for and what will be the replacement instead of hardcoding the values in the script itself.
I Tried to reproduce the same in my environment to replace the Azure Tags using Powershell:
PowerShell Script:
connect-azaccount
$oldTagKey = "OldTagKey"
$oldTagValue = "OldTagValue"
$replacedTags= #{"NewTagKey"="NewTagValue"}
#$resourcelist= Get-AzResource
$resources = Get-AzResourceGroup | Where-Object {$_.Tags.Keys -match "OldTagKey"}
foreach($item in $resources){
# Get the current tags for the resource
$tags = $item.Tags
if ($tags.ContainsKey($oldTagKey)) {
# Update the tag with the new tag key and value
$tags[$newTagKey] = $newTagValue
# Remove the old tag
$tags.Remove($oldTagKey)
Update-Aztag -ResourceId $item.ResourceId -Tag $replacedTags -Operation Replace
}
}
Azure Tag Name and Value both are updated with new values.
Once ran the above commands Tags are updated in Resource Group.
Refer MS Doc more about Azure Tags using Powershell.
to search for resource groups with tag name or value equals to xxx:
$searchPattern = 'xxx'
$resourceGroups = Search-AzGraph "ResourceContainers | where tags contains '$searchPattern' and type =~ 'microsoft.resources/subscriptions/resourcegroups'"
and then you just have to iterate over the result pretty much the same way you do. main advantage over your code - this scans all available subscriptions and does filtering on Azure side, so a lot quicker.

How to get list of all Azure subscriptions and resources using powershell (in specific format)

I am trying to execute below powershell script to get list of all Azure subscriptions and resource details,
Get-AzSubscription | ForEach-Object {
$subscriptionName = $_.Name
Set-AzContext -SubscriptionId $_.SubscriptionId
Get-AzResource | Select Name,ResourceGroupName,Location,Type
} | Export-Csv azureinventory.csv
However, its just dumping the data in one column in mentioned CSV file. I need each column to display Subscription name, Subscription ID, associated resource name, resource groupname, location, Type.
Please help to update the script accordingly.
Below Script will help you to get the details of your current subscription name, tenant id, environment, account name(or select your subscription after logging) and also the resource groups in that subscription, each resource group name, type, location of each resource available in that resource group, where you can export into excel sheet with a specific format like:
Script:
$ErrorActionPreference = "Stop"
try {
Connect-AZAccount
Set-AzContext -SubscriptionName 'Your Subscription Name'
$rgs = Get-AzResourceGroup
foreach ($rg in $rgs.ResourceGroupName)
{
Write-Output "Checking Resource Group: $rg"
Get-AzResource -ResourceGroupName $rg | Select Name, ResourceGroupName, Type, Location | Export-Csv .\AzureResources.csv -Append -Force -NoTypeInformation
} }
catch {
Write-Host "$($_.Exception.Message)" -BackgroundColor DarkRed
}
And the Output is:
It will check the resource groups existing or not. After that, open the AzureResources.csv file exported in the path where you executed your script in the PowerShell.
The exported file shows the data of resource group name, each resource name, its type and location in the tabular format.
I have updated the script and it is not tested. the parameter value can be different here. Kindly change it by verifying it from Get-Azresource.
$resources = #()
Get-AzSubscription | ForEach-Object {
$_ | Set-AzContext
$subscriptionName = $_.Name
$subscriptionId = $_.SubscriptionId
Get-AzResource | ForEach-Object {
$resources += [PSCustomObject]#{
SubscriptionName = $subscriptionName
SubscriptionId = $subscriptionId
ResourceGroupName = $_.ResourceGroupName
ResourceName = $_.ResourceName
ResourceType = $_.ResourceType
Location = $_.Location
}
}
}
$resources | Export-csv c:\sompeath\somename.csv

Using PowerShell, How to get list of all Azure subscriptions having Azure Data factory Resource in it?

I want to retrieve the list of subscriptions having Azure Data Factory resource in it. I want to use PowerShell and get the subscription list and ADF list.
I have tried Get-AzSubscription, but it does not contain filter for resource type i.e. Microsoft.DataFactory/factories. This filter can be added to only Get-AzResource.
Get-AzSubscription Module
Get-AzResource Module
Ok here you are:
$resType = "Microsoft.DataFactory/factories"
$resTypeName = "DataFactory"
Get-AzSubscription | ForEach-Object {
$subscriptionName = $_.Name
$tenantId = $_.TenantId
Set-AzContext -SubscriptionId $_.SubscriptionId -TenantId $_.TenantId
(Get-AzResource -ResourceType $ResType) | ForEach-Object {
[PSCustomObject] #{
true_sub = $subscriptionName
}
} | get-unique
} | Select-String 'true_sub' | ForEach-Object{ "Found_" + "$resTypeName" + "_In_Subscription= $($subscriptionName)"}
EDIT: Added variables to make it easily reusable for any resource type.
I used the code available here and here to create a custom one based on the requirements. Tested in my environment - it seems to work as expected.
I should disclose that I'm not an advanced PowerShell user, so the code I'm providing could really be sub-optimal.

Trying to list Azure Virtual Network and export to CSV using Powershell

I am trying to create a script that can list all the Azure virtual networks and export it into Csv using Powershell.
$day = Get-Date -Format " MMM-yyyy"
$path = "C:\Users\admin-vishal.singh\Desktop\Test\Report\"+ "$day-Vnet-Report.csv"
foreach ($Sub in $Subs) {
Select-AzSubscription -SubscriptionName $Sub.Name | Out-Null
$resource_grps = Get-AzResourceGroup
foreach ($resource_grp in $resource_grps) {
$networks = Get-AzVirtualNetwork
foreach ($vnet in $networks)
{
$null = Get-AzVirtualNetwork |Select-Object SubscriptionName,ResourceGroupName,Name,AddressSpace,Subnets,SubnetAddressSpace,RouteTable | Export-CSV -Path $path -NoTypeInformation -Encoding ASCII -Append
}
}
}
I am not able to retrieve data in the right format & getting errors when retrieving data.
Below is snippet of data
Lots of values I am not able to retrieve like Subnet AddressSpace, Route Tables and Routes.
Building on what Jim Xu provided, you don't need to have a separate loop for each ResourceGroup. Get-AzVirtualNetwork will return all virtual networks for the entire subscription. Also, you'll need an expression for the SubscriptionName in the Select-Object, so the code would look like this:
foreach ($Sub in $Subs) {
Select-AzSubscription -SubscriptionName $Sub.Name | Out-Null
Get-AzVirtualNetwork |
Select-Object `
#{label='SubscriptionName'; expression={$Sub.Name}}, `
ResourceGroupName, `
Name, `
#{label='AddressSpace'; expression={$_.AddressSpace.AddressPrefixes}}, `
#{label='SubnetName'; expression={$_.Subnets.Name}}, `
#{label='SubnetAddressSpace'; expression={$_.Subnets.AddressPrefix}} |
Export-CSV -Path $path -NoTypeInformation -Encoding ASCII -Append
}
When we call export-csv command, the property values are converted to strings using the ToString() method. But the result of Get-AzVirtualNetwork are object, we cannot directly convert the value to string. For more details, please refer to here and here
So regarding the issue, I suggest you create a custom object with the information you need then save it into csv.
For exmaple
$vents =Get-AzVirtualNetwork|
Select-Object SubscriptionName,ResourceGroupName,Name, #{
label='AddressSpace'
expression={$_.AddressSpace.AddressPrefix}}, #{
label='SubnetName'
expression={$_.Subnets.Name}
}, #{
label='SubnetAddressSpace'
expression={$_.Subnets.AddressPrefix}
}
$vents | convertto-csv

Add-Member to Az object

I'm writing a function that I can use for thumbing through all my subscriptions in azure and gather environment details (for auditing or bulk updating) and I'm trying to append the subscription the item came from into the return object so I can keep things sorted. This is the beginning of the function I'm building:
Function Find-AllAzResourceByType
{
Param (
[ValidateSet('SqlServer','KeyVault')]
[String]$type
)
ForEach($Subscription in (Get-AzSubscription))
{
Set-AzContext $subscription.Name | out-null
Switch ($type)
{
"SqlServer" {$return += Get-AzSqlServer | Add-Member 'Subscription' $subscription.Name}
"KeyVault" {$return += Get-AzKeyVault}
}
}
Return $return
}
I have tried several ways of calling the add-member:
Get-AzSqlServer | ForEach {$_ | Add-Member 'Subscription' $subscription.Name}
Get-AzSqlServer | ForEach {Add-Member -MemberType NoteProperty -Name 'Subscription' -value $subscription.Name -inputobject $_}
Get-AzSqlServer | Select-Object *,$Subscription.Name
and nothing I'm trying seems to work. I'm sure this is something obvious I'm missing but I'm failing to see it... anyone got any ideas?
If all you're interested in is finding about the subscription id of the resource, you don't really need to do all of this. You can extract the subscription id from the ResourceId property.
When I execute Get-AzSqlServer against my Azure Subscription, for each SQL Server I get the resource id in the following format:
/subscriptions/<my-subscription-id>/resourceGroups/<my-resource-group-name>/providers/Microsoft.Sql/servers/<my-database-server-name>
I can easily parse the above string to get the subscription id.

Resources