Сценарий для перезагрузки нескольких компьютеров Mac по сети в AppleScript или PowerShell?

Я пытаюсь написать сценарий для перезагрузки Mac в диапазоне IP-адресов. Выполнение этого через PowerShell работает, но процесс ждет, пока каждая машина перезагрузится, прежде чем перейти к следующей машине. Я нахожу ssh для каждой машины и перезагружаю ее с помощью sudo shutdown -S shutdown -r now быстрее... это просто вручную. Вот что у меня есть в PowerShell:

$serverRoot = "xxx.xxx.xxx."
$startVal = 100
$stopVal = 150

for ($i=$startVal; $i -le $stopVal; $i++)
{
    $User="username"
    $Password="password"

    $SecurePass=ConvertTo-SecureString -string $Password -AsPlainText -Force

    $Credential = New-Object System.Management.Automation.PSCredential $User, $SecurePass

    $session = New-SSHSession -ComputerName ($serverRoot + $i) -Credential $Credential  -AcceptKey
    Invoke-SSHCommand -SSHSession $session -Command "echo $Password | sudo -S shutdown -r now"   
    Remove-SSHSession -SSHSession $session -Verbose

}

Могу ли я добавить что-то, что просто запустит процесс перезагрузки на всех машинах одновременно? Должен ли я использовать AppleScript?


person junton    schedule 23.04.2015    source источник


Ответы (3)


На самом деле параметр -ComputerName для New-SSHSession может принимать набор серверов и по умолчанию будет вызывать команду параллельно для всех серверов,

$serverRoot = "xxx.xxx.xxx."
$startVal = 100
$stopVal = 150

# First start with creating a collection
$servers = @()
for ($i = $startVal; $i -le $stopVal; $i++)
{
    $servers += ($serverRoot + $i)
}

# Then, pass the $servers variable directly when creating the session
$session = New-SSHSession -ComputerName $servers -Credential $credential -AcceptKey

И вуаля!

person rae1    schedule 23.04.2015

Если вы оберните его в рабочий процесс, вы можете пнуть его как параллельный:

workflow Kill-All {
  param([string[]]$computers)

  foreach -parallel ($computer in $computers) {
      InlineScript {
         # Your powershell stuff.
      }
  }
}

Kill-All -Computers "132.134.123.1", "123.4.53.12"

Кроме того, вы можете поместить свои данные в bat-файл и использовать powershell для вызова bat-файла. Таким образом, вы можете вызывать файлы bat, не дожидаясь завершения одного из них, прежде чем переходить к следующему.

Лучший способ, как ответил rae1, — просто вызвать New-SSHSession напрямую, так как он поддерживает распараллеливание по умолчанию.

Вот один лайнер:

$sessions  = New-SSHSession -ComputerName (1..254 | %{ "xxx.xxx.xxx.$_"})

Дополнительные сведения: http://blogs.technet.com/b/heyscriptingguy/archive/2012/11/20/use-powershell-workflow-to-ping-computers-in-parallel.aspx

http://community.spiceworks.com/topic/341776-call-a-ps-script-from-another-and-don-t-wait-for-it-to-finish

person Erti-Chris Eelmaa    schedule 23.04.2015
comment
Имейте в виду, что синтаксис рабочего процесса слегка отличается от обычного синтаксиса PowerShell, поэтому вы можете использовать задания вместо рабочего процесса, если вы все хочу - это параллелизм. - person Ansgar Wiechers; 23.04.2015
comment
@АнсгарВичерс; согласованный. если честно, я вообще не нахожу рабочие процессы полезными, возможно, я что-то здесь упускаю.. единственное, что я теоретически могу представить полезным в рабочих процессах, — это возможность довольно просто упорядочивать вещи для параллельного выполнения, сохраняя при этом последовательность для некоторых вещи. - person Erti-Chris Eelmaa; 25.04.2015

Вы можете использовать plink.exe в следующих строках (не проверено):

plink [email protected] secret "shutdown -S shutdown -r now" &
plink [email protected] secret "shutdown -S shutdown -r now" &
plink [email protected] secret "shutdown -S shutdown -r now" &
plink [email protected] secret "shutdown -S shutdown -r now" &

Или вот так

for %%a in (...) do plink root@%%a -pw secret "shutdown -S shutdown -r now" &
person Mark Setchell    schedule 23.04.2015