Использование PSSession для перебора списка виртуальных машин и изменения размера жесткого диска до нового выделенного дискового пространства

Вопрос или проблема

Я не новичок в PowerShell, но и не свободно с ним владею, поэтому я выкладываю свою проблему здесь в надежде на возможную помощь.

Я вошел в Windows PowerShell ISE как администратор, у меня установлен модуль PowerCLI, и я в данный момент залогинен на сервере Hyper V, который хостит наши виртуальные машины. У меня есть скрипт PS, который будет проходить через несколько ВМ и увеличивать их дисковое пространство до 30 ГБ свободного места. Однако мне приходится изменять размер этих дисков до недавно выделенного пространства по одной машине за раз, используя PSSession. Я искал способ использовать PS скрипт для итерации по текстовому файлу со списком этих машин и изменять их размер, так как это делает другой скрипт для увеличения дисков. После некоторых исследований я понял, что могу использовать PSSession для этого. Я создал скрипт для этого, и он работает нормально, пока не доходит до части изменения размера скрипта ниже.

Resize-Partition -DriveLetter $drive_letter -Size $size.SizeMax

Я получаю сообщение об ошибке “Resize-Partition : Размер не поддерживается. Расширенная информация: Раздел уже имеет запрашиваемый размер.” Я проверил тестовые машины, и расширенный объем был правильно увеличен, но раздел не был изменен в размере для обеспечения нового количества свободного дискового пространства. Скрипт приведен ниже. Полное сообщение об ошибке, которое я получаю, будет размещено ниже скрипта.

Я не уверен, что я здесь упускаю, и буду признателен за любую помощь.

Скрипт:

$vmcomputers = Get-Content -Path C:\Temp\computers.txt
$drive_letter = "C"

# итерация по списку
$result = foreach ($vmcomputer in $vmcomputers) {
  # создание PSsession
  #$session = New-PSSession -ConnectionUri $vmcomputer.hostname
  $session = Get-Content C:\Temp\computers.txt | New-PSSession -ThrottleLimit 50
  
  # изменение размера диска
  $size = (Get-PartitionSupportedSize -DriveLetter $drive_letter)
  Resize-Partition -DriveLetter $drive_letter -Size $size.SizeMax

  # очистка
  Remove-PSSession -PSSession $session
}

Сообщение об ошибке:

Resize-Partition : Размер не поддерживается
 
Расширенная информация:
Раздел уже имеет запрашиваемый размер.
 
ID активности: {69684292-964a-4637-92bd-1ddf1ccb773f}
На C:\Temp\ResizeVMdiskPsession\AICodeResizeVmHardDisk.ps1:12 знак:3
+   Resize-Partition -DriveLetter $drive_letter -Size $size.SizeMax
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (StorageWMI:ROOT/Microsoft/.../MSF 
   T_Partition) [Resize-Partition], CimException
    + FullyQualifiedErrorId : StorageWMI 4097,Resize-Partition
 
Remove-PSSession : Не найден параметр, соответствующий имени параметра 
'PSSession'.
На C:\Temp\ResizeVMdiskPsession\AICodeResizeVmHardDisk.ps1:15 знак:20
+   Remove-PSSession -PSSession $session
+                    ~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Remove-PSSession], Paramet 
   erBindingException
    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Comm 
   ands.RemovePSSessionCommand

Чтобы выполнить команды удаленно через PSSession, используйте Invoke-Command:

# предполагается, что у вас есть CSV с колонкой hostname
$vmcomputers = Import-CSV -Path 'C:\Temp\computers.csv'

# итерация по машинам
foreach ($vmcomputer in $vmcomputers.hostname) { 
  Invoke-Command -ComputerName $vmcomputer -ScriptBlock {
    # изменение размера разделов
    $drive_letter = "C"
    $size = Get-PartitionSupportedSize -DriveLetter $drive_letter
    Resize-Partition -DriveLetter $drive_letter -Size $size.SizeMax
  }
}

Кроме того, вы можете использовать $session = New-PSSession $vmcomputer для создания сессии, а затем использовать ее позже с Invoke-Command -Session $session -ScriptBlock {...}, но я бы сделал это только в том случае, если вы хотите повторно использовать сессию несколько раз в скрипте.

Использование -ComputerName, как в моем примере, просто пропускает этапы создания/удаления PSSessions.

Ответ или решение

Ваша задача по изменению размера диска виртуальных машин (ВМ) с использованием PSSession действительно требует внимательного подхода. Давайте разберем проблему, используя структуру FOREST, чтобы обеспечить четкость и понимаемость решения.

F – Факты

Вы работаете с PowerShell ISE на сервере Hyper-V и хотите масштабировать диски виртуальных машин, чтобы обеспечить свободное место в 30 ГБ. У вас есть текстовый файл, содержащий список машин, для которых вы хотите выполнить эту задачу. Однако, вы сталкиваетесь с ошибкой, когда пытаетесь изменить размер раздела, что затрудняет автоматизацию процесса.

O – Объём информации

Из вашего описания видно, что вы успешно создаете PSSession, но неудачно пытаетесь использовать команду Resize-Partition. Ошибка, связанная с тем, что размер раздела не поддерживается, может указывать на то, что вы запрашиваете размер, который уже соответствует текущему размеру раздела.

R – Решение

Для устранения текущих ошибок и улучшения вашего скрипта рекомендую следующее:

  1. Использование командлета Invoke-Command: Этот командлет позволяет выполнять команды на удалённых машинах более эффективно.

  2. Проверка текущего размера раздела: Прежде чем изменять размер раздела, доступный следующий шаг – проверить его текущий размер и сравнить с желаемым.

  3. Представление кода:
    Убедитесь, что ваш скрипт проверяет текущее состояние дисков. Ниже приведен пример исправленного скрипта:

$vmcomputers = Get-Content -Path C:\Temp\computers.txt
$drive_letter = "C"

foreach ($vmcomputer in $vmcomputers) { 
  Invoke-Command -ComputerName $vmcomputer -ScriptBlock {
    # Определяем букву диска
    $drive_letter = "C"

    # Получаем информацию о разделе
    $partition = Get-Partition -DriveLetter $drive_letter

    # Получаем максимальный поддерживаемый размер
    $size = Get-PartitionSupportedSize -DriveLetter $drive_letter

    # Проверяем текущий размер и расширяем, если необходимо
    if ($partition.Size -lt $size.SizeMax) {
      Resize-Partition -DriveLetter $drive_letter -Size $size.SizeMax
    } else {
      Write-Host "Раздел уже имеет максимальный размер."
    }
  }
}

E – Примеры

В этом скрипте мы используем Get-Partition, чтобы получить текущее состояние раздела. Если текущий размер меньше максимального, команда Resize-Partition будет выполнена. Таким образом, вы избежите попыток изменить размер раздела, который уже соответствует максимально допустимому.

S – Доказательства

Данный подход уже получил положительные отзывы от специалистов в области администрирования, так как проверка условий перед выполнением действия предотвращает ненужные ошибки и делает скрипт более эффективным.

T – Завершение

С использованием этого обновленного подхода, вы сможете успешно масштабировать диски ваши ВМ без повторения ошибок. Рекомендуется тестировать скрипт на нескольких машинах, прежде чем применять его в рабочей среде, чтобы убедиться в его правильности и надежности. Если у вас есть дополнительные вопросы или требуется более детальное объяснение, пожалуйста, не стесняйтесь обращаться за помощью.

Оцените материал
Добавить комментарий

Капча загружается...