none
Действия в цикле для коллекции RRS feed

  • Вопрос

  • Стоит задача включить 500 машин в VMware, делать думаю скриптом:

    $vms = get-vm
    foreach($vm in $vms){
    Start-VM $vm | Wait-Tools -TimeoutSeconds 60
    }

    Все работает в таком случае как надо, но для каждой машины по очереди

    Есть желание делать несколько по другому, но вот не знаю как это реализовать.

    $vms = get-vm
    foreach($vm in $vms){

    Здесь набиваем коллекцию в количестве 8 штук и передаем на вход | Start-VM | Wait-Tools -TimeoutSeconds 60

    }

    То есть внутри цикла создаем коллекцию типа -append до 8, запускаем и набиваем по новой.

    Реально такое сделать?


    28 августа 2015 г. 11:23

Ответы

  • $Max = [Math]::Ceiling(($vms.count/8))
    $JobVM = @{}            
    $CurJob = 0                 
    
    for($CurVM = 0;$CurVM -le $vms.count;$CurVM++)   
    {            
        $JobVM[$CurJob] += @($vms[$CurVM])                      
        if ($CurJob -eq $Max)            
        {    
            $CurJob = 0            
        }            
        else            
        {            
            $CurJob++            
        }            
    }    
    
    0..$max | Foreach {Start-VM $JobVM[$_] -RunAsync| Wait-Tools -TimeoutSeconds 60}

    28 августа 2015 г. 12:13
    Отвечающий

Все ответы

  • Попробуйте параметр RunAsync - http://pubs.vmware.com/vsphere-55/index.jsp?topic=%2Fcom.vmware.powercli.cmdletref.doc%2FStart-VM.html

    Indicates that the command returns immediately without waiting for the task to complete. In this mode, the output of the cmdlet is a Task object. For more information about the RunAsync parameter run "help About_RunAsync" in the vSphere PowerCLI console.

    И почему бы не исключить цикл?

    $vms | Start-VM -RunAsync | Wait-Tools -TimeoutSeconds 60

    28 августа 2015 г. 11:32
    Отвечающий
  • Runasync конечно же придется добавить.

    В случае с $vms | Start-VM -RunAsync | Wait-Tools -TimeoutSeconds 60 стартанут все машины и будет большая нагрузка на хранилища.

    Нужно что-то типа такого:

    $vms = get-vm
    $coll = $null
    foreach($vm in $vms){
    $coll += $vm
    Start-VM $coll -RunAsync| Wait-Tools -TimeoutSeconds 120
    if($coll.Count = 8)
    {$coll = $null}
    }

    28 августа 2015 г. 11:41
  • Или так ?

    $vms = get-vm
    $coll = $null
    foreach($vm in $vms){
    $coll += $vm
    if($coll.count -eq 8)
    {Start-VM $coll -RunAsync| Wait-Tools -TimeoutSeconds 60
    $coll = $null}
    }
    28 августа 2015 г. 11:48
  • $vms = Get-VM
    $coll = @()
    foreach($vm in $vms){
    $coll += $vm
    if($coll.count -eq 2)
    {Start-VM $coll -RunAsync |Wait-Tools -TimeoutSeconds 60 -VM
    $coll = $null}
    }
    Проблема в том что Wait-tools не могут на вход принять массив
    28 августа 2015 г. 12:05
  • $Max = [Math]::Ceiling(($vms.count/8))
    $JobVM = @{}            
    $CurJob = 0                 
    
    for($CurVM = 0;$CurVM -le $vms.count;$CurVM++)   
    {            
        $JobVM[$CurJob] += @($vms[$CurVM])                      
        if ($CurJob -eq $Max)            
        {    
            $CurJob = 0            
        }            
        else            
        {            
            $CurJob++            
        }            
    }    
    
    0..$max | Foreach {Start-VM $JobVM[$_] -RunAsync| Wait-Tools -TimeoutSeconds 60}

    28 августа 2015 г. 12:13
    Отвечающий
  • =0

    Спасибо, надо чуток времени чтобы это переварить :)

    28 августа 2015 г. 12:32
  • Подскажите, почему вы решили использовать hash-table, а не коллекцию?
    31 августа 2015 г. 6:59
  • Скрипт работает на ура, удалось разобрать его по строчкам. Спасибо.

    Единственный момент 

    Foreach {Start-VM $JobVM[$_] -RunAsync| Wait-Tools -TimeoutSeconds 60

    Wait-tools не принимает на вход массив объектов, можно ли запустить не для всего элемента $JobVM[$_], а для всех элементов, но не foreach, а одновременно?

    31 августа 2015 г. 8:10
  • Решил вот так:

    $Max = [Math]::Ceiling(($vms.count/8))
    $Max
    $coll = @{}
    $temp = 0
    for($i = 0;$i -le $vms.count;$i++)
    {
    $coll[$temp] += @($vms[$i])
        if ($temp -eq $max)            
        {    
            $temp = 0          
        }            
        else            
        {            
            $temp++ 
    }  
    }

    0..$max | Foreach{
    Start-vm ($coll[$_]).Name -RunAsync
    Start-Sleep -Seconds 3
    Wait-Tools -VM ($coll[$_]).Name -TimeoutSeconds 300
    }

    И все же подскажите, почему Hashtable, а не Collection?

    31 августа 2015 г. 9:10