banderasantonio
Enthusiast
Enthusiast

Помогите пожалуйста дописать скрипт для Power-CLI

Не силен в скриптах для Power-CLI

Есть скрипт:

get-vm | Where-Object {$_.PowerState -eq "PoweredOn"} | get-cddrive | Set-CDDrive -Connected $false -Confirm:$false

Выключает все приводы на включенных виртуалках.

Нужно модифицировать его чтобы выключал только включенные приводы, а не все подряд.

Понимаю что нужно дописать условие Where-Object, но что именно написать?

Подскажите пожалуйста, заранее благодарен.

Tags (2)
0 Kudos
13 Replies
VTsukanov
Virtuoso
Virtuoso

get-vm | where { $_.PowerState -eq "PoweredOn" } | where { $_ | get-cddrive | where { $_.ConnectionState.Connected -eq "true" } } | Set-CDDrive -Connected $false -Confirm:$false

Про ClientDevice не уверен

0 Kudos
banderasantonio
Enthusiast
Enthusiast

Ошибка при выполнениии скрипта происходит.

error2.JPG

0 Kudos
VTsukanov
Virtuoso
Virtuoso

get-vm | where { $_.PowerState -eq "PoweredOn" } | where { $_ | get-cddrive | where { $_.ConnectionState.Connected -eq "true" } } | Get-CDDrive | Set-CDDrive -Connected $false -Confirm:$false

или

get-vm | where { $_.PowerState -eq "PoweredOn" } | where { $_ | get-cddrive | where { $_.ConnectionState.Connected -eq "true" } } | Get-CDDrive | Set-CDDrive -NoMedia -Connected $false -Confirm:$false

Топик отмаркируйте как Answered,  "correct" or "helpful" как считаете нужным. Если б исправили описку в скрипте сами, могло б возникнуть понимание Smiley Happy

0 Kudos
banderasantonio
Enthusiast
Enthusiast

Вариант:

get-vm | where { $_.PowerState -eq "PoweredOn" } | where { $_ | get-cddrive | where { $_.ConnectionState.Connected -eq "true" } } | Get-CDDrive | Set-CDDrive -Connected $false -Confirm:$false

Подошел идеально.

Большое спасибо!

P.S. Второй вариант отключал привод полностью, заменяя его на клиентский устройство.

Есть еще сопутствующий вопрос, как запускать этот скрипт автоматически после автозапуска всех виртуалок?

0 Kudos
VTsukanov
Virtuoso
Virtuoso

> Второй вариант отключал привод полностью

Smiley Happy Вы не поверите - я знаю

> как запускать этот скрипт автоматически после автозапуска всех виртуалок?

Предполагая что стартуют только вм из автозапуска и везде стоят адекватные тулзы и vCenter уже откликается:

$vms = Get-VM | Get-VMStartPolicy | where {$_.StartAction -eq "PowerOn"}

$vms | Foreach {

     do {
          $VM = Get-VM $_
          $Toolsstatus = $VM.ExtensionData.Guest.ToolsRunningStatus
          Sleep 5
     } until ($Toolsstatus -eq "guestToolsRunning")
}
.... тут все уже работает ....
0 Kudos
banderasantonio
Enthusiast
Enthusiast

Не совсем понятно куда этот скрипт прикрутить. Хотелось чтоб запуск скрипта отключения приводов запускался сам по окончанию автостарта.

Причем в данный момент я запускаю этот скрипт сам на виртуалке с Win server 2008r2 где и стоит vCenter и PowerCLI.

0 Kudos
VTsukanov
Virtuoso
Virtuoso

# Тут должен код который определяет что хосты живые и процесс автостарта уже начался, не зная вашей инфраструктуры написать его нельзя
$vms = Get-VM | Get-VMStartPolicy | where {$_.StartAction -eq "PowerOn"}
$vms | Foreach {
     do {
          $VM = Get-VM $_
          $Toolsstatus = $VM.ExtensionData.Guest.ToolsRunningStatus
          Sleep 5
     } until ($Toolsstatus -eq "guestToolsRunning")
}
# Часть ниже отработает после того как все машины из автостарта запустятся
get-vm | where { $_.PowerState -eq "PoweredOn" } | where { $_ | get-cddrive | where { $_.ConnectionState.Connected -eq "true" } } | Get-CDDrive | Set-CDDrive -Connected $false -Confirm:$false
0 Kudos
banderasantonio
Enthusiast
Enthusiast

Инфраструктура проста до безобразия:

