Пытаюсь автоматизировать создание фермы серверов в PowerShell. Благодаря ручному созданию у меня есть следующий XML:
<webFarms>
<webFarm name="alwaysup" enabled="true">
<server address="alwaysup-blue" enabled="true">
<applicationRequestRouting httpPort="8001" />
</server>
<server address="alwaysup-green" enabled="true">
<applicationRequestRouting httpPort="8002" />
</server>
<applicationRequestRouting>
<healthCheck url="http://alwaysup/up.html" interval="00:00:05" responseMatch="up" />
</applicationRequestRouting>
</webFarm>
<applicationRequestRouting>
<hostAffinityProviderList>
<add name="Microsoft.Web.Arr.HostNameRoundRobin" />
</hostAffinityProviderList>
</applicationRequestRouting>
</webFarms>
Однако попытка сделать это через PS оказалась проблематичной: насколько я могу судить, нет специального API, чтобы сделать это через (WebFarmSnapin предназначен для более старой версии).
Я переключил свое внимание на Командлеты администрирования IIS но получил только половину работы.
Код, который у меня есть:
#####
# Overwriting the server farm
#####
Write-Host "Overwriting the server farm $($webFarmName)"
$webFarm = @{};
$webFarm["name"] = 'siteFarm'
Set-WebConfiguration "/webFarms" -Value $webFarm
#####
# Adding the servers
#####
Write-Host "Adding the servers"
$blueServer = @{}
$blueServer["address"] = 'site-blue'
$blueServer["applicationRequestRouting"] = @{}
$greenServer = @{}
$greenServer["address"] = 'site-green'
$greenServer["applicationRequestRouting"] = @{}
$servers = @($blueServer, $greenServer)
Add-WebConfiguration -Filter "/webFarms/webFarm[@name='siteFarm']" -Value $servers
#####
# Adding routing
#####
Write-Host "Adding the routing configurations"
$blueServerRouting = @{}
$blueServerRouting["httpPort"] = "8001"
Add-WebConfiguration -Filter "/webFarms/webFarm[@name='siteFarm']/server[@address='site-blue']" -Value $blueServerRouting
Это порождает
<webFarms>
<webFarm name="siteFarm">
<server address="site-blue" />
<server address="site-green" />
</webFarm>
<applicationRequestRouting>
<hostAffinityProviderList>
<add name="Microsoft.Web.Arr.HostNameRoundRobin" />
</hostAffinityProviderList>
</applicationRequestRouting>
</webFarms>
Как видите, отсутствует порт, связанный с маршрутизацией. И я даже не начал с попытки добавить проверку работоспособности на этом этапе.
Что я делаю не так? Есть ли какой-нибудь командлет, который я не нашел, который упрощает эту задачу?
Связанный но без особого полезного ответа (вкладка PowerShell со сгенерированным кодом остается пустой).
Скрестил это здесь из ТАК после осознания того, что SF существует и может быть более подходящим.
Лучший способ, который я видел для этого, - это смешивание powershell с командой appcmd.exe. Microsoft выпустила образец кода для настройки фермы в контейнере докера. Вот.
Вот пример:
ForEach($farm in $farms)
{
# Create the farm
.\appcmd.exe set config -section:webFarms /+"[name='$($farm.name)']" /commit:apphost
ForEach($server in $farm.Servers)
{
# Add server to farm
.\appcmd.exe set config -section:webFarms /+"[name='$($farm.name)'].[address='$($server.address)']" /commit:apphost
}
# URL Rewrite
.\appcmd.exe set config -section:system.webServer/rewrite/globalRules /+"[name='ARR_$($farm.name)_lb', patternSyntax='Wildcard',stopProcessing='True']" /commit:apphost
.\appcmd.exe set config -section:system.webServer/rewrite/globalRules /"[name='ARR_$($farm.name)_lb',patternSyntax='Wildcard',stopProcessing='True']".match.url:"*" /commit:apphost
.\appcmd.exe set config -section:system.webServer/rewrite/globalRules /"[name='ARR_$($farm.name)_lb',patternSyntax='Wildcard',stopProcessing='True']".action.type:"Rewrite" /"[name='ARR_$($farm.name)_lb',patternSyntax='Wildcard',stopProcessing='True']".action.url:"http://$($farm.name)/{R:0}" /commit:apphost
}