diff --git a/.DS_Store b/.DS_Store index 469460a..0cf029b 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/AzureBackupServer/.DS_Store b/AzureBackupServer/.DS_Store new file mode 100644 index 0000000..c83e4ca Binary files /dev/null and b/AzureBackupServer/.DS_Store differ diff --git a/AzureBackupServer/Artifacts/CSDownloadMabs.ps1 b/AzureBackupServer/Artifacts/CSDownloadMabs.ps1 new file mode 100644 index 0000000..29466f9 --- /dev/null +++ b/AzureBackupServer/Artifacts/CSDownloadMabs.ps1 @@ -0,0 +1,87 @@ +param ( + [Parameter(Mandatory)] + [string]$destination, + [Parameter(Mandatory)] + [string]$baseUrl, + [Parameter(Mandatory)] + [string]$urlMSFTAST, + [Parameter(Mandatory)] + [string]$prereqList, + [Parameter(Mandatory)] + [string]$vaultName +) + + +function DownloadInstallAZCopy { + + $dest = "MSFT_AzureStorageTools" + $dest = Join-Path $env:SystemDrive $destination + if(-not (Test-Path $dest)) { + New-Item -Path $dest -ItemType directory -Force + } + $output = "$dest\MicrosoftAzureStorageTools.msi" + if (-not (Test-Path $output)) { + Invoke-WebRequest -Uri $urlMSFTAST -OutFile $output + cd $dest + Start-Process C:\Windows\System32\msiexec.exe -ArgumentList "/package MicrosoftAzureStorageTools.msi /quiet" -wait + } + + if(Test-Path "C:\Program Files (x86)\Microsoft SDKs\Azure\AzCopy") { + Write-Verbose "Ok" + } + else + { + Throw "Aborting, Azure Storage Tools not installed correctly" + } +} + +function DownLoadPrereq { + $arrayList = $prereqList.split(",") + $dest = Join-Path $env:SystemDrive $destination + if(-not (Test-Path $dest)) { + New-Item -Path $dest -ItemType directory -Force + } + Foreach ($fileName in $arrayList) + { + $output = "$dest\$fileName" + $urlToDownload = $baseUrl+"/"+$fileName + if (-not (Test-Path $output)) { + cd "C:\Program Files (x86)\Microsoft SDKs\Azure\AzCopy" + .\AzCopy.exe /Source:$urlToDownload /Dest:$output + } + else + { + Throw "Error in downloading $filename mabs prerequisite" + } + } +} + +function DownloadVault { + $vaultUrl = $baseUrl+ "/" + $vaultName + $vaultPath = "c:\vaultProfile" + $vaultLocalPath = Join-Path $vaultPath $vaultName + if (-not (Test-Path $vaultPath)) { + New-Item -Path $vaultPath -ItemType directory -Force + } + cd "C:\Program Files (x86)\Microsoft SDKs\Azure\AzCopy" + .\AzCopy.exe /Source:$vaultUrl /Dest:$vaultLocalPath +} + +function InstallPrereqs { + $dest = Join-Path (Join-Path $env:SystemDrive $destination) "System_Center_Microsoft_Azure_Backup_Server_v3.exe" + if(Test-Path $dest) { + Start-Process $dest -ArgumentList "/verysilent /dir=c:\MABS" -wait + } +} + +function HypervInstall { + Start-Process "dism.exe" -ArgumentList "/Online /Enable-feature /All /FeatureName:Microsoft-Hyper-V /FeatureName:Microsoft-Hyper-V-Management-PowerShell /quiet /norestart" -wait +} + + +DownloadInstallAZCopy +DownLoadPrereq +InstallPrereqs +DownloadVault +HypervInstall + diff --git a/AzureBackupServer/Artifacts/MabsWorkload.ps1.zip b/AzureBackupServer/Artifacts/MabsWorkload.ps1.zip new file mode 100644 index 0000000..b9f48cb Binary files /dev/null and b/AzureBackupServer/Artifacts/MabsWorkload.ps1.zip differ diff --git a/AzureBackupServer/README.md b/AzureBackupServer/README.md new file mode 100644 index 0000000..98b069f --- /dev/null +++ b/AzureBackupServer/README.md @@ -0,0 +1,43 @@ +# Azure BackupS erver + +This Template deploys Azure Backup Server. +You can find more information about Azure Backup Server here: https://docs.microsoft.com/en-us/azure/backup/backup-mabs-install-azure-stack + + +## Requirements + +### Azure Stack + +THe following Marketplace Items must be installed on Azure Stack: + +- Windows Server 2016 Full Image +- DSC Extension +- Antimalware Extension +- Custom Script Extension for Windows +- Azure Diagnostic Extension for Windows +- Azure Performance Diagnostic + + +### Azure Backup Server + +- Azure Subscription +- Vault Credential File +- Azure Backup Server V3 setup files + +## Deployment + +### Deploy manually via Portal +1. Download artifacts and template +2. Create Vault in Azure +3. Download Vault Credentials File and Azure Backup Server Version 3 +4. Store the downloaded content in the artifacts folder +4. Upload the content from the artifacts folder into a new storage account +5. Deploy the Template + +### Content + +.\Template +This folder contains product template + +.\Artifacts +This folder contains required DSC, Custom scripts and Setup files diff --git a/AzureBackupServer/Template/azuredeploy.json b/AzureBackupServer/Template/azuredeploy.json new file mode 100644 index 0000000..aa1d573 --- /dev/null +++ b/AzureBackupServer/Template/azuredeploy.json @@ -0,0 +1,266 @@ +{ + "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json", + "contentVersion": "1.0.0.0", + "apiProfile": "2018-03-01-hybrid", + "parameters": { + "MabsAvailabiliySetName": { + "type": "string", + "defaultValue": "MabsASet" + }, + "vmPrefix": { + "type": "string", + "defaultValue": "srv" + }, + "domainName": { + "type": "string", + "defaultValue": "contoso.com" + }, + "adminUsername": { + "type": "string", + "metadata": { + "description": "Domain Admin username" + } + }, + "adminPassword": { + "type": "securestring", + "metadata": { + "description": "Domain Admin password" + } + }, + "passPhrase": { + "type": "securestring", + "minLength": 16, + "metadata": { + "description": "Mabs Passphrase, min 16 chars" + } + }, + "workloadsLocation": { + "type": "string", + "defaultValue": "https://workloads.blob.orlando.azurestack.corp.microsoft.com/workload" + }, + "vaultCredentialFileName": { + "type": "string", + "defaultValue": "vaultprem.VaultCredentials", + "metadata": { + "description": "name of the VaultCredential file" + } + }, + "NoOfDisks": { + "type": "int", + "defaultValue": "2", + "metadata": { + "description": "Number of disks for striped volume" + } + }, + "StorageSize": { + "type": "int", + "defaultValue": "500", + "metadata": { + "description": "size of each disk of striped volume" + } + } + }, + "variables": { + "mabsPrefix": "[concat(parameters('vmPrefix'),'-mabs')]", + "vmNicName": "[tolower(concat(variables('mabsPrefix'),'-nic'))]", + "prereqFileNames" : "System_Center_Microsoft_Azure_Backup_Server_v3-1.bin,System_Center_Microsoft_Azure_Backup_Server_v3-2.bin,System_Center_Microsoft_Azure_Backup_Server_v3-3.bin,System_Center_Microsoft_Azure_Backup_Server_v3-4.bin,System_Center_Microsoft_Azure_Backup_Server_v3-5.bin,System_Center_Microsoft_Azure_Backup_Server_v3-6.bin,System_Center_Microsoft_Azure_Backup_Server_v3-7.bin,System_Center_Microsoft_Azure_Backup_Server_v3.exe", + "imagePublisher": "MicrosoftWindowsServer", + "imageOffer": "WindowsServer", + "uniqueStorageAccountName": "[tolower(concat('sa-',variables('mabsPrefix'),'-', resourceGroup().name))]", + "location": "[resourceGroup().location]", + "vmOsSku": "2016-Datacenter", + "vmDataDiskName": "[concat('dd-',variables('mabsPrefix'), resourceGroup().name)]", + "vmSize": "Standard_DS3", + "nsgName": "[concat('MABSNsg',resourceGroup().name)]", + "nsgID": "[resourceId('Microsoft.Network/networkSecurityGroups',variables('nsgName'))]", + "staticSubnetName": "[concat('ADStaticSubnet',resourceGroup().name)]", + "virtualNetworkName": "[concat('ADVNET',resourceGroup().name)]", + "vnetID": "[resourceId('Microsoft.Network/virtualNetworks', variables('virtualNetworkName'))]", + "staticSubnetID": "[concat(variables('vnetID'),'/subnets/',variables('staticSubnetName'))]", + "modulesPath": "[concat(parameters('workloadsLocation'),'/')]", + "modulesMabsDownload": "CSDownloadMabs.ps1", + "MabsInstallerPath":"MabsInstaller", + "modulesUrlMabsDownload": "[concat(variables('modulesPath'),variables('modulesMabsDownload'))]", + "AzCopyURL": "[concat(variables('modulesPath'),'MicrosoftAzureStorageTools.msi')]", + "ModulesURL": "[concat(parameters('workloadsLocation'),'/MabsWorkload.ps1.zip')]", + "ConfigurationFunction": "MabsWorkload.ps1\\InstallAndConfigureMabs" + }, + "resources": [ + { + "type": "Microsoft.Compute/availabilitySets", + "name": "[parameters('MabsAvailabiliySetName')]", + "location": "[resourceGroup().location]", + "sku": { + "name": "Aligned" + }, + "properties": { + "platformUpdateDomainCount": 1, + "platformFaultDomainCount": 1 + } + }, + { + "type": "Microsoft.Network/networkSecurityGroups", + "name": "[variables('nsgName')]", + "location": "[variables('location')]", + "properties": { + "securityRules": [ + { + "name": "nsgsrule", + "properties": { + "protocol": "*", + "sourcePortRange": "*", + "destinationPortRange": "*", + "sourceAddressPrefix": "*", + "destinationAddressPrefix": "*", + "access": "Allow", + "priority": 101, + "direction": "Inbound" + } + } + ] + } + }, + { + "type": "Microsoft.Network/networkInterfaces", + "name": "[concat(variables('vmNicName'))]", + "dependsOn": [ + "[variables('nsgID')]" + ], + "location": "[variables('location')]", + "properties": { + "ipConfigurations": [ + { + "name": "ipconfigpublic", + "properties": { + "privateIPAllocationMethod": "Dynamic", + "subnet": { + "id": "[variables('staticSubnetId')]" + } + } + } + ] + } + }, + { + "type": "Microsoft.Compute/virtualMachines", + "name": "[concat(variables('mabsPrefix'))]", + "location": "[variables('location')]", + "dependsOn": [ + "[concat('Microsoft.Network/networkInterfaces/',variables('vmNicName'))]" + ], + "properties": { + "hardwareProfile": { + "vmSize": "[variables('vmSize')]" + }, + "availabilitySet": { + "id": "[resourceId('Microsoft.Compute/availabilitySets/', parameters('MabsAvailabiliySetName'))]" + }, + "osProfile": { + "computerName": "[concat(variables('mabsPrefix'))]", + "adminUsername": "[parameters('adminUsername')]", + "adminPassword": "[parameters('adminPassword')]" + }, + "storageProfile": { + "imageReference": { + "publisher": "[variables('imagePublisher')]", + "offer": "[variables('imageOffer')]", + "sku": "[variables('vmOsSku')]", + "version": "latest" + }, + "osDisk": { + "name": "[concat(variables('mabsPrefix'),'osdisk')]", + "managedDisk" : { + "storageAccountType" : "Premium_LRS" + }, + "caching": "ReadWrite", + "createOption": "FromImage" + }, + "copy": [ + { + "name": "dataDisks", + "count": "[parameters('NoOfDisks')]", + "input": { + "caching": "None", + "diskSizeGB": "[parameters('StorageSize')]", + "lun": "[copyIndex('dataDisks')]", + "name": "[concat(variables('vmDataDiskName'),'-',copyIndex('dataDisks'))]", + "managedDisk" : { + "storageAccountType" :"Premium_LRS" + }, + "createOption": "Empty" + } + } + ] + }, + "networkProfile": { + "networkInterfaces": [ + { + "id": "[resourceId('Microsoft.Network/networkInterfaces',concat(variables('vmNicName')))]" + } + ] + } + } + }, + { + "type": "Microsoft.Compute/virtualMachines/extensions", + "name": "[concat(variables('mabsPrefix'),'/CustomScriptExtension')]", + "location": "[variables('location')]", + "dependsOn": [ + "[concat('Microsoft.Compute/virtualMachines/',variables('mabsPrefix'))]" + ], + "properties": { + "publisher": "Microsoft.Compute", + "type": "CustomScriptExtension", + "typeHandlerVersion": "1.4", + "autoUpgradeMinorVersion": true, + "settings": { + "fileUris": [ + "[variables('modulesUrlMabsDownload')]" + ], + "commandToExecute": "[concat('powershell -ExecutionPolicy Unrestricted -file ',variables('modulesMabsDownload'),' -destination ',variables('MabsInstallerPath'),' -urlMSFTAST ',variables('AzCopyURL'),' -baseUrl ',parameters('workloadsLocation'),' -prereqList ',variables('prereqFileNames'),' -vaultName ',parameters('vaultCredentialFileName'))]" + } + } + }, + { + "name": "[concat(variables('mabsPrefix'),'/dscExtension')]", + "type": "Microsoft.Compute/virtualMachines/extensions", + "location": "[variables('location')]", + "dependsOn": [ + "[concat('Microsoft.Compute/virtualMachines/', concat(variables('mabsPrefix'),'/extensions/','CustomScriptExtension'))]" + ], + "tags": { + "displayName": "adfsDSCConfiguration" + }, + "properties": { + "publisher": "Microsoft.Powershell", + "type": "DSC", + "typeHandlerVersion": "2.76", + "autoUpgradeMinorVersion": true, + "settings": { + "modulesUrl": "[variables('ModulesURL')]", + "configurationFunction": "[variables('ConfigurationFunction')]", + "properties": { + "domainName": "[parameters('domainName')]", + "AdminCreds": { + "userName": "[parameters('adminUserName')]", + "password": "PrivateSettingsRef:adminPassword" + }, + "MABS_SecurityPassphrase": { + "userName": "[parameters('adminUserName')]", + "password": "PrivateSettingsRef:passPhrase" + }, + "NoOfDisks": "[parameters('NoOfDisks')]", + "VaultCredentialFilePath": "[concat('c:\\vaultProfile\\',parameters('vaultCredentialFileName'))]", + "PassphraseSaveLocation": "c:\\vaultProfile\\" + } + }, + "protectedSettings": { + "items": { + "adminPassword": "[parameters('adminPassword')]", + "passPhrase": "[parameters('passPhrase')]" + } + } + } + } + ] +} \ No newline at end of file diff --git a/AzureBackupServer/Template/azuredeploy.parameters.json b/AzureBackupServer/Template/azuredeploy.parameters.json new file mode 100644 index 0000000..3d32c73 --- /dev/null +++ b/AzureBackupServer/Template/azuredeploy.parameters.json @@ -0,0 +1,27 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json", + "contentVersion": "1.0.0.0", + "parameters": { + "domainName": { + "value": "contoso.com" + }, + "adminUsername": { + "value": "thoroetadm" + }, + "workloadsLocation": { + "value": "https://colab.blob.local.azurestack.external/workload" + }, + "vmPrefix": { + "value": "srv" + }, + "vaultCredentialFileName": { + "value": "Profile.VaultCredentials" + }, + "NoOfDisks": { + "value": "2" + }, + "StorageSize": { + "value": "100" + } + } +} diff --git a/ScaleInOutExistingVmss-managed/.DS_Store b/ScaleInOutExistingVmss-managed/.DS_Store new file mode 100644 index 0000000..94da8f6 Binary files /dev/null and b/ScaleInOutExistingVmss-managed/.DS_Store differ