1 хост EXSi 5, на нем крутятся виртуалки. Одна из них Windows server 2008r2 на ней и происходит процесс управления (стоит vCenter Server + PowerCli).

0 Kudos
VTsukanov
Virtuoso
Virtuoso

Ok

Тогда через локал полиси на VM с vCenter прикручиваете startup script:

### Ждем пока vCenter стартует (значение поправите под себя)

sleep(30)

### Пытаемся подключаться к vCenter service

do {

     $vcenter = "NotConnected"

     Connect-VIServer –Server [Ваш IP vCenter] –Protocol https –User [Ваш некий пользователь] –Password [Ваш некий пароль] -ErrorVariable myErrors -ErrorAction Continue

     if ($myErrors.Count -gt 0) {

          ## vCenter еще не готов Smiley Sad

          sleep(10)

     } else {

          $vcenter = "Connected"

     }

} until ($vcenter -eq "NotConnected") 

### Переходим к анализу автостартующих vm

$vms = Get-VM | Get-VMStartPolicy | where {$_.StartAction -eq "PowerOn"}
$vms | Foreach {
     do {
          $VM = Get-VM $_
          $Toolsstatus = $VM.ExtensionData.Guest.ToolsRunningStatus
          Sleep 5
     } until ($Toolsstatus -eq "guestToolsRunning")
}
# Отключаем CDROMы
get-vm | where { $_.PowerState -eq "PoweredOn" } | where { $_ | get-cddrive | where { $_.ConnectionState.Connected -eq "true" } } | Get-CDDrive | Set-CDDrive -Connected $false -Confirm:$false

Отладку и причесывание придется делать вам самим Smiley Happy

0 Kudos
banderasantonio
Enthusiast
Enthusiast

Попробовал запустить ваш скрипт, процесс коннекта ведет себя странно.

После обмена сертификатами, зацикливается на логине и пароле.

На экране бесконечно и многократно выдает

IP сервера   Порт   ИмяПользователя

IP сервера   Порт   ИмяПользователя

IP сервера   Порт   ИмяПользователя

Вот как то так. Приходится прерывать процес

0 Kudos
VTsukanov
Virtuoso
Virtuoso

Значит сделайте первый sleep достаточным для старта vcenter и уберите цикл попыток подсоединения к vCenter

Как то так

### Ждем пока vCenter стартует (значение поправите под себя)
sleep(90)
Connect-VIServer –Server [Ваш IP vCenter] –Protocol https –User [Ваш некий пользователь] –Password [Ваш некий пароль] -ErrorVariable myErrors -ErrorAction Continue
### Переходим к анализу автостартующих vm
$vms = Get-VM | Get-VMStartPolicy | where {$_.StartAction -eq "PowerOn"}
$vms | Foreach {
     do {
          $VM = Get-VM $_
          $Toolsstatus = $VM.ExtensionData.Guest.ToolsRunningStatus
          Sleep 5
     } until ($Toolsstatus -eq "guestToolsRunning")
}
# Отключаем CDROMы
get-vm | where { $_.PowerState -eq "PoweredOn" } | where { $_ | get-cddrive | where { $_.ConnectionState.Connected -eq "true" } } | Get-CDDrive | Set-CDDrive -Connected $false -Confirm:$false
0 Kudos
banderasantonio
Enthusiast
Enthusiast

Чтоб посмотреть что происходит дальше, я упростил строку соединения до:

Connect-VIServer -Server 192.168.1.200

Соединиение прошло нормально, но скрипт начал ругаться что:

Get-Vm    Vm with name 'StartAction:PowerOn' was not found

и тоже в бесконечном цикле.

0 Kudos
VTsukanov
Virtuoso
Virtuoso

### Ждем пока vCenter стартует (значение поправите под себя)
sleep(90)
 
Connect-VIServer –Server [Ваш IP vCenter] –Protocol https –User [Ваш некий пользователь] –Password [Ваш некий пароль]
 
### Переходим к анализу автостартующих vm
$vms = Get-VM | Get-VMStartPolicy | where {$_.StartAction -eq "PowerOn"}
$vms | Foreach {
     do {
          $VM = $_.VM
          $Toolsstatus = $VM.ExtensionData.Guest.ToolsRunningStatus
          Sleep 5
     } until ($Toolsstatus -eq "guestToolsRunning")
}
# Отключаем CDROMы
get-vm | where { $_.PowerState -eq "PoweredOn" } | where { $_ | get-cddrive | where { $_.ConnectionState.Connected -eq "true" } } | Get-CDDrive | Set-CDDrive -Connected $false -Confirm:$false

Тогда так

0 Kudos