SMA - переименовываем Standalone VM
Вы, наверно, замечали, что при разворачивании Standalone VM ей присваиваться случайное имя, чтож используем runbook, чтобы это исправить.
Что потребуется:
-
SPF и SMA доверяющие друг-другу (сертификаты endpoint’ов);
-
Пользователь spf-app-pool в группе smaAdmingroup (на веб сервис ролях SMA);
4. Готовый ассет для подключения к SPF
(https://spf_endpoint:8090/SC2012R2/VMM/Microsoft.Management.Odata.svc/), пользователь с правами на переименование компьютера в AD и пользователь с правами на доступ к SPF.
workflow RenameVM
{
param
(
[Parameter(Mandatory=$true)]
[string] $vmmJobId,
[Parameter(Mandatory=$true)]
[object] $params,
[Parameter(Mandatory=$true)]
[object] $resourceObject
)
#Объявляем переменные для подключения
$spfUrl = Get-AutomationVariable -Name "spfUrl"
$spfCredentials = Get-AutomationPSCredential -Name "spfCredentials"
$ADCred = Get-AutomationPSCredential -Name "ADCred"
$stampId = $params.StampId
$fullUrl = $spfUrl + "Jobs?`$filter=ID eq guid'" + $vmmJobId + "' and StampId eq guid'" + $stampId + "'"
#Получаем имя компьютера и обрабатываем его
$VMName = $resourceObject.Name
$initComputerName = $resourceObject.ComputerName
$compNameSplit = $initComputerName.split('.')
$ComputerName = $compNameSplit[0]
#Логирование
Write-Output " "
Write-Output "SPF URL: $fullUrl"
Write-Output " "
Write-Output "Computer Name Initially Set To: $ComputerName"
Write-Output "Computer Name Will Be Reset To: $VMName"
Write-Output " "
do {
Start-Sleep -s 30
$Output = InlineScript {
# Создаем ответ для SPF
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}
$request = [System.Net.HttpWebRequest]::Create($Using:fullUrl)
$request.Credentials = $Using:spfCredentials
$request.Accept = "application/json"
$request.Headers.Add("Accept-Charset", "UTF-8")
$request.ContentType = "application/json"
$request.Method = "GET"
$response = $request.GetResponse()
$requestStream = $response.GetResponseStream()
$readStream = new-object System.IO.StreamReader $requestStream
$outputJson = $readStream.ReadToEnd()
$output = ConvertFrom-Json $outputJson
$readStream.Close()
$response.Close()
$output
}
Write-Output "Current Progress: $($output.value.Progress)"
}
while (!$output.value.IsCompleted)
Write-Output "Final Status: $($output.value.Status)"
#Переименовываем
If (!$ComputerName -or !$VMName ) {
Write-Output "Computer Name Not Defined, No Change Will Occur."
}
else {
Inlinescript {
$i = 1
$newComputerName = $Using:VMName
Do {
$checkComp = Get-ADComputer -LDAPFilter "(Name=$newComputerName)"
if (!$checkComp) {
Rename-Computer -ComputerName $Using:ComputerName -NewName $newComputerName -DomainCredential $Using:ADCred -Restart
}
else {
$newComputerName = $newComputerName + $i
$i ++
}
}
until ((!$checkComp))
}
}
}
Строки:
6-13 = инициализация данных;
19 = полечение пользовательских данных для подключения к AD;
24-27 = переделываем значение ComputerName.Domain в ComputerName
30-35 = логирование
37-64 = этот кусок взят из Sample-Using-VMCloud-Automation, этот код используется для запрашивания статуса задания в VMM и позволяет определить когда оно закончилось и приступить к следующему заданию;
67-68 = проверка;
72-89 = переименовываем VM, перед переименовыванием проверяем есть ли такая машина в AD. Если есть то добавляем единичку и проверяем снова, и снова и снова.
Так как мы используем триггер VMM Virtual Machine, роли виртуальных машин не будут затронуты этим runbook’ом.