Skip to content

Instantly share code, notes, and snippets.

@SyntaxC4
Last active August 29, 2015 13:59
Show Gist options
  • Select an option

  • Save SyntaxC4/10935798 to your computer and use it in GitHub Desktop.

Select an option

Save SyntaxC4/10935798 to your computer and use it in GitHub Desktop.

Revisions

  1. Cory Fowler revised this gist Apr 17, 2014. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion Create-Primary-Environment.ps1
    Original file line number Diff line number Diff line change
    @@ -23,4 +23,4 @@ Invoke-AzureEnvironmentSetup -EnvironmentSubscriptionName $EnvironmentSubscripti
    -EnvironmentStagingSites $EnvironmentStagingSites `
    -EnvironmentStorageAccount $EnvironmentStorageAccount `
    -StorageContainers $StorageContainers `
    -PublishSettingsFile $PublishSettingsFile
    -PublishSettingsFile $PublishSettingsFile
  2. Cory Fowler created this gist Apr 16, 2014.
    26 changes: 26 additions & 0 deletions Create-Primary-Environment.ps1
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,26 @@
    function Get-ScriptDirectory {
    $Invocation = (Get-Variable MyInvocation -Scope 1).Value
    Split-Path $Invocation.MyCommand.Path
    }

    $FunctionToRegister = Join-Path (Get-ScriptDirectory) "setup\Invoke-AzureEnvironmentSetup.ps1"
    . "$FunctionToRegister"

    #### Primary Environment
    $EnvironmentSubscriptionName = "Primary Subscription Name"
    $EnvironmentPrimaryLocation = "West US"
    $StorageEnvironmentLocation = "West US"
    $EnvironmentWebSites = @{"mysite"=$EnvironmentPrimaryLocation;"mysite-ne"="North Europe";"mysite-je"="Japan East"}
    $EnvironmentStagingSites = @{"mysite"=$EnvironmentPrimaryLocation}
    $EnvironmentStorageAccount = "mysitestorage"
    $StorageContainers = @('uploads','thumbnails')
    $PublishSettingsFile = Join-Path (Get-ScriptDirectory) "setup\assets\publishSettings\primary.publishsettings"

    Invoke-AzureEnvironmentSetup -EnvironmentSubscriptionName $EnvironmentSubscriptionName `
    -EnvironmentPrimaryLocation $EnvironmentPrimaryLocation `
    -StorageEnvironmentLocation $StorageEnvironmentLocation `
    -EnvironmentWebSites $EnvironmentWebSites `
    -EnvironmentStagingSites $EnvironmentStagingSites `
    -EnvironmentStorageAccount $EnvironmentStorageAccount `
    -StorageContainers $StorageContainers `
    -PublishSettingsFile $PublishSettingsFile
    117 changes: 117 additions & 0 deletions Invoke-AzureEnvironmentSetup.ps1
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,117 @@
    function Invoke-AzureEnvironmentSetup {
    [CmdletBinding()]
    param([Parameter(Mandatory=$true)]$EnvironmentSubscriptionName,
    [Parameter(Mandatory=$true)]$EnvironmentPrimaryLocation,
    [Parameter(Mandatory=$true)]$StorageEnvironmentLocation,
    [Parameter(Mandatory=$true)]$EnvironmentWebSites,
    [Parameter(Mandatory=$true)]$EnvironmentStagingSites,
    [Parameter(Mandatory=$true)]$EnvironmentStorageAccount,
    [Parameter(Mandatory=$true)]$StorageContainers,
    [Parameter(Mandatory=$false)]$publishSettingsFile)

    begin {

    Write-Host "Importing Publish Settings file: " (Get-Date)
    if ($publishSettingsFile) {
    Import-AzurePublishSettingsFile -PublishSettingsFile $publishSettingsFile
    azure account import $publishSettingsFile
    }

    Select-AzureSubscription -Default $EnvironmentSubscriptionName
    azure account set $EnvironmentSubscriptionName

    Write-Host "Start Deleting Services: " (Get-Date)

    Write-Host "Deleting Staging WebSites: " (Get-Date)
    $DeleteStagingWebSitesJobs = @()
    $EnvironmentStagingSites.GetEnumerator() | % {
    $DeleteStagingWebSitesJobs += Start-Job -ScriptBlock { if(Test-AzureName -WebSite ($args[0] + "-staging")) { Remove-AzureWebsite -Name $args[0] -Slot Staging -Force } } -ArgumentList $_.Name
    }
    Wait-Job -Job $DeleteStagingWebSitesJobs

    Write-Host "Deleting WebSites: " (Get-Date)
    $DeleteWebSitesJobs = @()
    $EnvironmentWebSites.GetEnumerator() | % {
    $DeleteWebSitesJobs += Start-Job -ScriptBlock { if(Test-AzureName -WebSite $args[0]) { Remove-AzureWebsite -Name $args[0] -Force } } -ArgumentList $_.Name
    }
    Wait-Job -Job $DeleteWebSitesJobs


    if ((Test-AzureName -Storage $EnvironmentStorageAccount)) {
    Write-Host "Deleting Storage Containers: " (Get-Date)
    $StorageAccountKey = (Get-AzureStorageKey -StorageAccountName $EnvironmentStorageAccount).Primary
    $StorageContainerJobs = @()
    $StorageContainers | % {
    $StorageContainerJobs += Start-Job -ScriptBlock { param($container,$storageName,$storageKey) Invoke-Expression -Command "azure storage container delete --container $container --account-name $storageName --account-key $storageKey -q" } -ArgumentList $_, $EnvironmentStorageAccount, $StorageAccountKey
    }
    Wait-Job $StorageContainerJobs
    }

    Write-Host "Finished Deleting Services: " (Get-Date)
    }

    process {
    Write-Host "Starting to Provision Services: " (Get-Date)

    ############################
    ### Web Sites Operations ###
    ############################

    Write-Host "Creating Web Sites: " (Get-Date)
    $SiteCreateJobs = @()
    $EnvironmentWebSites.GetEnumerator() | % {
    #PowerShell doesn't support Scale Mode... Xplat to the rescue!
    $SiteCreateJobs += Start-Job -ScriptBlock { azure site create --location $args[1] $args[0]; azure site scale mode 'standard' $args[0] } -ArgumentList $_.Name, $_.Value
    }
    Wait-Job -Job $SiteCreateJobs

    Write-Host "Finished Changing Web Sites Mode"

    ## azure site create --slot
    Write-Host "Adding Site Slot to Web Sites"
    $StagingCreateJobs = @()
    $EnvironmentStagingSites.GetEnumerator() | % {
    $StagingCreateJobs += Start-Job -ScriptBlock { New-AzureWebsite -Name $args[0] -Location $args[1] -Slot "Staging" } -ArgumentList $_.Name, $_.Value
    }
    Wait-Job -Job $StagingCreateJobs
    Write-Host "Finished Web Sites Creation"

    ##########################
    ### Storage Operations ###
    ##########################

    ## create storage account if it does not exist
    if (!(Test-AzureName -Storage $EnvironmentStorageAccount)) {
    Write-Host "Creating Storage Account: " (Get-Date)
    $StorageCreateJob = Start-Job -ScriptBlock { New-AzureStorageAccount -StorageAccountName $args[0] -Label $args[0] -Location $args[1] } -ArgumentList $EnvironmentStorageAccount, $StorageEnvironmentLocation

    Wait-Job -Job $StorageCreateJob; # if ($StorageCreateJob.HasMoreData) { Receive-Job -Job $StorageCreateJob };
    Write-Host "Finished Storage Account Creation: " (Get-Date)
    }

    $StorageContainerJobs = @()
    $StorageAccountKey = (Get-AzureStorageKey -StorageAccountName $EnvironmentStorageAccount).Primary
    $StorageContainers | % {
    $StorageContainerJobs += Start-Job -ScriptBlock {param($container,$storageName,$storageKey) Invoke-Expression -Command "azure storage container create --permission 'Blob' --container $container --account-name $storageName --account-key $storageKey" } -ArgumentList $_, $EnvironmentStorageAccount, $StorageAccountKey
    }
    Wait-Job $StorageContainerJobs

    #########################
    ### Shared Operations ###
    #########################

    ## azure site connectionstring add
    $StorageConnectionString = "DefaultEndpointsProtocol=https;AccountName=$EnvironmentStorageAccount;AccountKey=$StorageAccountKey"
    $WebSitesConnectionStrings = @(@{Name="AzureJobsRuntime";ConnectionString=$StorageConnectionString;Type="Custom"},@{Name="AzureJobsData";ConnectionString=$StorageConnectionString;Type="Custom"},@{Name="StorageConnectionString";ConnectionString=$StorageConnectionString;Type="Custom"})

    Write-Host "Inject Connection Strings into Web Sites (Async)"
    $EnvironmentWebSites.GetEnumerator() | % {
    Start-Job -ScriptBlock { Set-AzureWebsite -ConnectionStrings $args[2] -AppSettings @{"TrafficManagerRegion"=$args[1]} -Name $args[0] } -ArgumentList $_.Name, $_.Value, $WebSitesConnectionStrings
    }
    $EnvironmentStagingSites.GetEnumerator() | % {
    Start-Job -ScriptBlock { Set-AzureWebsite -ConnectionStrings $args[1] -Name $args[0] -Slot 'Staging' } -ArgumentList $_.Name, $WebSitesConnectionStrings
    }

    Write-Host "Finished Provisioning Services: " (Get-Date)
    }
    }