ola a todos,
En este artículo vamos a explicar cómo automatizar el despliegue de informes de Reporting Services mediante la ejecución de scripts de PowerShell.
El script que vamos a crear leerá los informes que deseamos publicar en nuestro servidor de una carpeta y realizará el despliegue asignándole un origen de datos que le corresponda (el origen de datos debe estar creado con anterioridad).
Cómo automatizar el despliegue de informes de Reporting Services mediante la ejecución de scripts de PowerShell.
Vamos a trabajar principalmente con 2 archivos:
- Un fichero de configuración donde están los datos de conexión al server de reporting
- DespliegueSSRS.cfg
- El script principal PowerShell de ejecución.
- PS_Lab04_DeploySSRS.ps1
Para poder desplegar informes vamos a usar una librería de power Shell llamada ReportingServicesTools. Primero debemos instalarla mediante el comando:
Install-Module -Name ReportingServicesTools
Podemos ver todas las funciones que contiene mediante el comando:
Si al instalar os sale este error:
[DBG]: PS C:\Windows\system32>> Install-Module -Name ReportingServicesTools Install-Module : El término 'Install-Module' no se reconoce como nombre de un cmdlet, función, archivo de script o programa ejecutable. Compruebe si escribió correctamente el nombre o, si incluyó una ruta de acceso, compruebe que dicha ruta es correcta e inténtelo de nuevo.
Debéis instalar el administrador de paquetes, lo podéis bajar de la página de microsfot, en la url:
https://www.microsoft.com/en-us/download/details.aspx?id=51451
Una vez tenemos el entorno preparado pasamos a analizar el script que vamos a usar:
Nuestro fichero de parámetros tiene el siguiente contenido:
ServerName = SQLBI SSRSInstance = MSSQLSERVER SSRSURL = http://sqlbi/reportserver/ FolderFromDeploy = C:\ReportsToDeploy\ FolderToDeploy = /ReportsFolder
Donde vemos parametrizados los siguientes elementos:
- ServerName: Nombre del servidor donde esta albergado el SSRS
- SSRSInstance: Nombre de la instancia de SQL Server, por defecto es MSSQLSERVER
- SSRSURL: La URL donde se almacenan los informes por defecto es bajo la carpeta “reportserver”
- FolderFromDeploy: ruta de la carpeta donde están los informes .rdl o .rds que vamos a desplegar
- FolderToDeploy: Nombre de la carpeta del servidor donde deseamos desplegar
Los pasos que sigue el script son los siguientes:
Primero cargamos el fichero de configuración en una tabla hash:
$pRutaFicheroParam = "C:\PowerShell\DespliegueSSRS.cfg" $ConfigParam = @{} Get-Content $pRutaFicheroParam | foreach { $line = $_.split("=") $ConfigParam.($line[0].Trim()) = $line[1].Trim() }
Conectamos con el servidor:
Connect-RsReportServer -ComputerName $ConfigParam.ServerName -ReportServerInstance $ConfigParam.SSRSInstance -Uri $ConfigParam.SSRSURL
Creamos la carpeta donde desplegaremos los informes si no existe:
Try { New-RsFolder -ReportServerUri $ConfigParam.SSRSURL -Path / -Name $ConfigParam.FolderToDeploy -Verbose } catch { if ($_.Exception.HResult -eq -2146233088) { Write-Host ("La Carpeta " + $ConfigParam.FolderToDeploy + " ya existe" ) } else { $ErrorMessage = $_.Exception.Message LogWrite -Text $ErrorMessage -Color Red break } }
La siguiente instrucción carga en una variable la lista de informes que hay en la carpeta que vamos a desplegar y luego nos da a elegir, mediante un menú emergente, los informes que queremos enviar.
$ValidFiles = Get-ChildItem ($ConfigParam.FolderFromDeploy + "*") -Include *.rdl, *.rsd $FilesToDeploy = $ValidFiles | Out-GridView -PassThru
El menú desplegable tiene el siguiente aspecto:
Los nombres de los informes seleccionados se guardan en la variable $FilesToDeploy.
Luego obtenemos la lista de informes que contiene la carpeta del portal de informes (carpeta de destino) donde vamos a desplegar y publicamos los informes contenidos en la variable $FilesToDeploy, si el informe ya existe se borra antes de copiarlo.
$Reports = Get-RsFolderContent -ReportServerUri $ConfigParam.SSRSURL -RsFolder $ConfigParam.FolderToDeploy foreach ($File in $FilesToDeploy) { $ExistReport = $Reports | Where Name -eq ($File.Name.Replace(".rdl","").Replace(".rsd","")) if ($ExistReport -ne $null) { Remove-RsCatalogItem -ReportServerUri $ConfigParam.SSRSURL -RsFolder $ExistReport.Path Write-RsCatalogItem -ReportServerUri $ConfigParam.SSRSURL -Destination ($ConfigParam.FolderToDeploy) -OverWrite -Path ($ConfigParam.FolderFromDeploy + $File.Name) Write-Host (" Se ha recreado el informe: " + ($ConfigParam.FolderFromDeploy + $File.Name) + " en la ruta del server: "+ ($ConfigParam.FolderToDeploy +"/" + $File.Name.Replace(".rdl","").Replace(".rsd","")) ) } else { Write-RsCatalogItem -ReportServerUri $ConfigParam.SSRSURL -Destination ($ConfigParam.FolderToDeploy) -OverWrite -Path ($ConfigParam.FolderFromDeploy + $File.Name) Write-Host (" Se ha creado el informe: " + ($ConfigParam.FolderFromDeploy + $File.Name) ) } }
Por último para cada informe establecemos su origen de datos. Cada informe puede tener uno o más orígenes de datos, lo que hacemos es recorrer mediante un bucle “for” todos los informes y restablecerle sus orígenes de datos.
En este ejemplo en el servidor existen 2 orígenes de datos uno que conecta con la base de datos relacional y otro que conecta con un cubo OLAP Los informes que publicamos pueden usar el origen relacional, el olap o los dos.
Lo que hacemos es intentar establecer los 2 orígenes de datos a todos los informes que vamos a desplegar, pero controlamos el error de modo que si un informe no hace uso de uno de los orígenes de datos no salte el error.
$Reports = Get-RsFolderContent -ReportServerUri $ConfigParam.SSRSURL -RsFolder ($ConfigParam.FolderToDeploy) foreach ($Report in $Reports ) { if ($Report.TypeName -eq "Report") { Try{Set-RsDataSourceReference -Path $Report.Path -DataSourceName Comercial -DataSourcePath "/Origenes de Dato/DW_Comercial"} Catch { if( $_.Exception.hresult -ne -2146233087) { $ErrorMessage = $_.Exception.Message Write-Host ($ErrorMessage) break } } } if ($Report.TypeName -eq "Report") { Try{Set-RsDataSourceReference -Path $Report.Path -DataSourceName CubeComercial -DataSourcePath "/Origenes de Datos/DW_Comercial_Cube"} Catch { if( $_.Exception.hresult -ne -2146233087) { $ErrorMessage = $_.Exception.Message Write-Host ($ErrorMessage) break } } } } Write-Host ("Se ha Establecido los datasources correctamente")
El script completo es el siguiente:
#Establecemos variables de inicio (Parametros) $pRutaFicheroParam = "C:\PowerShell\DespliegueSSRS.cfg" #Cargamos un array con los datos de los parametros del fichero pRutaFicheroParam #----------------------------------------------------------------------------- $ConfigParam = @{} # Tabla de hash para guardar los pares Parametro - Valor Get-Content $pRutaFicheroParam | foreach { $line = $_.split("=") $ConfigParam.($line[0].Trim()) = $line[1].Trim() } #----------------------------------------------------------------------------- #Conectamos con el servidor de Reporting Services #----------------------------------------------------------------------------- Connect-RsReportServer -ComputerName $ConfigParam.ServerName -ReportServerInstance $ConfigParam.SSRSInstance -Uri $ConfigParam.SSRSURL #----------------------------------------------------------------------------- #Creamos una carpeta para almacenar los informes y sus datasets #----------------------------------------------------------------------------- Try { New-RsFolder -ReportServerUri $ConfigParam.SSRSURL -Path / -Name $ConfigParam.FolderToDeploy -Verbose } catch { if ($_.Exception.HResult -eq -2146233088) { Write-Host ("La Carpeta " + $ConfigParam.FolderToDeploy + " ya existe" ) } else { $ErrorMessage = $_.Exception.Message LogWrite -Text $ErrorMessage -Color Red break } } #----------------------------------------------------------------------------- #Elegimos los Reports de una carpeta seleccionandolos mediante una ventana #----------------------------------------------------------------------------- $ValidFiles = Get-ChildItem ($ConfigParam.FolderFromDeploy + "*") -Include *.rdl, *.rsd $FilesToDeploy = $ValidFiles | Out-GridView -PassThru #----------------------------------------------------------------------------- #Obtenemos la lista de informes publicados #----------------------------------------------------------------------------- $Reports = Get-RsFolderContent -ReportServerUri $ConfigParam.SSRSURL -RsFolder $ConfigParam.FolderToDeploy) #----------------------------------------------------------------------------- #Publicamos los informes leidos en el directorio, si ya exite lo eliminamos foreach ($File in $FilesToDeploy) { $ExistReport = $Reports | Where Name -eq ($File.Name.Replace(".rdl","").Replace(".rsd","")) if ($ExistReport -ne $null) { Remove-RsCatalogItem -ReportServerUri $ConfigParam.SSRSURL -RsFolder $ExistReport.Path Write-RsCatalogItem -ReportServerUri $ConfigParam.SSRSURL -Destination ($ConfigParam.FolderToDeploy) -OverWrite -Path ($ConfigParam.FolderFromDeploy + $File.Name) Write-Host (" Se ha recreado el informe: " + ($ConfigParam.FolderFromDeploy + $File.Name) + " en la ruta del server: "+ ($ConfigParam.FolderToDeploy +"/" + $File.Name.Replace(".rdl","").Replace(".rsd","")) ) } else { Write-RsCatalogItem -ReportServerUri $ConfigParam.SSRSURL -Destination ($ConfigParam.FolderToDeploy) -OverWrite -Path ($ConfigParam.FolderFromDeploy + $File.Name) Write-Host (" Se ha creado el informe: " + ($ConfigParam.FolderFromDeploy + $File.Name) ) } } #Para cada informe establecemos los datasources correspondientes #----------------------------------------------------------------------------- $Reports = Get-RsFolderContent -ReportServerUri $ConfigParam.SSRSURL -RsFolder ($ConfigParam.FolderToDeploy) foreach ($Report in $Reports ) { if ($Report.TypeName -eq "Report") { Try{Set-RsDataSourceReference -Path $Report.Path -DataSourceName Comercial -DataSourcePath "/Origenes de Dato/DW_Comercial"} Catch { if( $_.Exception.hresult -ne -2146233087) { $ErrorMessage = $_.Exception.Message Write-Host ($ErrorMessage) break } } } if ($Report.TypeName -eq "Report") { Try{Set-RsDataSourceReference -Path $Report.Path -DataSourceName CubeComercial -DataSourcePath "/Origenes de Datos/DW_Comercial_Cube"} Catch { if( $_.Exception.hresult -ne -2146233087) { $ErrorMessage = $_.Exception.Message Write-Host ($ErrorMessage) break } } } } Write-Host ("Se ha Establecido los datasources correctamente")
Espero que este script os sirva como punto de partida para realizar de forma automática vuestros despliegues.
Reporting Services mediante la ejecución de scripts de PowerShell.
Un Saludo !
2 comments
Excelente artículo!
Gracias, en breve incluiré algún otro post mas sobre powershell.