IIS AppPool - Create

Octopus.Script exported 2018-09-18 by droorda belongs to ‘IIS’ category.

Creates or Reconfigures an IIS Application Pool

Parameters

When steps based on the template are included in a project’s deployment process, the parameters below can be set.

Application pool name

AppPoolName =

The name of the application pool that the application will run under.

Identity Type

AppPoolIdentityType = 3

The type of identity that the application pool will be using.

Specific User Name

AppPoolIdentityUser =

(Specific User) The user name to use with the application pool identity.

Specific User Password

AppPoolIdentityPassword =

(Specific User) The password for the specific user to use with the application pool identity.

Load User Profile

AppPoolLoadUserProfile = True

This setting specifies whether IIS loads the user profile for an application pool identity.

Enable 32-Bit Applications

AppPoolEnable32BitAppOnWin64 = True

Allows the application pool to run 32-bit applications when running on 64-bit windows.

Start Automatically

AppPoolAutoStart = True

Automatically start the application pool when the application pool is created or whenever IIS is started.

Managed Runtime Version

AppPoolManagedRuntimeVersion = v4.0

Specifies the CLR version to be used by the application pool.

Managed Pipeline Mode

AppPoolManagedPipelineMode = 0

Specifies the request-processing mode that is used to process requests for managed content.

Process Idle Timeout

AppPoolIdleTimeoutMinutes = 20

Amount of time (in minutes) a worker process will remain idle before it shuts down. A value of 0 means the process does not shut down after an idle timeout.

Maximum Worker Processes

AppPoolMaxProcesses = 1

Maximum number of worker processes permitted to service requests for the application pool.

Regular Time Interval

AppPoolRegularTimeInterval = 1740

Period of time (in minutes) after which an application pool will recycle. A value of 0 means the application pool does not recycle on a regular interval.

Application pool periodic recycle time

AppPoolPeriodicRecycleTime = 03:00:00

A specific local time, in minutes after midnight, when the application pool is recycled. Separate multiple times by using a ,\n\nExample: “00:30:00” for half an hour past midnight. or “06:00:00” for midnight and 6 am.

Queue Length

AppPoolQueueLength = 1000

Maximum number of requests that HTTP.sys will queue for the application pool. When the queue is full, new requests receive a 504 “Service Unavailable” response.

Start Mode

AppPoolStartMode = OnDemand

Specifies whether the application pool should run in On Demand Mode or Always Running Mode.

CPU Limit (percent)

AppPoolCpuLimit = 0

Configures the maximum percentage of CPU time (in percent) that the worker processes in an application pool are allowed to consume over a period of time as indicated by the resetInterval attribute. If the limit set by the limit attribute is exceeded, an event is written to the event log and an optional set of events can be triggered. These optional events are determined by the action attribute.

The default value is 0, which disables CPU limiting.

CPU Limit Action

AppPoolCpuLimitAction = 0

Configures the action that IIS takes when a worker process exceeds its configured CPU limit. The action attribute is configured on a per-application pool basis.

The action attribute can be one of the following possible values. The default value is NoAction.

Script body

Steps based on this template will execute the following PowerShell script.

function Validate-Parameter {
    Param(
        [Parameter(Position=0)][string]$Parameter,
        [Parameter(Mandatory=$true, Position=1)][string]$ParameterName
    )
    if (!$ParameterName -contains 'Password') {
        Write-Host ('{0}: {1}' -f ${ParameterName},$Parameter)
    }
    if (!$Parameter) {
        Write-Error ('No value was set for {0}, and it cannot be empty' -f $ParameterName)
    }
}

function Execute-Retry {
    Param(
        [Parameter(Mandatory=$true, Position=0)][ScriptBlock]$Command
    )
	$attemptCount = 0
	$operationIncomplete = $true
    $maxFailures = 5
    $sleepBetweenFailures = Get-Random -minimum 1 -maximum 4
	while ($operationIncomplete -and $attemptCount -lt $maxFailures) {
		$attemptCount = ($attemptCount + 1)
		if ($attemptCount -ge 2) {
			Write-Output ('Waiting for {0} seconds before retrying ...' -f $sleepBetweenFailures)
			Start-Sleep -s $sleepBetweenFailures
			Write-Output 'Retrying ...'
		}
		try {
			& $Command
			$operationIncomplete = $false
		} catch [System.Exception] {
			if ($attemptCount -lt ($maxFailures)) {
				Write-Output ('Attempt {0} of {1} failed: {2}' -f $attemptCount,$maxFailures,$_.Exception.Message)
			}
			else {
                Write-Host 'Failed to execute command'
			}
		}
	}
}

