Menu

Azure DNS – Exportar zonas completas desde PowerShell

04/05/2020 - Uncategorized
Azure DNS – Exportar zonas completas desde PowerShell

Poder importar/exportar zonas en una solución de administración de registros DNS es una feature casi obligada.

En estos tiempos de Nube y adición de registros TXT por cada servicio que activamos, azure ofrece una solución administrada de servidores de nombre de dominio, con 4 servidores por zona. Un costo de USD 0.50 por cada zona (las primeras 25) y USD 0.40 por el primer billon de consultas/queries (mil millones para los latinoamericanos) lo hacen un servicio muy accesible. Más cuando se viene de un proveedor de servicios de hosting o carriers que requieren molestos tickets, poca independencia, y muchos errores por mala interpretación.

Azure permite múltiples métodos de administración y uno de ellos, como era esperable, es Powershell. El módulo Azure Az debe instalarse previamente para poder trabajar. Para ello es necesario abrir una ventana de Powershell con privilegios elevados, ejecutar la siguiente y continuar con las instrucciones (más información aquí)

install-Module -Name Az -AllowClobber

Para poder trabajar con el tenant se debe importar el módulo AZ, realizar una conexión con Azure AD

import-module az
Connect-AzAccount

Luego se debe elegir la subscripción en la que se trabajará. Si no se recuerda el nombre de la subscripción, se puede utilizar el comando get-AzSubscription

PS C:\>Get-AzSubscription | ft name

Name
----
SubscriptionName

PS C:\>Select-AzSubscription "SubscriptionName"

El comando Get-AzDNSZone mostrará todas las zonas alojadas en esa subscripción. Dos valores son importantes. El nombre, obviamente, pero tambien el Resource Group al cual está asociada la zona.

PS C:\> Get-AzDnsZone | ft Name,ResourceGroupName

Name               ResourceGroupName
----               -----------------
contoso.com        default-rg
contoso.com.ar     default-rg

Los registros de las zonas DNS se guardan en un recordset. Esto significa que, dado un nombre para un registro, multiples valores del mismo serán cargados en un RecordSet. Esto esta indicando que por cada registro pueden haber múltiples valores.

Por ejemplo, para los registros NS de una zona se crea un recordset con el Nombre “@” y un conjunto de servidores en ese objeto.

PS C:\> Get-AzDnsRecordSet -RecordType NS -ZoneName contoso.com -ResourceGroupName default-rg | select Name,Records

Name Records
---- -------
@    {ns1-06.azure-dns.com., ns2-06.azure-dns.net., ns3-06.azure-dns.org., ns4-06.azure-dns.info.}

Al exportar esto a un archivo de texto o separado por coma, puede convertirse en un resultado no deseado. Por empezar, se obtendrían todos los nombres de los servidores NS o MX, listados en una misma línea. Lo mismo aplica pra registros que estan configurados en Round Robin o registros TXT haciendo referencia al dominio.

Para resolver esto se puede utilizar, en una sola línea el siguiente comando:

$zone = Get-AzDnsRecordSet -ZoneName contoso.com -ResourceGroupName default-rg; foreach ($records in $zone) { foreach ($record in ($records.records)) { write-host "$($Records.zonename)`t$($records.name)`t$($Records.recordtype)`t$record`t$($records.ttl)" }} 
PowerShell - get-AzDNSRecordSet
Resultado del comando get-AzDnsRecordSet

Notar que dentro del write-host aparece el apóstrofe “`” y la letra t – esto obliga a imprimir un tab. Se podría reemplazar por una , o un ; pero el resultado es bastante simple y no permite exportar a un CSV.

Ejecutar este comando, zona por zona, se volvería tedioso. Por suerte se puede utilizar el comando Get-AzDnsZone y enviar al pipeline los datos para poder obtener la info de todas las zonas existentes en la subscripción.

get-azdnszone | foreach { $zone = Get-AzDnsRecordSet -ZoneName $_.name -ResourceGroupName default-rg; foreach ($records in $zone) { foreach ($record in ($records.records)) { write-host "$($Records.zonename)`t$($records.name)`t$($Records.recordtype)`t$record`t$($records.ttl)" }}}

Para poder manipular el resultado (por ej. seleccionando campos o exportado a un CSV) hay que convertir el resultado a una tabla hash. Notar que se reemplaza el write-host por la creación de un Custom Object con las propiedades ZoneName,Name,RecordType,Value y TTL.

$hash= @(); get-azdnszone | foreach { $zone = Get-AzDnsRecordSet -ZoneName $_.name -ResourceGroupName default-rg; foreach ($records in $zone) { foreach ($record in ($records.records)) { $registros = [PSCustomObject]@{"ZoneName"=($Records.zonename);"Name"=($records.name);"RecordType"=($Records.recordtype);"Value"=$record;"TTL"=($records.ttl)};$hash += $registros}} }

Este comando convertirá cada uno de los recordsets en un registro, con la información correspondiente de nombre, tipo de registro y ttl con el valor asociado. El resultado se almacenará en una hashtable llamada $hash.

Pera exportar se puede enviar todo el resultado del hash al comando export-csv

$hash | export-csv archivo.csv

Leave a Reply

Your email address will not be published. Required fields are marked *