Изредка я занимаюсь обслуживанием почтовый серверов MS Exchange. Поставить обновления и кумулятивные пакеты – в принципе несложно.
В очередной раз выполняя процедуру по выводу сервера в режим обслуживания, я подумал – почему бы не написать скрипт, содержащий шесть PowerShell-командлетов вида
1 |
Set-MailboxServer <Servername> -DatabaseCopyAutoActivationPolicy Blocked |
в которые еще и нужно добавить имя сервера, выводимого в режим обслуживания.
В общем, я написал скрипт, который при запуске с сервера MS Exchange спрашивает “выберите какую операцию вы хотите выполнить”: ввод в режим обслуживания или выход из него.
В зависимости от выбранной опции и роли сервера скрипт выполняет требуемые PS-командлеты.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
$servername=$env:computername $dagname=(Get-DatabaseAvailabilityGroup | where {$_.servers -contains $servername}).name $partner_fqdn=[System.Net.Dns]::GetHostByName(((Get-DatabaseAvailabilityGroup $dagname).servers | where {!($_.name -eq $servername)} | select -First 1).name).Hostname $answer="" while (!(($answer -eq "1") -or($answer -eq "2"))){ Write-Host("Please choose the operation") Write-Host("1: Enter the maintenance mode") Write-Host("2: Exit the maintenance mode") $answer=read-host "Please enter the ID of operation" } if($answer -eq "1"){ if((get-exchangeserver $servername).serverrole -match "Mailbox"){ Set-ServerComponentState $servername -Component HubTransport -State Draining -Requester Maintenance Redirect-Message -Server $servername -Target $partner_fqdn -Confirm:$false Suspend-ClusterNode $servername Set-MailboxServer $servername -DatabaseCopyActivationDisabledAndMoveNow $True Set-MailboxServer $servername -DatabaseCopyAutoActivationPolicy Blocked } Set-ServerComponentState $servername -Component ServerWideOffline -State inactive -Requester Maintenance } else{ Set-ServerComponentState $servername -Component ServerWideOffline -State Active -Requester Maintenance if((get-exchangeserver $servername).serverrole -match "Mailbox"){ Resume-ClusterNode $servername Set-MailboxServer $servername -DatabaseCopyActivationDisabledAndMoveNow $False Set-MailboxServer $servername -DatabaseCopyAutoActivationPolicy Unrestricted Set-ServerComponentState $servername -Component HubTransport -State Active -Requester Maintenance } } |
Критика приветствуется.
У меня в хозяйстве нет DAG, но разве родные скрипты StartDagServerMaintenance.ps1 и StopDagServerMaintenance.ps1 для этого не годятся?
https://docs.microsoft.com/en-us/exchange/high-availability/manage-ha/manage-dags?view=exchserver-2019#performing-maintenance-on-dag-members
Нет, не годятся, так как они выполняют лишь эту часть функционала:
Suspend-ClusterNode $servername
Set-MailboxServer $servername -DatabaseCopyActivationDisabledAndMoveNow $True
Set-MailboxServer $servername -DatabaseCopyAutoActivationPolicy Blocked
Если вы посмотрите по ссылке в статье, то там как раз и приведены остальные командлеты либо ДО, либо ПОСЛЕ запуска этого скрипта.
P.S. Кстати, там еще перезапускается служба транспорта
Restart-Service MSExchangeTransport
Уточню у коллег, почему мы так не делаем…
Для 2016 актуально?
Здравствуйте, Роман.
Я не проверял.
Принципиальная разница в том, что в 2016 нет отдельной роли Client Access. Как следствие, условие
if((get-exchangeserver $servername).serverrole -match “Mailbox”)
не нужно, весь набор командлетов должен отрабатывать на каждом узле DAG.