function Get-ScheduledTimes {
    Param(
        [Parameter(Position=0)][string]$Schedule
    )
    if (!$Schedule) {
        return @()
    }
    $minutes = $Schedule.Split(',')
    $minuteArrayList = New-Object System.Collections.ArrayList(,$minutes)
    return $minuteArrayList
}

[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.Web.Administration')
Add-PSSnapin WebAdministration -ErrorAction SilentlyContinue
Import-Module WebAdministration -ErrorAction SilentlyContinue

$appPoolName = $OctopusParameters['AppPoolName']
$appPoolIdentityType = $OctopusParameters['AppPoolIdentityType']
if ($appPoolIdentityType -eq 3) {
    $appPoolIdentityUser = $OctopusParameters['AppPoolIdentityUser']
    $appPoolIdentityPassword = $OctopusParameters['AppPoolIdentityPassword']
}
$appPoolLoadUserProfile = [boolean]::Parse($OctopusParameters['AppPoolLoadUserProfile'])
$appPoolAutoStart = [boolean]::Parse($OctopusParameters['AppPoolAutoStart'])
$appPoolEnable32BitAppOnWin64 = [boolean]::Parse($OctopusParameters['AppPoolEnable32BitAppOnWin64'])
$appPoolManagedRuntimeVersion = $OctopusParameters['AppPoolManagedRuntimeVersion']
$appPoolManagedPipelineMode = $OctopusParameters['AppPoolManagedPipelineMode']
$appPoolIdleTimeout = [TimeSpan]::FromMinutes($OctopusParameters['AppPoolIdleTimeoutMinutes'])
$appPoolPeriodicRecycleTime = $OctopusParameters['AppPoolPeriodicRecycleTime']
$appPoolMaxProcesses = [int]$OctopusParameters['AppPoolMaxProcesses']
$appPoolRegularTimeInterval = [TimeSpan]::FromMinutes($OctopusParameters['AppPoolRegularTimeInterval'])
$appPoolQueueLength = [int]$OctopusParameters['AppPoolQueueLength']
$appPoolStartMode = $OctopusParameters['AppPoolStartMode']
$appPoolCpuAction = $OctopusParameters['AppPoolCpuLimitAction']
$appPoolCpuLimit = [int]$OctopusParameters['AppPoolCpuLimit']

Validate-Parameter -Parameter $appPoolName -ParameterName 'Application Pool Name'
Validate-Parameter -Parameter $appPoolIdentityType -ParameterName 'Identity Type'
if ($appPoolIdentityType -eq 3) {
    Validate-Parameter -Parameter $appPoolIdentityUser -ParameterName 'Identity UserName'
    # If using Group Managed Serice Accounts, the password should be allowed to be empty
}
Validate-Parameter -Parameter $appPoolLoadUserProfile -parameterName 'Load User Profile'
Validate-Parameter -Parameter $appPoolAutoStart -ParameterName 'AutoStart'
Validate-Parameter -Parameter $appPoolEnable32BitAppOnWin64 -ParameterName 'Enable 32-Bit Apps on 64-bit Windows'
Validate-Parameter -Parameter $appPoolManagedRuntimeVersion -ParameterName 'Managed Runtime Version'
Validate-Parameter -Parameter $appPoolManagedPipelineMode -ParameterName 'Managed Pipeline Mode'
Validate-Parameter -Parameter $appPoolIdleTimeout -ParameterName 'Process Idle Timeout'
Validate-Parameter -Parameter $appPoolMaxProcesses -ParameterName 'Maximum Worker Processes'
Validate-Parameter -Parameter $appPoolStartMode -parameterName 'Start Mode'
Validate-Parameter -Parameter $appPoolCpuAction -parameterName 'CPU Limit Action'
Validate-Parameter -Parameter $appPoolCpuLimit -parameterName 'CPU Limit (percent)'

$iis = (New-Object Microsoft.Web.Administration.ServerManager)
$pool = $iis.ApplicationPools | Where-Object {$_.Name -eq $appPoolName} | Select-Object -First 1
if ($pool -eq $null) {
    Write-Output ('Creating Application Pool {0}' -f $appPoolName)
    Execute-Retry {
        $iis = (New-Object Microsoft.Web.Administration.ServerManager)
        $iis.ApplicationPools.Add($appPoolName)
        $iis.CommitChanges()
    }
}
else {
    Write-Output ('Application Pool {0} already exists, reconfiguring ...' -f $appPoolName)
}
$list = Get-ScheduledTimes -Schedule $appPoolPeriodicRecycleTime
Execute-Retry {
    $iis = (New-Object Microsoft.Web.Administration.ServerManager)
    $pool = $iis.ApplicationPools | Where-Object {$_.Name -eq $appPoolName} | Select-Object -First 1
    Write-Output ('Setting: AutoStart = {0}' -f $appPoolAutoStart)
    $pool.AutoStart = $appPoolAutoStart
    Write-Output ('Setting: Enable32BitAppOnWin64 = {0}' -f $appPoolEnable32BitAppOnWin64)
    $pool.Enable32BitAppOnWin64 = $appPoolEnable32BitAppOnWin64
    Write-Output ('Setting: IdentityType = {0}' -f $appPoolIdentityType)
    $pool.ProcessModel.IdentityType = $appPoolIdentityType
    if ($appPoolIdentityType -eq 3) {
        Write-Output ('Setting: UserName = {0}' -f $appPoolIdentityUser)
        $pool.ProcessModel.UserName = $appPoolIdentityUser
        if (!$appPoolIdentityPassword) {
            Write-Output ('Setting: Password = [empty]')
        }
        else {
            Write-Output ('Setting: Password = [Omitted For Security]')
        }
        $pool.ProcessModel.Password = $appPoolIdentityPassword
    }
	Write-Output ('Setting: LoadUserProfile = {0}' -f $appPoolLoadUserProfile)
    $pool.ProcessModel.LoadUserProfile = $appPoolLoadUserProfile
    Write-Output ('Setting: ManagedRuntimeVersion = {0}' -f $appPoolManagedRuntimeVersion)
    if ($appPoolManagedRuntimeVersion -eq 'No Managed Code') {
        $pool.ManagedRuntimeVersion = ''
    }
    else {
        $pool.ManagedRuntimeVersion = $appPoolManagedRuntimeVersion
    }
    Write-Output ('Setting: ManagedPipelineMode = {0}' -f $appPoolManagedPipelineMode)
    $pool.ManagedPipelineMode = $appPoolManagedPipelineMode
    Write-Output ('Setting: IdleTimeout = {0}' -f $appPoolIdleTimeout)
    $pool.ProcessModel.IdleTimeout = $appPoolIdleTimeout
    Write-Output ('Setting: MaxProcesses = {0}' -f $appPoolMaxProcesses)
    $pool.ProcessModel.MaxProcesses = $appPoolMaxProcesses
    Write-Output ('Setting: RegularTimeInterval = {0}' -f $appPoolRegularTimeInterval)
    $pool.Recycling.PeriodicRestart.Time  = $appPoolRegularTimeInterval
    Write-Output ('Setting: QueueLength = {0}' -f $appPoolQueueLength)
    $pool.QueueLength  = $appPoolQueueLength
    Write-Output ('Setting: CPU Limit (percent) = {0}' -f $appPoolCpuLimit)
    ## Limit is stored in 1/1000s of one percent
    $pool.Cpu.Limit = $appPoolCpuLimit * 1000
    Write-Output ('Setting: CPU Limit Action = {0}' -f $appPoolCpuAction)
    $pool.Cpu.Action = $appPoolCpuAction
    Write-Output ('Setting: Schedule = {0}' -f $appPoolPeriodicRecycleTime)
    $pool.Recycling.PeriodicRestart.Schedule.Clear()
    foreach($timestamp in $list) {
        $pool.Recycling.PeriodicRestart.Schedule.Add($timestamp)
    }
    if (Get-Member -InputObject $pool -Name StartMode -MemberType Properties)
    {
        Write-Output ('Setting: StartMode = {0}' -f $appPoolStartMode)
        $pool.StartMode = $appPoolStartMode
    }
    else
    {
        Write-Output ('IIS does not support StartMode property, skipping this property...')
    }
    $iis.CommitChanges()
}

Provided under the Apache License version 2.0.

Report an issue

To use this template in Octopus Deploy, copy the JSON below and paste it into the Library → Step templates → Import dialog.

{
  "Id": "70a293d6-ee6a-4755-8e06-5f13d7e51fff",
  "Name": "IIS AppPool - Create",
  "Description": "Creates or Reconfigures an IIS Application Pool",
  "Version": 14,
  "ExportedAt": "2018-09-18T04:42:42.009Z",
  "ActionType": "Octopus.Script",
  "Author": "droorda",
  "Parameters": [
    {
      "Id": "bd870787-9020-49e8-8add-ad9f5fb65125",
      "Name": "AppPoolName",
      "Label": "Application pool name",
      "HelpText": "The name of the application pool that the application will run under.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      },
      "Links": {}
    },
    {
      "Id": "7d8d63e7-5f6e-4a21-a58f-0f0787e1654f",
      "Name": "AppPoolIdentityType",
      "Label": "Identity Type",
      "HelpText": "The type of identity that the application pool will be using.",
      "DefaultValue": "3",
      "DisplaySettings": {
        "Octopus.ControlType": "Select",
        "Octopus.SelectOptions": "0|Local System\n1|Local Service\n2|Network Service\n3|Specific User...\n4|Application Pool Identity"
      },
      "Links": {}
    },
    {
      "Id": "4aabb8a8-df82-4462-be11-5f225466fa22",
      "Name": "AppPoolIdentityUser",
      "Label": "Specific User Name",
      "HelpText": "_(Specific User)_ The user name to use with the application pool identity.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      },
      "Links": {}
    },
    {
      "Id": "701c812c-902c-4e2f-a888-cbf5d2fbf83d",
      "Name": "AppPoolIdentityPassword",
      "Label": "Specific User Password",
      "HelpText": "_(Specific User)_ The password for the specific user to use with the application pool identity.",
      "DefaultValue": "",
      "DisplaySettings": {
        "Octopus.ControlType": "Sensitive"
      },
      "Links": {}
    },
    {
      "Id": "63663052-6e0d-4ba8-ba95-f4213ba8aed2",
      "Name": "AppPoolLoadUserProfile",
      "Label": "Load User Profile",
      "HelpText": "This setting specifies whether IIS loads the user profile for an application pool identity.",
      "DefaultValue": "True",
      "DisplaySettings": {
        "Octopus.ControlType": "Checkbox"
      },
      "Links": {}
    },
    {
      "Id": "c5c7d104-2d65-46da-a93f-bc3aea5ba1ab",
      "Name": "AppPoolEnable32BitAppOnWin64",
      "Label": "Enable 32-Bit Applications",
      "HelpText": "Allows the application pool to run 32-bit applications when running on 64-bit windows.",
      "DefaultValue": "True",
      "DisplaySettings": {
        "Octopus.ControlType": "Checkbox"
      },
      "Links": {}
    },
    {
      "Id": "0af4b8ba-587f-4e92-a344-44a3408bad96",
      "Name": "AppPoolAutoStart",
      "Label": "Start Automatically",
      "HelpText": "Automatically start the application pool when the application pool is created or whenever IIS is started.",
      "DefaultValue": "True",
      "DisplaySettings": {
        "Octopus.ControlType": "Checkbox"
      },
      "Links": {}
    },
    {
      "Id": "8eaf280a-7e17-4f03-90a1-29f66ca87b1a",
      "Name": "AppPoolManagedRuntimeVersion",
      "Label": "Managed Runtime Version",
      "HelpText": "Specifies the CLR version to be used by the application pool.",
      "DefaultValue": "v4.0",
      "DisplaySettings": {
        "Octopus.ControlType": "Select",
        "Octopus.SelectOptions": "v1.1|CLR v1.1 (.NET 1.0, 1.1)\nv2.0|CLR v2.0 (.NET 2.0, 3.0, 3.5)\nv4.0|CLR v4.0 (.NET 4.0, 4.5, 4.6)\nNo Managed Code|No Managed Code (ASP.NET Core)"
      },
      "Links": {}
    },
    {
      "Id": "bae7e84e-b17c-49bb-aba1-44d8f0326881",
      "Name": "AppPoolManagedPipelineMode",
      "Label": "Managed Pipeline Mode",
      "HelpText": "Specifies the request-processing mode that is used to process requests for managed content.",
      "DefaultValue": "0",
      "DisplaySettings": {
        "Octopus.ControlType": "Select",
        "Octopus.SelectOptions": "0|Integrated\n1|Classic"
      },
      "Links": {}
    },
    {
      "Id": "cf5acda5-5261-40b9-ae6c-4067b35b9857",
      "Name": "AppPoolIdleTimeoutMinutes",
      "Label": "Process Idle Timeout",
      "HelpText": "Amount of time (in minutes) a worker process will remain idle before it shuts down. A value of 0 means the process does not shut down after an idle timeout.",
      "DefaultValue": "20",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      },
      "Links": {}
    },
    {
      "Id": "67c8fc44-00c6-4f0e-9b54-48acfe5792f9",
      "Name": "AppPoolMaxProcesses",
      "Label": "Maximum Worker Processes",
      "HelpText": "Maximum number of worker processes permitted to service requests for the application pool.",
      "DefaultValue": "1",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      },
      "Links": {}
    },
    {
      "Id": "63bc9198-49b3-451d-b082-9faf38f759e2",
      "Name": "AppPoolRegularTimeInterval",
      "Label": "Regular Time Interval",
      "HelpText": "Period of time (in minutes) after which an application pool will recycle. A value of 0 means the application pool does not recycle on a regular interval.",
      "DefaultValue": "1740",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      },
      "Links": {}
    },
    {
      "Id": "3b5cadcd-3092-4eb7-aeb6-2b7896a22e10",
      "Name": "AppPoolPeriodicRecycleTime",
      "Label": "Application pool periodic recycle time",
      "HelpText": "A specific local time, in minutes after midnight, when the application pool is recycled. Separate multiple times by using a ,\\n\\nExample: \\\"00:30:00\\\" for half an hour past midnight. or \\\"06:00:00\\\" for midnight and 6 am.",
      "DefaultValue": "03:00:00",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      },
      "Links": {}
    },
    {
      "Id": "cf466a9a-40a1-4fe9-ab2d-f99eb92d1593",
      "Name": "AppPoolQueueLength",
      "Label": "Queue Length",
      "HelpText": "Maximum number of requests that HTTP.sys will queue for the application pool. When the queue is full, new requests receive a 504 \"Service Unavailable\" response.",
      "DefaultValue": "1000",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      },
      "Links": {}
    },
    {
      "Id": "cbf99ca9-7282-4bb2-99b8-82c1355c4bc0",
      "Name": "AppPoolStartMode",
      "Label": "Start Mode",
      "HelpText": "Specifies whether the application pool should run in On Demand Mode or Always Running Mode.",
      "DefaultValue": "OnDemand",
      "DisplaySettings": {
        "Octopus.ControlType": "Select",
        "Octopus.SelectOptions": "OnDemand|On Demand\nAlwaysRunning|Always Running"
      },
      "Links": {}
    },
    {
      "Id": "7ef971c4-6493-481f-9711-91cf902a2bca",
      "Name": "AppPoolCpuLimit",
      "Label": "CPU Limit (percent)",
      "HelpText": "Configures the maximum percentage of CPU time (in percent) that the worker processes in an application pool are allowed to consume over a period of time as indicated by the resetInterval attribute. If the limit set by the limit attribute is exceeded, an event is written to the event log and an optional set of events can be triggered. These optional events are determined by the action attribute.\n\nThe default value is 0, which disables CPU limiting.",
      "DefaultValue": "0",
      "DisplaySettings": {
        "Octopus.ControlType": "SingleLineText"
      },
      "Links": {}
    },
    {
      "Id": "b5b33393-cd44-4af4-b1e2-0a090f42576e",
      "Name": "AppPoolCpuLimitAction",
      "Label": "CPU Limit Action",
      "HelpText": "Configures the action that IIS takes when a worker process exceeds its configured CPU limit. The action attribute is configured on a per-application pool basis.\n\nThe action attribute can be one of the following possible values. The default value is NoAction.",
      "DefaultValue": "0",
      "DisplaySettings": {
        "Octopus.ControlType": "Select",
        "Octopus.SelectOptions": "0|NoAction\n1|KillW3wp\n2|Throttle\n3|ThrottleUnderLoad"
      },
      "Links": {}
    }
  ],
  "Properties": {
    "Octopus.Action.Script.ScriptBody": "function Validate-Parameter {\n    Param(\n        [Parameter(Position=0)][string]$Parameter,\n        [Parameter(Mandatory=$true, Position=1)][string]$ParameterName\n    )\n    if (!$ParameterName -contains 'Password') {\n        Write-Host ('{0}: {1}' -f ${ParameterName},$Parameter)\n    }\n    if (!$Parameter) {\n        Write-Error ('No value was set for {0}, and it cannot be empty' -f $ParameterName)\n    }\n}\n\nfunction Execute-Retry {\n    Param(\n        [Parameter(Mandatory=$true, Position=0)][ScriptBlock]$Command\n    )\n\t$attemptCount = 0\n\t$operationIncomplete = $true\n    $maxFailures = 5\n    $sleepBetweenFailures = Get-Random -minimum 1 -maximum 4\n\twhile ($operationIncomplete -and $attemptCount -lt $maxFailures) {\n\t\t$attemptCount = ($attemptCount + 1)\n\t\tif ($attemptCount -ge 2) {\n\t\t\tWrite-Output ('Waiting for {0} seconds before retrying ...' -f $sleepBetweenFailures)\n\t\t\tStart-Sleep -s $sleepBetweenFailures\n\t\t\tWrite-Output 'Retrying ...'\n\t\t}\n\t\ttry {\n\t\t\t& $Command\n\t\t\t$operationIncomplete = $false\n\t\t} catch [System.Exception] {\n\t\t\tif ($attemptCount -lt ($maxFailures)) {\n\t\t\t\tWrite-Output ('Attempt {0} of {1} failed: {2}' -f $attemptCount,$maxFailures,$_.Exception.Message)\n\t\t\t}\n\t\t\telse {\n                Write-Host 'Failed to execute command'\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction Get-ScheduledTimes {\n    Param(\n        [Parameter(Position=0)][string]$Schedule\n    )\n    if (!$Schedule) {\n        return @()\n    }\n    $minutes = $Schedule.Split(',')\n    $minuteArrayList = New-Object System.Collections.ArrayList(,$minutes)\n    return $minuteArrayList\n}\n\n[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.Web.Administration')\nAdd-PSSnapin WebAdministration -ErrorAction SilentlyContinue\nImport-Module WebAdministration -ErrorAction SilentlyContinue\n\n$appPoolName = $OctopusParameters['AppPoolName']\n$appPoolIdentityType = $OctopusParameters['AppPoolIdentityType']\nif ($appPoolIdentityType -eq 3) {\n    $appPoolIdentityUser = $OctopusParameters['AppPoolIdentityUser']\n    $appPoolIdentityPassword = $OctopusParameters['AppPoolIdentityPassword']\n}\n$appPoolLoadUserProfile = [boolean]::Parse($OctopusParameters['AppPoolLoadUserProfile'])\n$appPoolAutoStart = [boolean]::Parse($OctopusParameters['AppPoolAutoStart'])\n$appPoolEnable32BitAppOnWin64 = [boolean]::Parse($OctopusParameters['AppPoolEnable32BitAppOnWin64'])\n$appPoolManagedRuntimeVersion = $OctopusParameters['AppPoolManagedRuntimeVersion']\n$appPoolManagedPipelineMode = $OctopusParameters['AppPoolManagedPipelineMode']\n$appPoolIdleTimeout = [TimeSpan]::FromMinutes($OctopusParameters['AppPoolIdleTimeoutMinutes'])\n$appPoolPeriodicRecycleTime = $OctopusParameters['AppPoolPeriodicRecycleTime']\n$appPoolMaxProcesses = [int]$OctopusParameters['AppPoolMaxProcesses']\n$appPoolRegularTimeInterval = [TimeSpan]::FromMinutes($OctopusParameters['AppPoolRegularTimeInterval'])\n$appPoolQueueLength = [int]$OctopusParameters['AppPoolQueueLength']\n$appPoolStartMode = $OctopusParameters['AppPoolStartMode']\n$appPoolCpuAction = $OctopusParameters['AppPoolCpuLimitAction']\n$appPoolCpuLimit = [int]$OctopusParameters['AppPoolCpuLimit']\n\nValidate-Parameter -Parameter $appPoolName -ParameterName 'Application Pool Name'\nValidate-Parameter -Parameter $appPoolIdentityType -ParameterName 'Identity Type'\nif ($appPoolIdentityType -eq 3) {\n    Validate-Parameter -Parameter $appPoolIdentityUser -ParameterName 'Identity UserName'\n    # If using Group Managed Serice Accounts, the password should be allowed to be empty\n}\nValidate-Parameter -Parameter $appPoolLoadUserProfile -parameterName 'Load User Profile'\nValidate-Parameter -Parameter $appPoolAutoStart -ParameterName 'AutoStart'\nValidate-Parameter -Parameter $appPoolEnable32BitAppOnWin64 -ParameterName 'Enable 32-Bit Apps on 64-bit Windows'\nValidate-Parameter -Parameter $appPoolManagedRuntimeVersion -ParameterName 'Managed Runtime Version'\nValidate-Parameter -Parameter $appPoolManagedPipelineMode -ParameterName 'Managed Pipeline Mode'\nValidate-Parameter -Parameter $appPoolIdleTimeout -ParameterName 'Process Idle Timeout'\nValidate-Parameter -Parameter $appPoolMaxProcesses -ParameterName 'Maximum Worker Processes'\nValidate-Parameter -Parameter $appPoolStartMode -parameterName 'Start Mode'\nValidate-Parameter -Parameter $appPoolCpuAction -parameterName 'CPU Limit Action'\nValidate-Parameter -Parameter $appPoolCpuLimit -parameterName 'CPU Limit (percent)'\n\n$iis = (New-Object Microsoft.Web.Administration.ServerManager)\n$pool = $iis.ApplicationPools | Where-Object {$_.Name -eq $appPoolName} | Select-Object -First 1\nif ($pool -eq $null) {\n    Write-Output ('Creating Application Pool {0}' -f $appPoolName)\n    Execute-Retry {\n        $iis = (New-Object Microsoft.Web.Administration.ServerManager)\n        $iis.ApplicationPools.Add($appPoolName)\n        $iis.CommitChanges()\n    }\n}\nelse {\n    Write-Output ('Application Pool {0} already exists, reconfiguring ...' -f $appPoolName)\n}\n$list = Get-ScheduledTimes -Schedule $appPoolPeriodicRecycleTime\nExecute-Retry {\n    $iis = (New-Object Microsoft.Web.Administration.ServerManager)\n    $pool = $iis.ApplicationPools | Where-Object {$_.Name -eq $appPoolName} | Select-Object -First 1\n    Write-Output ('Setting: AutoStart = {0}' -f $appPoolAutoStart)\n    $pool.AutoStart = $appPoolAutoStart\n    Write-Output ('Setting: Enable32BitAppOnWin64 = {0}' -f $appPoolEnable32BitAppOnWin64)\n    $pool.Enable32BitAppOnWin64 = $appPoolEnable32BitAppOnWin64\n    Write-Output ('Setting: IdentityType = {0}' -f $appPoolIdentityType)\n    $pool.ProcessModel.IdentityType = $appPoolIdentityType\n    if ($appPoolIdentityType -eq 3) {\n        Write-Output ('Setting: UserName = {0}' -f $appPoolIdentityUser)\n        $pool.ProcessModel.UserName = $appPoolIdentityUser\n        if (!$appPoolIdentityPassword) {\n            Write-Output ('Setting: Password = [empty]')\n        }\n        else {\n            Write-Output ('Setting: Password = [Omitted For Security]')\n        }\n        $pool.ProcessModel.Password = $appPoolIdentityPassword\n    }\n\tWrite-Output ('Setting: LoadUserProfile = {0}' -f $appPoolLoadUserProfile)\n    $pool.ProcessModel.LoadUserProfile = $appPoolLoadUserProfile\n    Write-Output ('Setting: ManagedRuntimeVersion = {0}' -f $appPoolManagedRuntimeVersion)\n    if ($appPoolManagedRuntimeVersion -eq 'No Managed Code') {\n        $pool.ManagedRuntimeVersion = ''\n    }\n    else {\n        $pool.ManagedRuntimeVersion = $appPoolManagedRuntimeVersion\n    }\n    Write-Output ('Setting: ManagedPipelineMode = {0}' -f $appPoolManagedPipelineMode)\n    $pool.ManagedPipelineMode = $appPoolManagedPipelineMode\n    Write-Output ('Setting: IdleTimeout = {0}' -f $appPoolIdleTimeout)\n    $pool.ProcessModel.IdleTimeout = $appPoolIdleTimeout\n    Write-Output ('Setting: MaxProcesses = {0}' -f $appPoolMaxProcesses)\n    $pool.ProcessModel.MaxProcesses = $appPoolMaxProcesses\n    Write-Output ('Setting: RegularTimeInterval = {0}' -f $appPoolRegularTimeInterval)\n    $pool.Recycling.PeriodicRestart.Time  = $appPoolRegularTimeInterval\n    Write-Output ('Setting: QueueLength = {0}' -f $appPoolQueueLength)\n    $pool.QueueLength  = $appPoolQueueLength\n    Write-Output ('Setting: CPU Limit (percent) = {0}' -f $appPoolCpuLimit)\n    ## Limit is stored in 1/1000s of one percent\n    $pool.Cpu.Limit = $appPoolCpuLimit * 1000\n    Write-Output ('Setting: CPU Limit Action = {0}' -f $appPoolCpuAction)\n    $pool.Cpu.Action = $appPoolCpuAction\n    Write-Output ('Setting: Schedule = {0}' -f $appPoolPeriodicRecycleTime)\n    $pool.Recycling.PeriodicRestart.Schedule.Clear()\n    foreach($timestamp in $list) {\n        $pool.Recycling.PeriodicRestart.Schedule.Add($timestamp)\n    }\n    if (Get-Member -InputObject $pool -Name StartMode -MemberType Properties)\n    {\n        Write-Output ('Setting: StartMode = {0}' -f $appPoolStartMode)\n        $pool.StartMode = $appPoolStartMode\n    }\n    else\n    {\n        Write-Output ('IIS does not support StartMode property, skipping this property...')\n    }\n    $iis.CommitChanges()\n}",
    "Octopus.Action.Script.Syntax": "PowerShell",
    "Octopus.Action.Script.ScriptSource": "Inline",
    "Octopus.Action.Script.ScriptFileName": null,
    "Octopus.Action.Package.NuGetFeedId": null,
    "Octopus.Action.Package.NuGetPackageId": null
  },
  "Category": "IIS",
  "HistoryUrl": "https://github.com/OctopusDeploy/Library/commits/master/step-templates//opt/buildagent/work/75443764cd38076d/step-templates/iis-apppool-create.json",
  "Website": "/step-templates/70a293d6-ee6a-4755-8e06-5f13d7e51fff",
  "Logo": "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",
  "$Meta": {
    "Type": "ActionTemplate"
  }
}

History

Page updated on Tuesday, September 18, 2018