Привет! Меня зовут Константин, я ведущий инженер по разработке ПО в компании YADRO. Разрабатываю инструменты сопровождения оборудования, которое мы производим, в том числе серверов линейки VEGMAN. Один из таких инструментов — модуль PowerShell, который позволяет управлять серверными платформами посредством BMC, или Baseboard Management Controller.

PowerShell, на мой взгляд, входит в число лучших инструментов для автоматизации рутинных операций и оперативного получения информации. Решение отлично подходит для автоматизации работы с гетерогенной инфраструктурой — например, ряда серверов разных вендоров. Разработанный в компании модуль взаимодействует с Redfish API и может работать с любым сервером, который его предоставляет. В статье рассмотрим сценарий работы с несколькими серверными платформами и проведем базовую конфигурацию, а еще я поделюсь ссылкой для его скачивания и тестирования.

Что это за модуль и в чем его задача

Обычно этот модуль мы предлагаем клиентам YADRO, которые хотят гибче управлять серверными платформами семейств YADRO X и VEGMAN. Но в теории он будет работать и для других серверов, где API реализовано через Redfish. 

Модуль позволяет автоматизировать различные рутинные операции: от настройки имени хоста или указания адресов NTP-серверов до работы с журналами и аудита настроек. Если в компании уже существуют автоматизированные процессы, построенные с использованием PowerShell, то внедрение модуля пройдет практически бесшовно. Работать с ним можно сразу после подключения сервера и назначения IP-адреса на сетевом интерфейсе BMC.

Для работы модуля понадобится PowerShell версии не ниже 7.2.0. Также необходимо обеспечить доступ к BMC серверов по протоколу HTTPS. Допускается использование любого типа учетной записи, в том числе Read-Only. Если у учетной записи недостаточно прав, то при выполнении командлета выпадет ошибка.

Далее нужно скачать архив с модулем с нашего ресурса. Мы пока не можем опубликовать его в PowerShell Gallery, но в скором времени надеемся решить этот вопрос.

Импортируем файл модуля — теперь можно приступить к работе. И начнем мы с поиска информации о серверах.

Поиск серверных систем в диапазоне IP-адресов

Представим: наши новенькие серверы смонтированы в стойку, включены, на BMC назначены IP-адреса. У нас есть серийные номера этих серверов и нам нужно найти их в нашей сети управления, после чего приступить к проверкам и настройке.

За поиск серверных систем отвечает командлет Find-ServerSystems. Для работы ему необходимо передать учетные данные доступа к серверам, а также диапазон сканируемых адресов в виде начального и конечного адреса с помощью параметров -StartIpAddress и -EndIpAddress соответственно или просто указать подсеть, используя параметр -Subnet.

Первым делом создадим переменную, в которой будем хранить список серийных номеров:

$sn = @('020421006C','0204210078','0206210052','7462361800115')

Далее создадим учетные данные для доступа к нашим серверам:

$creds = New-Object System.Management.Automation.PSCredential (“admin”, (ConvertTo-SecureString “admin” -AsPlainText -Force))

Теперь воспользуемся командлетом Find-ServerSystems, передав ему учетные данные и указав подсеть сканирования. Отфильтруем результат по серийным номерам и сохраним его для дальнейшего использования с командлетом Connect-Server:

$servers = Find-ServerSystems -Subnet 172.20.130.0/24 -Credential $creds
$servers | ft
  
Hostname                ManagementAddress Manufacturer Model              PartNumber    SerialNumber  BiosVersion     BmcVersion      PowerState
--------                ----------------- ------------ -----              ----------    ------------  -----------     ----------      ----------
vegman-s220-02012200C4  172.20.130.4      YADRO        VEGMAN S220 Server ASMVEG780102A 02012200C4    1.5.1-g84a4f2   v1.5.1r3ad9df   On
vegman-s220-020921001E  172.20.130.5      YADRO        VEGMAN S220 Server ASMVEG780102A 020921001E    1.5.1-g84a4f2   v1.5.1r3ad9df   On
vegman-s220-0204210078  172.20.130.8      YADRO        VEGMAN S220 Server ASMVEG780102A 0204210078    1.5.1-g84a4f2   v1.5.1r3ad9df   On
vegman-s220-020921001D  172.20.130.14     YADRO        VEGMAN S220 Server ASMVEG780102A 020921001D    1.5.1-g84a4f2   v1.5.1r3ad9df   On
vegman-s220-020921001C  172.20.130.42     YADRO        VEGMAN S220 Server ASMVEG780102A 020921001C    1.5.1-g84a4f2   v1.5.1r3ad9df   On
vegman-s220-020921001A  172.20.130.110    YADRO        VEGMAN S220 Server ASMVEG780102A 020921001A    1.5.1-g84a4f2   v1.5.1r3ad9df   On
AMIFC4596F1BE84         172.20.130.114    YADRO                                         7384603900201 10.09.20        10.15.20        On
AMIFC4596F1BF5C         172.20.130.115    YADRO                                         7384603900212 10.08.20        10.14.20        On
...
AMIFC4596F1BE74         172.20.130.122    YADRO                                         7384603900154 10.09.20        10.17.20        On
AMIFC4596F21DB0         172.20.130.130    YADRO                                         7462361800115 10.26.20        10.17.20        Off
vegman-s220-0206210052  172.20.130.151    YADRO        VEGMAN S220 Server ASMVEG780102A 0206210052    1.5.1-g84a4f2   v1.5.1r3ad9df   On
vegman-s220-020421006C  172.20.130.152    YADRO        VEGMAN S220 Server ASMVEG780102A 020421006C    1.5.1-g84a4f2   v1.5.1r3ad9df   On
  
PS> $newServers = $servers | ? { $_.SerialNumber -in $sn }
PS> $newServers | ft
  
Hostname                ManagementAddress Manufacturer Model              PartNumber    SerialNumber  BiosVersion     BmcVersion      PowerState
--------                ----------------- ------------ -----              ----------    ------------  -----------     ----------      ----------
vegman-s220-0204210078  172.20.130.8      YADRO        VEGMAN S220 Server ASMVEG780102A 0204210078    1.5.1-g84a4f2   v1.5.1r3ad9df   On
AMIFC4596F21DB0         172.20.130.130    YADRO                                         7462361800115 10.26.20        10.17.20        Off
vegman-s220-0206210052  172.20.130.151    YADRO        VEGMAN S220 Server ASMVEG780102A 0206210052    1.5.1-g84a4f2   v1.5.1r3ad9df   On
vegman-s220-020421006C  172.20.130.152    YADRO        VEGMAN S220 Server ASMVEG780102A 020421006C    1.5.1-g84a4f2   v1.5.1r3ad9df   On

Подключение к серверам

Серверы мы нашли — будем подключаться. Для этого вызовем командлет Connect-Server и передадим ему два параметра: учетные данные (параметр -Credential) и адреса управления (параметр -ManagementAddress):

Connect-Server -ManagementAddress $newServers.ManagementAddress -Credential $creds

При подключении ошибок не возникло, но все же проверим, c какими серверами установлено соединение. Для этого используем командлет Get-Connection:

Get-Connection | ft
  
Id                               ManagementAddress ClientOriginAddress CreationDateTime    ExpirationDateTime  IsExpired
--                               ----------------- ------------------- ----------------    ------------------  ---------
24328c52                         172.20.130.8      10.199.17.218       03.05.2023 22:53:12 03.05.2023 23:53:12     False
d754f37aa7e4e172ab39363dc0d8b989 172.20.130.130                        03.05.2023 22:53:10 03.05.2023 23:53:10     False
7441a116                         172.20.130.152    10.199.17.218       03.05.2023 22:53:11 03.05.2023 23:53:11     False
7b186e3a                         172.20.130.151    10.199.17.218       03.05.2023 22:53:10 03.05.2023 23:53:10     False

При выполнении этого командлета мы дополнительно получаем следующую информацию:

  • времени установки соединения (свойство CreationDateTime),

  • время истечения сессии (свойство ExpirationDateTime),

  • истекла ли сессия на текущий момент (свойство IsExpired).

Все это рассчитывается согласно настройкам времени жизни сессии на стороне сервера. Позже рассмотрим, как можно изменить время жизни сессии.

Проверка конфигурации сервера

Перейдем к проверке конфигурации сервера, начнем с процессоров.

Информация о процессорах

За ее получение отвечает командлет Get-Processor. Выполним его и сгруппируем результат по адресу управления сервером:

Get-Processor | ft -GroupBy ManagementAddress
  
   ManagementAddress: 172.20.130.8
  
Id   ManagementAddress InstructionSet Manufacturer         MaxSpeedMHz Model                                       Architecture Socket TotalCores TotalThreads
--   ----------------- -------------- ------------         ----------- -----                                       ------------ ------ ---------- ------------
cpu0 172.20.130.8      x86-64         Intel(R) Corporation        4000 Intel(R) Xeon(R) Silver 4214R CPU @ 2.40GHz x86          CPU0           12           24
  
  
   ManagementAddress: 172.20.130.130
  
Id   ManagementAddress InstructionSet Manufacturer         MaxSpeedMHz Model Architecture Socket TotalCores TotalThreads
--   ----------------- -------------- ------------         ----------- ----- ------------ ------ ---------- ------------
CPU0 172.20.130.130                   Intel(R) Corporation        4000       x86          CPU0           32           64
CPU1 172.20.130.130                   Intel(R) Corporation        4000       x86          CPU1           32           64 
  
   ManagementAddress: 172.20.130.151
  
Id   ManagementAddress InstructionSet Manufacturer         MaxSpeedMHz Model                                    Architecture Socket TotalCores TotalThreads
--   ----------------- -------------- ------------         ----------- -----                                    ------------ ------ ---------- ------------
cpu0 172.20.130.151    x86-64         Intel(R) Corporation        4000 Intel(R) Xeon(R) Gold 6230 CPU @ 2.10GHz x86          CPU0           20           40
cpu1 172.20.130.151    x86-64         Intel(R) Corporation        4000 Intel(R) Xeon(R) Gold 6230 CPU @ 2.10GHz x86          CPU1           20           40
  
   ManagementAddress: 172.20.130.152
  
Id   ManagementAddress InstructionSet Manufacturer         MaxSpeedMHz Model                                     Architecture Socket TotalCores TotalThreads
--   ----------------- -------------- ------------         ----------- -----                                     ------------ ------ ---------- ------------
cpu0 172.20.130.152    x86-64         Intel(R) Corporation        4000 Intel(R) Xeon(R) Gold 6238R CPU @ 2.20GHz x86          CPU0           28           56
cpu1 172.20.130.152    x86-64         Intel(R) Corporation        4000 Intel(R) Xeon(R) Gold 6238R CPU @ 2.20GHz x86          CPU1           28           56

В дополнение с помощью этого командлета можно получить информацию о пустых процессорных сокетах. Для этого используйте параметр -IncludeEmptySockets.

Информация об оперативной памяти

Данные об установленных модулях оперативной памяти получим с помощью командлета Get-Memory:

Get-Memory | ft -GroupBy ManagementAddress
  
   ManagementAddress: 172.20.130.130
  
Id          ManagementAddress CapacityMiB Manufacturer PartNumber           SerialNumber  BaseModuleType MemoryDeviceType MemoryType DeviceLocator
--          ----------------- ----------- ------------ ----------           ------------  -------------- ---------------- ---------- -------------
CPU0_DIMM0  172.20.130.130            32768 Micron       36ASF4G72PZ-3G2R1    2131-3086AAFB RDIMM          DDR4             DRAM       CPU0_DIMM_A0
CPU0_DIMM1  172.20.130.130                0 NO DIMM      NO DIMM              NO DIMM       RDIMM          DDR4             DRAM       CPU0_DIMM_A1
CPU0_DIMM10 172.20.130.130                0 NO DIMM      NO DIMM              NO DIMM       RDIMM          DDR4             DRAM       CPU0_DIMM_F0
...
CPU0_DIMM8  172.20.130.130            32768 Micron       36ASF4G72PZ-3G2R1    2130-3063257B RDIMM          DDR4             DRAM       CPU0_DIMM_E0
CPU0_DIMM9  172.20.130.130                0 NO DIMM      NO DIMM              NO DIMM       RDIMM          DDR4             DRAM       CPU0_DIMM_E1
CPU1_DIMM16 172.20.130.130            32768 Micron       36ASF4G72PZ-3G2R1    2130-306328E5 RDIMM          DDR4             DRAM       CPU1_DIMM_A0
CPU1_DIMM17 172.20.130.130                0 NO DIMM      NO DIMM              NO DIMM       RDIMM          DDR4             DRAM       CPU1_DIMM_A1
CPU1_DIMM18 172.20.130.130                0 NO DIMM      NO DIMM              NO DIMM       RDIMM          DDR4             DRAM       CPU1_DIMM_B0
...
CPU1_DIMM24 172.20.130.130            32768 Micron       36ASF4G72PZ-3G2R1    2130-30632247 RDIMM          DDR4             DRAM       CPU1_DIMM_E0
CPU1_DIMM25 172.20.130.130                0 NO DIMM      NO DIMM              NO DIMM       RDIMM          DDR4             DRAM       CPU1_DIMM_E1
CPU1_DIMM26 172.20.130.130                0 NO DIMM      NO DIMM              NO DIMM       RDIMM          DDR4             DRAM       CPU1_DIMM_F0
...
  
   ManagementAddress: 172.20.130.8
  
Id          ManagementAddress CapacityMiB Manufacturer PartNumber       SerialNumber BaseModuleType MemoryDeviceType MemoryType DeviceLocator
--          ----------------- ----------- ------------ ----------       ------------ -------------- ---------------- ---------- -------------
DIMM_CPU0_A 172.20.130.8            32768 Samsung      M393A4K40CB2-CVF 464A7DBC     RDIMM          DDR4             DRAM       NODE 0 CHANNEL 0 DIMM 0 (C0A)
DIMM_CPU0_B 172.20.130.8            32768 Samsung      M393A4K40CB2-CVF 464A7BFB     RDIMM          DDR4             DRAM       NODE 0 CHANNEL 1 DIMM 0 (C0B)
DIMM_CPU0_D 172.20.130.8            32768 Samsung      M393A4K40CB2-CVF 464A805A     RDIMM          DDR4             DRAM       NODE 0 CHANNEL 3 DIMM 0 (C0D)
DIMM_CPU0_E 172.20.130.8            32768 Samsung      M393A4K40CB2-CVF 464A7605     RDIMM          DDR4             DRAM       NODE 0 CHANNEL 4 DIMM 0 (C0E)
  
   ManagementAddress: 172.20.130.151
  
Id          ManagementAddress CapacityMiB Manufacturer PartNumber           SerialNumber BaseModuleType MemoryDeviceType MemoryType DeviceLocator
--          ----------------- ----------- ------------ ----------           ------------ -------------- ---------------- ---------- -------------
DIMM_CPU0_A 172.20.130.151          65536 Samsung      M393A8G40MB2-CVF     15A7AFDC     RDIMM          DDR4             DRAM       NODE 0 CHANNEL 0 DIMM 0 (C0A)
DIMM_CPU0_B 172.20.130.151          65536 Samsung      M393A8G40MB2-CVF     15A7AD31     RDIMM          DDR4             DRAM       NODE 0 CHANNEL 1 DIMM 0 (C0B)
DIMM_CPU0_D 172.20.130.151          65536 Samsung      M393A8G40MB2-CVF     15A7B193     RDIMM          DDR4             DRAM       NODE 0 CHANNEL 3 DIMM 0 (C0D)
DIMM_CPU0_E 172.20.130.151          65536 Samsung      M393A8G40MB2-CVF     15A7C2A0     RDIMM          DDR4             DRAM       NODE 0 CHANNEL 4 DIMM 0 (C0E)
DIMM_CPU1_A 172.20.130.151          65536 Samsung      M393A8G40MB2-CVF     15A7C4ED     RDIMM          DDR4             DRAM       NODE 1 CHANNEL 0 DIMM 0 (C1A)
DIMM_CPU1_B 172.20.130.151          65536 Samsung      M393A8G40MB2-CVF     15A7C27C     RDIMM          DDR4             DRAM       NODE 1 CHANNEL 1 DIMM 0 (C1B)
DIMM_CPU1_D 172.20.130.151          65536 Samsung      M393A8G40MB2-CVF     15A7AF18     RDIMM          DDR4             DRAM       NODE 1 CHANNEL 3 DIMM 0 (C1D)
DIMM_CPU1_E 172.20.130.151          65536 Samsung      M393A8G40MB2-CVF     15A7AFD5     RDIMM          DDR4             DRAM       NODE 1 CHANNEL 4 DIMM 0 (C1E)
  
   ManagementAddress: 172.20.130.152
  
Id          ManagementAddress CapacityMiB Manufacturer PartNumber           SerialNumber BaseModuleType MemoryDeviceType MemoryType DeviceLocator
--          ----------------- ----------- ------------ ----------           ------------ -------------- ---------------- ---------- -------------
DIMM_CPU0_A 172.20.130.152         131072 Samsung      M393AAG40M32-CAE     020966C8     RDIMM          DDR4             DRAM       NODE 0 CHANNEL 0 DIMM 0 (C0A)
DIMM_CPU0_B 172.20.130.152         131072 Samsung      M393AAG40M32-CAE     020963EC     RDIMM          DDR4             DRAM       NODE 0 CHANNEL 1 DIMM 0 (C0B)
DIMM_CPU0_C 172.20.130.152         131072 Samsung      M393AAG40M32-CAE     0209671D     RDIMM          DDR4             DRAM       NODE 0 CHANNEL 2 DIMM 0 (C0C)
DIMM_CPU0_D 172.20.130.152         131072 Samsung      M393AAG40M32-CAE     02096377     RDIMM          DDR4             DRAM       NODE 0 CHANNEL 3 DIMM 0 (C0D)
DIMM_CPU0_E 172.20.130.152         131072 Samsung      M393AAG40M32-CAE     02096371     RDIMM          DDR4             DRAM       NODE 0 CHANNEL 4 DIMM 0 (C0E)
DIMM_CPU0_F 172.20.130.152         131072 Samsung      M393AAG40M32-CAE     020964D2     RDIMM          DDR4             DRAM       NODE 0 CHANNEL 5 DIMM 0 (C0F)
DIMM_CPU1_A 172.20.130.152         131072 Samsung      M393AAG40M32-CAE     020963AC     RDIMM          DDR4             DRAM       NODE 1 CHANNEL 0 DIMM 0 (C1A)
DIMM_CPU1_B 172.20.130.152         131072 Samsung      M393AAG40M32-CAE     0209672E     RDIMM          DDR4             DRAM       NODE 1 CHANNEL 1 DIMM 0 (C1B)
DIMM_CPU1_C 172.20.130.152         131072 Samsung      M393AAG40M32-CAE     0209633E     RDIMM          DDR4             DRAM       NODE 1 CHANNEL 2 DIMM 0 (C1C)
DIMM_CPU1_D 172.20.130.152         131072 Samsung      M393AAG40M32-CAE     02096387     RDIMM          DDR4             DRAM       NODE 1 CHANNEL 3 DIMM 0 (C1D)
DIMM_CPU1_E 172.20.130.152         131072 Samsung      M393AAG40M32-CAE     0209659F     RDIMM          DDR4             DRAM       NODE 1 CHANNEL 4 DIMM 0 (C1E)
DIMM_CPU1_F 172.20.130.152         131072 Samsung      M393AAG40M32-CAE     020964F4     RDIMM          DDR4             DRAM       NODE 1 CHANNEL 5 DIMM 0 (C1F)

Внимательный читатель может заметить, что один из серверов отображает информацию о не занятых слотах памяти. Это сервер серии YADRO X — они предоставляют немного больше дополнительной информации.

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

Get-Memory | group ManagementAddress | select @{n='ManagementAddress';e={$_.Name}}, @{n='TotalMemoryCapacityMiB';e={$_.Group | measure -Sum CapacityMiB | % Sum}}
  
ManagementAddress TotalMemoryCapacityMiB
----------------- ----------------------
172.20.130.130                 131072,00
172.20.130.151                 524288,00
172.20.130.152                1572864,00
172.20.130.8                   131072,00

Информация о PCIе-устройствах

Перейдем к PCIe-устройствам и вызовем командлет Get-PCIeDevice, а также сгруппируем результат.

Get-PcieDevice | ft -GroupBy ManagementAddress
  
   ManagementAddress: 172.20.130.130
  
Id       ManagementAddress DeviceType     Manufacturer                      Model                                                  State   PCIeFunctions
--       ----------------- ----------     ------------                      -----                                                  -----   -------------
00_03_00 172.20.130.130      SingleFunction ASPEED Technology, Inc.           STAR2000 NVMe Controller                               Enabled {0x2000}
00_02_00 172.20.130.130      SingleFunction ASPEED Technology, Inc.           VisionRGB-E2S                                          Enabled {0x1150}
00_16_02 172.20.130.130      SingleFunction Intel Corporation                 Bridge                                                 Enabled {0x347A}
00_4A_05 172.20.130.130      SingleFunction Intel Corporation                 Bridge                                                 Enabled {0x347D}
00_00_16 172.20.130.130      MultiFunction  Intel Corporation                 C620 Series Chipset Family MEI Controller #1           Enabled {0xA1BB, 0xA1BE, 0xA1BA}
00_00_11 172.20.130.130      MultiFunction  Intel Corporation                 C620 Series Chipset Family MROM 0                      Enabled {0xA1EC, 0xA1D2}
00_00_1C 172.20.130.130      MultiFunction  Intel Corporation                 C620 Series Chipset Family PCI Express Root Port #1    Enabled {0xA190, 0xA195, 0xA194}
00_00_17 172.20.130.130      SingleFunction Intel Corporation                 C620 Series Chipset Family SATA Controller [AHCI mode] Enabled {0xA182}
00_00_14 172.20.130.130      MultiFunction  Intel Corporation                 C620 Series Chipset Family USB 3.0 xHCI Controller     Enabled {0xA1B1, 0xA1AF}
00_01_00 172.20.130.130      MultiFunction  Intel Corporation                 I350 Gigabit Network Connection                        Enabled {0x1521, 0x1521}
00_30_00 172.20.130.130      MultiFunction  Intel Corporation                 Ice Lake IEH                                           Enabled {0x0998}
00_B0_00 172.20.130.130      MultiFunction  Intel Corporation                 Ice Lake IEH                                           Enabled {0x0998}
00_16_00 172.20.130.130      MultiFunction  Intel Corporation                 Ice Lake IEH                                           Enabled {0x0998}
00_97_00 172.20.130.130      MultiFunction  Intel Corporation                 Ice Lake IEH                                           Enabled {0x0998}
00_80_00 172.20.130.130      MultiFunction  Intel Corporation                 Ice Lake IEH                                           Enabled {0x0998}
00_00_00 172.20.130.130      MultiFunction  Intel Corporation                 Ice Lake IEH                                           Enabled {0x0998}
00_64_00 172.20.130.130      MultiFunction  Intel Corporation                 Ice Lake IEH                                           Enabled {0x0998, 0x28C0}
00_C9_00 172.20.130.130      MultiFunction  Intel Corporation                 Ice Lake IEH                                           Enabled {0x0998}
00_4A_00 172.20.130.130      MultiFunction  Intel Corporation                 Ice Lake IEH                                           Enabled {0x0998}
00_E2_00 172.20.130.130      MultiFunction  Intel Corporation                 Ice Lake IEH                                           Enabled {0x0998, 0x28C0}
00_80_02 172.20.130.130      SingleFunction Intel Corporation                 Ice Lake NorthPeak                                     Enabled {0x3456}
00_00_02 172.20.130.130      SingleFunction Intel Corporation                 Ice Lake NorthPeak                                     Enabled {0x3456}
00_00_1F 172.20.130.130      MultiFunction  Intel Corporation                 MemoryController                                       Enabled {0xA1A1, 0xA1CB, 0xA1A3, 0xA1A4}
00_4B_00 172.20.130.130      SingleFunction Kingston Technology Company, Inc. P1 NVMe PCIe SSD                                       Enabled {0x2263}
00_17_00 172.20.130.130      MultiFunction  Mellanox Technologies             82540EP Gigabit Ethernet Controller                    Enabled {0x1017, 0x1017}
  
   ManagementAddress: 172.20.130.8
  
Id       ManagementAddress DeviceType     Manufacturer               Model
--       ----------------- ----------     ------------               -----
S0B25D0  172.20.130.8      MultiFunction  Intel Corporation          Ethernet Connection X722 for 10GbE SFP+
S0B179D0 172.20.130.8      MultiFunction  Intel Corporation          Ethernet Controller XXV710 for 25GbE SFP28
S0B5D0   172.20.130.8      SingleFunction Intel Corporation          I210 Gigabit Network Connection
S0B24D3  172.20.130.8      SingleFunction Intel Corporation          PCI bridge
S0B23D0  172.20.130.8      SingleFunction Intel Corporation          PCI bridge
S0B101D0 172.20.130.8      MultiFunction  QLogic Corp.               ISP2722-based 16/32Gb Fibre Channel to PCIe Adapt…
S0B27D0  172.20.130.8      SingleFunction Samsung Electronics Co Ltd NVMe SSD Controller SM981/PM981/PM983
S0B26D0  172.20.130.8      SingleFunction Samsung Electronics Co Ltd NVMe SSD Controller SM981/PM981/PM983
  
   ManagementAddress: 172.20.130.151
  
Id       ManagementAddress DeviceType     Manufacturer            Model
--       ----------------- ----------     ------------            -----
S0B3D0   172.20.130.151    SingleFunction ASPEED Technology, Inc. ASPEED Graphics Family
S0B2D0   172.20.130.151    SingleFunction ASPEED Technology, Inc. AST1150 PCI-to-PCI Bridge
S0B59D0  172.20.130.151    SingleFunction Broadcom / LSI          MegaRAID SAS-3 3108 [Invader] (MegaRAID SAS 9361-8i)
S0B26D0  172.20.130.151    MultiFunction  Intel Corporation       Ethernet Connection X722 for 10GbE SFP+
S1B218D0 172.20.130.151    MultiFunction  Intel Corporation       Ethernet Connection X722 for 10GbE SFP+ (Ethernet Ne…
S0B5D0   172.20.130.151    SingleFunction Intel Corporation       I210 Gigabit Network Connection
S0B4D0   172.20.130.151    SingleFunction Intel Corporation       I210 Gigabit Network Connection
S0B28D0  172.20.130.151    SingleFunction Intel Corporation       Non-Volatile memory controller
S0B27D0  172.20.130.151    SingleFunction Intel Corporation       Non-Volatile memory controller
S1B217D3 172.20.130.151    SingleFunction Intel Corporation       PCI bridge
S1B216D0 172.20.130.151    SingleFunction Intel Corporation       PCI bridge
S0B25D3  172.20.130.151    SingleFunction Intel Corporation       PCI bridge
S0B24D0  172.20.130.151    SingleFunction Intel Corporation       PCI bridge
S1B134D0 172.20.130.151    MultiFunction  Mellanox Technologies   MT27800 Family [ConnectX-5] (ConnectX®-5 EN network …
  
   ManagementAddress: 172.20.130.152
  
Id       ManagementAddress DeviceType     Manufacturer            Model
--       ----------------- ----------     ------------            -----
S0B2D0   172.20.130.152    SingleFunction                         Non-Volatile memory controller
S0B4D0   172.20.130.152    SingleFunction ASPEED Technology, Inc. ASPEED Graphics Family
S0B3D0   172.20.130.152    SingleFunction ASPEED Technology, Inc. AST1150 PCI-to-PCI Bridge
S0B59D0  172.20.130.152    SingleFunction Broadcom / LSI          MegaRAID SAS-3 3108 [Invader] (MegaRAID SAS 9361-8i)
S0B26D0  172.20.130.152    MultiFunction  Intel Corporation       Ethernet Connection X722 for 10GbE SFP+
S1B218D0 172.20.130.152    MultiFunction  Intel Corporation       Ethernet Connection X722 for 10GbE SFP+ (Ethernet Ne…
S0B6D0   172.20.130.152    SingleFunction Intel Corporation       I210 Gigabit Network Connection
S0B5D0   172.20.130.152    SingleFunction Intel Corporation       I210 Gigabit Network Connection
S0B28D0  172.20.130.152    SingleFunction Intel Corporation       Non-Volatile memory controller
S0B27D0  172.20.130.152    SingleFunction Intel Corporation       Non-Volatile memory controller
S1B217D3 172.20.130.152    SingleFunction Intel Corporation       PCI bridge
S1B216D0 172.20.130.152    SingleFunction Intel Corporation       PCI bridge
S0B25D3  172.20.130.152    SingleFunction Intel Corporation       PCI bridge
S0B24D0  172.20.130.152    SingleFunction Intel Corporation       PCI bridge
S1B134D0 172.20.130.152    MultiFunction  Mellanox Technologies   MT27800 Family [ConnectX-5] (ConnectX®-5 EN network …

И в качестве примера рассмотрим ситуацию, что нам необходимо собрать информацию о всех PCIe-устройствах, производитель которых, например, не Intel.

Get-PcieDevice | ? {$_.Manufacturer -notlike '*Intel*'}  | ft -GroupBy ManagementAddress
  
   ManagementAddress: 172.20.130.130
  
Id       ManagementAddress DeviceType     Manufacturer                      Model                             
--       ----------------- ----------     ------------                      -----               
00_03_00 172.20.130.130      SingleFunction ASPEED Technology, Inc.           STAR2000 NVMe Controller         
00_02_00 172.20.130.130      SingleFunction ASPEED Technology, Inc.           VisionRGB-E2S                     
00_4B_00 172.20.130.130      SingleFunction Kingston Technology Company, Inc. P1 NVMe PCIe SSD                  
00_17_00 172.20.130.130      MultiFunction  Mellanox Technologies             82540EP Gigabit Ethernet Controller Enabled
  
   ManagementAddress: 172.20.130.8
  
Id       ManagementAddress DeviceType     Manufacturer               Model
--       ----------------- ----------     ------------               -----
S0B101D0 172.20.130.8      MultiFunction  QLogic Corp.               ISP2722-based 16/32Gb Fibre Channel to PCIe Adapt…
S0B27D0  172.20.130.8      SingleFunction Samsung Electronics Co Ltd NVMe SSD Controller SM981/PM981/PM983
S0B26D0  172.20.130.8      SingleFunction Samsung Electronics Co Ltd NVMe SSD Controller SM981/PM981/PM983
  
   ManagementAddress: 172.20.130.151
  
Id       ManagementAddress DeviceType     Manufacturer            Model
--       ----------------- ----------     ------------            -----
S0B3D0   172.20.130.151    SingleFunction ASPEED Technology, Inc. ASPEED Graphics Family
S0B2D0   172.20.130.151    SingleFunction ASPEED Technology, Inc. AST1150 PCI-to-PCI Bridge
S0B59D0  172.20.130.151    SingleFunction Broadcom / LSI          MegaRAID SAS-3 3108 [Invader] (MegaRAID SAS 9361-8i)
S1B134D0 172.20.130.151    MultiFunction  Mellanox Technologies   MT27800 Family [ConnectX-5] (ConnectX®-5 EN network …
  
   ManagementAddress: 172.20.130.152
  
Id       ManagementAddress DeviceType     Manufacturer            Model
--       ----------------- ----------     ------------            -----
S0B2D0   172.20.130.152    SingleFunction                         Non-Volatile memory controller
S0B4D0   172.20.130.152    SingleFunction ASPEED Technology, Inc. ASPEED Graphics Family
S0B3D0   172.20.130.152    SingleFunction ASPEED Technology, Inc. AST1150 PCI-to-PCI Bridge
S0B59D0  172.20.130.152    SingleFunction Broadcom / LSI          MegaRAID SAS-3 3108 [Invader] (MegaRAID SAS 9361-8i)
S1B134D0 172.20.130.152    MultiFunction  Mellanox Technologies   MT27800 Family [ConnectX-5] (ConnectX®-5 EN network …

Информация о дисковой подсистеме

Для получения информацию о дисковой подсистеме есть командлет Get-StorageDrive. Выполним его и выведем сгруппированную информацию:

Get-StorageDrive  | ft -GroupBy ManagementAddress
  
   ManagementAddress: 172.20.130.130
  
Id                 ManagementAddress CapacityBytes IsHealthy Manufacturer Model                      Protocol Type PartNumber SerialNumber
--                 ----------------- ------------- --------- ------------ -----                      -------- ---- ---------- ------------
NVMe_DeviceB_NSID1 172.20.130.130       250059350016      True N/A          KINGSTON SA2000M8250G      NVMe     SSD             50026B76847FBFAB
SATA_Device0_Port0 172.20.130.130       480103981056      True N/A          SAMSUNG MZ7KH480HAHQ-00005 SATA     SSD             S47MNA0R506503
SATA_Device1_Port1 172.20.130.130       480103981056      True N/A          SAMSUNG MZ7KH480HAHQ-00005 SATA     SSD             S47MNA0R506494
SATA_Device2_Port3 172.20.130.130      1920383410176      True N/A          INTEL SSDSC2KB019T8        SATA     SSD             PHYF122502U41P9DGN
SATA_Device3_Port4 172.20.130.130      1920383410176      True N/A          INTEL SSDSC2KB019T8        SATA     SSD             PHYF122500RL1P9DGN
SATA_Device4_Port5 172.20.130.130       480103981056      True N/A          SAMSUNG MZ7KH480HAHQ-00005 SATA     SSD             S47MNA0R506501
SATA_Device5_Port0 172.20.130.130      1920383410176      True N/A          INTEL SSDSC2KB019T8        SATA     SSD             PHYF122501GH1P9DGN
SATA_Device6_Port1 172.20.130.130      1920383410176      True N/A          INTEL SSDSC2KB019T8        SATA     SSD             PHYF122501FP1P9DGN
SATA_Device7_Port3 172.20.130.130      1920383410176      True N/A          INTEL SSDSC2KB019T8        SATA     SSD             PHYF122501GT1P9DGN
SATA_Device8_Port4 172.20.130.130      1920383410176      True N/A          INTEL SSDSC2KB019T8        SATA     SSD             PHYF122501C91P9DGN
SATA_Device9_Port6 172.20.130.130      1920383410176      True N/A          INTEL SSDSC2KB019T8        SATA     SSD             PHYF122502CU1P9DGN
SATA_DeviceA_Port7 172.20.130.130      1920383410176      True N/A          INTEL SSDSC2KB019T8        SATA     SSD             PHYF122502EH1P9DGN
  
   ManagementAddress: 172.20.130.8
  
Id      ManagementAddress CapacityBytes IsHealthy Manufacturer               Model                      Protocol Type PartNumber SerialNumber
--      ----------------- ------------- --------- ------------               -----                      -------- ---- ---------- ------------
drive_1 172.20.130.8       240057409536      True                            INTEL SSDSCKKB240G8        SATA     SSD             PHYH929100ZS240J
drive_2 172.20.130.8       960197124096      True Samsung Electronics Co Ltd SAMSUNG MZQLB960HAJR-00007 NVMe     SSD             S437NC0R521130
drive_3 172.20.130.8       960197124096      True Samsung Electronics Co Ltd SAMSUNG MZQLB960HAJR-00007 NVMe     SSD             S437NC0R521180
  
   ManagementAddress: 172.20.130.151
  
Id      ManagementAddress CapacityBytes IsHealthy Manufacturer Model               Protocol Type PartNumber SerialNumber
--      ----------------- ------------- --------- ------------ -----               -------- ---- ---------- ------------
drive_1 172.20.130.151     240057409536      True              INTEL SSDSCKKB240G8 SATA                     PHYH018207V0240J
drive_2 172.20.130.151     750156374016      True                                  NVMe
drive_3 172.20.130.151     750156374016      True                                  NVMe
  
   ManagementAddress: 172.20.130.152
  
Id      ManagementAddress CapacityBytes IsHealthy Manufacturer Model              Protocol Type PartNumber SerialNumber
--      ----------------- ------------- --------- ------------ -----              -------- ---- ---------- ------------
drive_1 172.20.130.152    1000204886016      True              WD_BLACK SN770 1TB NVMe                     220207465413
drive_2 172.20.130.152     750156374016      True                                 NVMe
drive_3 172.20.130.152     750156374016      True                                 NVMe

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

Проверка критических событий

Итак, конфигурации мы проверили. Перед тем, как начать настройку сервера, давайте проверим, что никаких критических событий, на которые нам стоит обратить внимание, не зарегистрировано.

Все сообщения, которые регистрирует сервер, разбиты на несколько журналов. Их количество может варьироваться в зависимости от модели сервера. Получить список журналов с сервера можно при помощи командлета Get-LogService.

Get-LogService | ft -GroupBy 'ManagementAddress'
  
   ManagementAddress: 172.20.130.130
  
Id       ManagementAddress Name                    OverWritePolicy MaxNumberOfRecords
--       ----------------- ----                    --------------- ------------------
AuditLog 172.20.130.130      Audit Log               WrapsWhenFull                  150
BIOS     172.20.130.130      System BIOS Log Service WrapsWhenFull                  150
EventLog 172.20.130.130      Event Log               WrapsWhenFull                  150
SEL      172.20.130.130      IPMI SEL                WrapsWhenFull                  150
  
   ManagementAddress: 172.20.130.8
  
Id                 ManagementAddress Name                           OverWritePolicy MaxNumberOfRecords
--                 ----------------- ----                           --------------- ------------------
BIOS POST Code Log 172.20.130.8      POST Code Log Service          WrapsWhenFull
BMC Journal        172.20.130.8      Open BMC Journal Log Service   WrapsWhenFull
EventLog           172.20.130.8      Event Log Service              WrapsWhenFull
Oem Crashdump      172.20.130.8      Open BMC Oem Crashdump Service WrapsWhenFull   3
SEL                172.20.130.8      IPMI System Event Log          WrapsWhenFull
  
   ManagementAddress: 172.20.130.151
  
Id                 ManagementAddress Name                           OverWritePolicy MaxNumberOfRecords
--                 ----------------- ----                           --------------- ------------------
BIOS POST Code Log 172.20.130.151    POST Code Log Service          WrapsWhenFull
BMC Journal        172.20.130.151    Open BMC Journal Log Service   WrapsWhenFull
EventLog           172.20.130.151    Event Log Service              WrapsWhenFull
Oem Crashdump      172.20.130.151    Open BMC Oem Crashdump Service WrapsWhenFull   3
SEL                172.20.130.151    IPMI System Event Log          WrapsWhenFull
  
   ManagementAddress: 172.20.130.152
  
Id                 ManagementAddress Name                           OverWritePolicy MaxNumberOfRecords
--                 ----------------- ----                           --------------- ------------------
BIOS POST Code Log 172.20.130.152    POST Code Log Service          WrapsWhenFull
BMC Journal        172.20.130.152    Open BMC Journal Log Service   WrapsWhenFull
EventLog           172.20.130.152    Event Log Service              WrapsWhenFull
Oem Crashdump      172.20.130.152    Open BMC Oem Crashdump Service WrapsWhenFull   3
SEL                172.20.130.152    IPMI System Event Log          WrapsWhenFull

На примере журнала Event Log давайте запросим все события, начиная с момента подключения питания. Дату и время этого события мы можем узнать из свойства LastResetTime результата работы командлета Get-Manager. Для этого вызовем командлет Get-LogEntry и передадим ему нужный нам журнал. Дополнительно можно задать период, указав начальную и конечную дату интервала -StartDate и -EndDate соответственно. Указать уровень критичности интересующих нас событий можно с помощью параметра -Severity.

Сейчас я в качестве примера приведу достаточно громоздкую запись вызова необходимых нам командлетов для получения результата. Я бы рекомендовал воздерживаться от такого формата вызова командлетов, особенно если вы пишете production-скрипты.

Get-LogService | ? { $_.Id -eq 'EventLog' } | % { $startDate = (Get-Date (Get-Manager -ManagementAddress $_.ManagementAddress).LastResetTime -DisplayHint DateTime); Get-LogEntry -LogService $_ -StartDate $startDate } | Select Id,ManagementAddress,Created,Severity,Message | ft -Wrap -AutoSize -GroupBy 'ManagementAddress'
  
   ManagementAddress: 172.20.130.8
  
Id            ManagementAddress Created             Severity Message
--            ----------------- -------             -------- -------
1683367484_1  172.20.130.8      06.05.2023 12:58:44 Critical Power Unit NonRedundant and has insufficient resource.
1683367484    172.20.130.8      06.05.2023 12:58:44 Warning  Power Unit Redundancy lost.
1683367482    172.20.130.8      06.05.2023 1 2:58:42 Warning  Power supply PSU2 power lost.
1683367481_1  172.20.130.8      06.05.2023 12:58:41 Warning  Power supply PSU2 failure predicted.
1683367481    172.20.130.8      06.05.2023 12:58:41 Warning  Power supply PSU2 failed.
1683367077_1  172.20.130.8      06.05.2023 12:57:57 OK       Power supply PSU2 inserted.
1683367077    172.20.130.8      06.05.2023 12:57:57 OK       Power supply PSU1 inserted.
1683367028_5  172.20.130.8      06.05.2023 12:57:08 OK       Fan detected: VEGMAN S220 System Fan .
1683367028_4  172.20.130.8      06.05.2023 12:57:08 OK       Chassis detected: VEGMAN S220 Server 0204210078.
1683367028_3  172.20.130.8      06.05.2023 12:57:08 OK       PowerSupply detected: U1A-D10800-DRB-Z D080800G862539.
1683367028_2  172.20.130.8      06.05.2023 12:57:08 OK       Board detected: VEGMAN Motherboard Y0JUA02BWK0SY.
1683367028_7  172.20.130.8      06.05.2023 12:57:08 OK       PowerSupply detected: U1A-D10800-DRB-Z D080800G862035.
1683367028_6  172.20.130.8      06.05.2023 12:57:08 OK       Fan detected: VEGMAN S220 System Fan .
1683367028_1  172.20.130.8      06.05.2023 12:57:08 OK       Fan detected: VEGMAN S220 System Fan .
1683367028_9  172.20.130.8      06.05.2023 12:57:08 OK       Fan detected: VEGMAN S220 System Fan .
1683367028_8  172.20.130.8      06.05.2023 12:57:08 OK       Fan detected: VEGMAN S220 System Fan .
1683367013    172.20.130.8      06.05.2023 12:56:53 OK       Host system DC power is on
  
   ManagementAddress: 172.20.130.151
  
Id           ManagementAddress Created             Severity Message
--           ----------------- -------             -------- -------
1683367094_1 172.20.130.151    06.05.2023 12:58:14 OK       Power supply PSU2 inserted.
1683367094   172.20.130.151    06.05.2023 12:58:14 OK       Power supply PSU1 inserted.
1683367055   172.20.130.151    06.05.2023 12:57:35 OK       PowerSupply detected: R1CA2801A   FSE052A0300AGB2044000339.
1683367055_8 172.20.130.151    06.05.2023 12:57:35 OK       Fan detected: VEGMAN S220 System Fan .
1683367055_7 172.20.130.151    06.05.2023 12:57:35 OK       Board detected: VEGMAN Motherboard Y1V1A016X1001.
1683367055_6 172.20.130.151    06.05.2023 12:57:35 OK       Fan detected: VEGMAN S220 System Fan .
1683367055_5 172.20.130.151    06.05.2023 12:57:35 OK       Fan detected: VEGMAN S220 System Fan .
1683367055_4 172.20.130.151    06.05.2023 12:57:35 OK       Fan detected: VEGMAN S220 System Fan .
1683367055_3 172.20.130.151    06.05.2023 12:57:35 OK       Fan detected: VEGMAN S220 System Fan .
1683367055_2 172.20.130.151    06.05.2023 12:57:35 OK       PowerSupply detected: R1CA2801A   FSE052A0300AGB2044000050.
1683367055_1 172.20.130.151    06.05.2023 12:57:35 OK       Chassis detected: VEGMAN S220  0206210052.
1683367038   172.20.130.151    06.05.2023 12:57:18 OK       Host system DC power is on
  
   ManagementAddress: 172.20.130.152
  
Id            ManagementAddress Created             Severity Message
--            ----------------- -------             -------- -------
1683367082_1  172.20.130.152    06.05.2023 12:58:02 OK       Power supply PSU2 inserted.
1683367082    172.20.130.152    06.05.2023 12:58:02 OK       Power supply PSU1 inserted.
1683367052_8  172.20.130.152    06.05.2023 12:57:32 OK       Fan detected: VEGMAN S220 System Fan .
1683367052_7  172.20.130.152    06.05.2023 12:57:32 OK       PowerSupply detected: U1A-D11200-DRB  D041200G3U1965.
1683367052_6  172.20.130.152    06.05.2023 12:57:32 OK       Fan detected: VEGMAN S220 System Fan .
1683367052_5  172.20.130.152    06.05.2023 12:57:32 OK       PowerSupply detected: U1A-D11200-DRB  D041200FBC0491.
1683367052_4  172.20.130.152    06.05.2023 12:57:32 OK       Fan detected: VEGMAN S220 System Fan .
1683367052_3  172.20.130.152    06.05.2023 12:57:32 OK       Board detected: VEGMAN Motherboard Y0JUA02BWK0NF.
1683367052_2  172.20.130.152    06.05.2023 12:57:32 OK       Fan detected: VEGMAN S220 System Fan .
1683367052_1  172.20.130.152    06.05.2023 12:57:32 OK       Fan detected: VEGMAN S220 System Fan .
1683367052    172.20.130.152    06.05.2023 12:57:32 OK       Chassis detected: VEGMAN S220 Server 020421006C.
1683367041    172.20.130.152    06.05.2023 12:57:21 OK       Host system DC power is on

В нашем примере на одном из серверов зарегистрированы критические события, и, похоже, есть проблемы с одним из блоков питания. Эти ошибки не мешают дальнейшей настройке, но мы исключим проблемный сервер, предварительно включив световую индикацию, которая укажет сервисным инженерам на его расположение в стойке. Сделать это можно при помощи командлета Set-IndicatorLED.

Get-System -ManagementAddress '172.20.130.8' | Set-IndicatorLED -State On
Get-System -ManagementAddress '172.20.130.8' | Get-IndicatorLED
  
ManagementAddress State
----------------- -----
172.20.130.8      On

Теперь можно отключаться. Воспользуемся командлетом Disconnect-Server и укажем адрес сервера, от которого хотим отключиться. Операция потребует подтверждения.

Disconnect-Server -ManagementAddress '172.20.130.8'
  
Confirm
Are you sure you want to perform this action?
Performing the operation "Disconnect-Server" on target "Disconnect will be performed from next server: 172.20.130.8".
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"): Y

Итак, мы убедились, что критических событий нет, и можем продолжить настройку. При желании можем очистить журналы событий. Для этого выполним командлет Clear-LogService:

Get-LogService | Clear-LogService

Проверка данных с сенсоров

В дополнение к событиям проверим данные по температурным сенсорам и сенсорам системы охлаждения. Но перед этим наши серверы необходимо включить. За запуск сервера отвечает командлет Start-System:

Get-System | Start-System

Для проверки данных по температурным сенсорам и сенсорам системы охлаждения используются командлеты Get-ChassisThermalSensor и Get-ChassisFanSensor.

Проверяем данные по температурным сенсорам:

$sensorsData | ? { $_.Id -eq 'System_Temp' } | ft
  
Id          ManagementAddress Name        ReadingCelsius MinReadingRangeTemp MaxReadingRangeTemp LowerThresholdCritical LowerThresholdNonCritical UpperThresholdCritical UpperThresholdNonCritical
--------    ----------------- ----        -------------- ------------------- ------------------- ---------------------- ------------------------- ---------------------- -------------------------
System_Temp 172.20.130.151    System Temp          43,75                -128                 127                      0                         5                    115                       110
System_Temp 172.20.130.152    System Temp         33,625                -128                 127                      0                         5                    115                       110
  
$sensorsData | ? { $_.Id -like 'CPU*_Die' } | ft
  
Id       ManagementAddress Name     ReadingCelsius MinReadingRangeTemp MaxReadingRangeTemp LowerThresholdCritical LowerThresholdNonCritical UpperThresholdCritical UpperThresholdNonCritical
-------- ----------------- ----     -------------- ------------------- ------------------- ---------------------- ------------------------- ---------------------- -------------------------
CPU0_Die 172.20.130.151    CPU0 Die         59,641                -128                 127                                                                      95                        87
CPU1_Die 172.20.130.151    CPU1 Die          60,36                -128                 127                                                                      95                        87
CPU0_Die 172.20.130.152    CPU0 Die         39,719                -128                 127                                                                     100                        92
CPU1_Die 172.20.130.152    CPU1 Die         40,625                -128                 127                                                                     100                        92
  
$sensorsData | ? { $_.Id -like 'DIMM*' } | ft
  
Id          ManagementAddress Name        ReadingCelsius MinReadingRangeTemp MaxReadingRangeTemp LowerThresholdCritical LowerThresholdNonCritical UpperThresholdCritical UpperThresholdNonCritical
--------    ----------------- ----        -------------- ------------------- ------------------- ---------------------- ------------------------- ---------------------- -------------------------
DIMM_CPU0_A 172.20.130.151    DIMM CPU0 A             37                -128                 127                                                                      83                        78
DIMM_CPU0_B 172.20.130.151    DIMM CPU0 B             35                -128                 127                                                                      83                        78
DIMM_CPU0_D 172.20.130.151    DIMM CPU0 D             40                -128                 127                                                                      83                        78
DIMM_CPU0_E 172.20.130.151    DIMM CPU0 E             38                -128                 127                                                                      83                        78
DIMM_CPU1_A 172.20.130.151    DIMM CPU1 A             38                -128                 127                                                                      83                        78
DIMM_CPU1_B 172.20.130.151    DIMM CPU1 B             36                -128                 127                                                                      83                        78
DIMM_CPU1_D 172.20.130.151    DIMM CPU1 D             37                -128                 127                                                                      83                        78
DIMM_CPU1_E 172.20.130.151    DIMM CPU1 E             36                -128                 127                                                                      83                        78
...

Проверяем данные по сенсорам системы охлаждения:

Get-Chassis | Get-ChassisFanSensor | ft
  
Id       ManagementAddress Name         Manufacturer Model                  PartNumber    Reading ReadingUnits MinReadingRange MaxReadingRange
-------- ----------------- ----         ------------ -----                  ----------    ------- ------------ --------------- ---------------
Sys_Fan1 172.20.130.151    System Fan 1 YADRO        VEGMAN S220 System Fan ASMFAN781102A    3226 RPM                        0           18000
Sys_Fan2 172.20.130.151    System Fan 2 YADRO        VEGMAN S220 System Fan ASMFAN781102A    3203 RPM                        0           18000
Sys_Fan3 172.20.130.151    System Fan 3 YADRO        VEGMAN S220 System Fan ASMFAN781102A    3218 RPM                        0           18000
Sys_Fan4 172.20.130.151    System Fan 4 YADRO        VEGMAN S220 System Fan ASMFAN781102A    3268 RPM                        0           18000
Sys_Fan5 172.20.130.151    System Fan 5 YADRO        VEGMAN S220 System Fan ASMFAN781102A    3274 RPM                        0           18000
Sys_Fan1 172.20.130.152    System Fan 1 YADRO        VEGMAN S220 System Fan ASMFAN781102A    6437 RPM                        0           18000
Sys_Fan2 172.20.130.152    System Fan 2 YADRO        VEGMAN S220 System Fan ASMFAN781102A    6463 RPM                        0           18000
Sys_Fan3 172.20.130.152    System Fan 3 YADRO        VEGMAN S220 System Fan ASMFAN781102A    6478 RPM                        0           18000
Sys_Fan4 172.20.130.152    System Fan 4 YADRO        VEGMAN S220 System Fan ASMFAN781102A    6497 RPM                        0           18000
Sys_Fan5 172.20.130.152    System Fan 5 YADRO        VEGMAN S220 System Fan ASMFAN781102A    6541 RPM                        0           18000

По данным сенсоров системы охлаждения мы видим, что системные вентиляторы на втором сервере вращаются быстрее других. Возможно, стоит обратить на него внимание.

Настройка базовых параметров

Теперь рассмотрим вопросы настройки базовых параметров сервера: установим имя хоста, настроим адреса DNS- и NTP-серверов, а также установим адрес Syslog-сервера для отправки событий и адрес ловушки SNMP-трапов.

Задаем имя хоста

Настройку начнем с установки имени хоста, для этого используем командлет Set-ManagerHostname. Ему нужно передать информацию о менеджере в параметре -Manager и новое имя хоста через параметр -Hostname. Информация о менеджере нам еще понадобится не раз, поэтому давайте сохраним ее. Устанавливаем имя хоста:

$manager = Get-Manager -ManagementAddress 172.20.130.152
Set-ManagerHostname -Manager $manager -Hostname SPB-V-15

Сетевые настройки

Настройка DNS

Следующим шагом настроим адреса DNS-серверов. В качестве одного из параметров в командлете для настройки DNS (Set-DnsServer) нам нужно передать информацию о сетевых интерфейсах, с них и начнем. Получим информацию о сетевых интерфейсах управления с помощью командлета Get-EthernetInterface и сохраним ее:

$ethernetInterface = Get-EthernetInterface -Manager $manager

Теперь перейдем к настройке DNS. Вызовем командлет Set-DnsServer: В свойство -ManagerEthernetInterface передадим информацию о сетевых интерфейсах управления, полученную выше, а в свойство -DnsServers — адреса DNS-серверов:

Set-DnsServer -EthernetInterface $ethernetInterface[0] -DnsServers '172.17.10.15', '172.17.10.16'

Настройка NTP

Перейдем к синхронизации времени и выполним настройку NTP-протокола. Для этих целей используем командлет Set-ManagerNetworkProtocol. С его помощью можно не только настроить NTP клиента, но и включить/отключить различные протоколы управления, но об этом позже.

В свойстве командлета -Protocol указываем NTP. В свойстве -IsEnabled передаем переменную $true, обозначая, что включаем использование NTP-протокола. В свойстве NTP-Servers указываем адреса NTP-серверов.

Set-ManagerNetworkProtocol -Manager $manager -Protocol NTP -NTPServers '172.17.10.10'

Журналирование и мониторинг

Настройка отправки событий на удаленный сервер

Следующим шагом настроим отправку событий на удаленный сервер, используя командлет Set-RemoteLoggingServerЭтому командлету передаются три свойства: информация о менеджере (свойство -Manager), адрес и порт удаленного сервера (свойства -Address и -Port). Получаем информацию о менеджере:

Set-RemoteLoggingServer -Manager $manager -Address 172.10.19.10 -Port 3034

Настройка протокола SNMP

Для настройки протокола SNMP понадобится командлет, который мы уже использовали для настройки NTP-протокола, — Set-ManagerNetworkProtocol.

В свойствах командлета указываем, какой SNMP-протокол, в свойстве -IsEnabled передаем переменную $true, обозначая, что включаем использование SNMP-протокола.

При настройке SNMP-протокола еще нужно указать CommunityString, используя соответствующее свойство.

Set-ManagerNetworkProtocol -Manager $manager -Protocol SNMP -CommunityString 'public' -IsEnabled:$true

Настройка отправки SNMP-трапов

Следующим шагом добавим адрес ловушки получателя SNMP-трапов. Для этого есть командлет Add-SnmpTrapReceiverв параметры которому передаем настраиваемую серверную систему (параметр -ServerSystem), адрес и порт ловушки (параметры -Address и -Port):

Add-SnmpTrapReceiver -ServerSystem (Get-System) -Address 10.10.10.20 -Port 162

Управление питанием

Настройка действия при возобновлении подачи электропитания

Еще один важный момент, который мы с вами настроим, — это установка политики восстановления при возобновлении подачи электропитания. 

Можно выбрать один из трех вариантов: 

  • при возобновлении электропитания сервер будет всегда включаться (AlwaysOn), 

  • всегда оставаться выключенным (AlwaysOff), 

  • принимать последнее состояние сервера (LastState). 

Для настройки вызовем командлет Set-PowerRestorePolicy и передадим в свойство -PowerRestorePolicy одно из трех значений (AlwaysOn, AlwaysOff, LastState).

Set-PowerRestorePolicy -ServerSystem (Get-System) -PowerRestorePolicy AlwaysOn

Управление пользователями и сессиями

Теперь перейдем к настройке пользователей. Нам необходимо:

  • Установить время жизни пользовательской сессии — в нашем случае это 1800 секунд.

  • Уточнить требования к минимальной и максимальной длине пароля.

  • Установить количество неверных попыток входа — например, пять.

  • Установить время блокировки учетной записи на 180 секунд

Управление параметрами сессий

Начнем с проверки времени жизни пользовательской сессии, используя командлет Get-SessionService:

Get-SessionService
Id             ManagementAddress SessionTimeout
--             ----------------- --------------
SessionService 172.20.130.8                3600

Как мы видим, значение установлено в 3600 секунд, нам нужно поменять на 1800. Для этого используем командлет Set-SessionService с параметром -SessionTimeout 1800 и проверим, что изменения внесены успешно:

Set-SessionService -SessionService (Get-SessionService) -SessionTimeout 1800
Get-SessionService
Id             ManagementAddress SessionTimeout
--             ----------------- --------------
SessionService 172.20.130.8                1800

Управление учетными записями

Политика безопасности

Теперь проверим требования к минимальной и максимальной длине пароля пользователя (эти значения неизменны), а также политику блокировки учетных записей при определенном количестве неудачных попыток входа. 

Для этих целей служит командлет Get-AccountService. Требования к минимальной и максимальной длине пароля представлены свойствами MinPasswordLength и MaxPasswordLength. Политика блокировки учетных записей также представлена двумя свойствами AccountLockoutDuration и AccountLockoutThreshold. Первое отвечает за время в секундах, на которое блокируется учетная запись, а второе — за порог количества неверных попыток входа, после которых наступает блокировка.

$accountservice = Get-AccountService -ManagementAddress 172.20.130.151
$accountservice
   
Id                                : AccountService
ManagementAddress                 : 172.20.130.151
Name                              : Account Service
AccountLockoutCounterResetAfter   :
AccountLockoutCounterResetEnabled :
AccountLockoutDuration            : 0
AccountLockoutThreshold           : 0
AuthFailureLoggingThreshold       :
Description                       : Account Service
LocalAccountAuth                  :
MaxPasswordLength                 : 20
MinPasswordLength                 : 8
IsEnabled                         : True

Как мы видим, значения -AccountLockoutDuration и -AccountLockoutThreshold нулевые — значит, политика блокировки пользователей отключена. Давайте это исправим с помощью командлета Set-AccountPolicySettings, передав два параметра -AccountLockoutDuration 180 и -AccountLockoutThreshold 5.

Set-AccountPolicySettings -AccountService $accountService -AccountLockoutDuration 180 -AccountLockoutTreshold 5

Готово!

Создание, изменение и удаление учетных записей

Начнем с получения списка пользователей. Воспользуемся командлетом Get-Account:

$accountService | Get-Account | ft
  
Id          ManagementAddress Username    RoleId        IsEnabled IsLocked IsPasswordChangeRequired
--          ----------------- --------    ------        --------- -------- ------------------------
admin       172.20.130.151    admin       Administrator      True    False                    False

Сейчас у нас в системе один пользователь с ролью Administrator. Давайте получим список всех ролей, предустановленных на сервере. Для этого воспользуемся командлетом Get-Role:

$accountService | Get-Role | ft
  
Id            ManagementAddress AssignedPrivileges                                        Description             IsPredefined RoleId
--            ----------------- ------------------                                        -----------             ------------ ------
Administrator 172.20.130.151    {Login, ConfigureManager, ConfigureUsers, ConfigureSelf…} Administrator User Role         True Administrator
Operator      172.20.130.151    {Login, ConfigureSelf, ConfigureComponents}               Operator User Role              True Operator
ReadOnly      172.20.130.151    {Login, ConfigureSelf}                                    ReadOnly User Role              True ReadOnly

Теперь создадим нового пользователя с логином monitor и ролью ReadOnly и пока оставим его неактивным. Для этого получим нужную нам роль и вызовем командлет New-Account. Также дополнительно добавим параметр -PassThru, который вернет нам булевый результат выполнения операции. Это очень полезно в разработке скриптов — например, при использовании в условиях.

$readOnlyRole = $accountService | Get-Role -RoleId 'ReadOnly'
$readOnlyRole
  
Id                 : ReadOnly
ManagementAddress  : 172.20.130.151
AssignedPrivileges : {Login, ConfigureSelf}
Description        : ReadOnly User Role
IsPredefined       : True
RoleId             : ReadOnly
  
$accountService | New-Account -Username 'monitor' -Password 'Password_007' -Role $readOnlyRole -IsEnabled:$false -PassThru
True
  
  
$accountService | Get-Account -Username 'monitor' | ft
  
Id      ManagementAddress Username RoleId   IsEnabled IsLocked IsPasswordChangeRequired
--      ----------------- -------- ------   --------- -------- ------------------------
monitor 172.20.130.151    monitor  ReadOnly     False    False                    False

Теперь активируем нашего пользователя с помощью командлета Set-Account. Помимо операций включения/отключения учетной записи, он позволяет изменять имя пользователя, пароль или роль.

$accountService | Get-Account -Username 'monitor' | Set-Account -IsEnabled:$true
  
Succeed
-------
   True

И в завершение в качестве примера давайте удалим учетную запись пользователя monitor. По умолчанию командлет выдаст запрос на подтверждение выполнения операции. Если нам не нужно подтверждение, можно добавить ключ -Confirm:$false. В примере ниже мы все же подтвердим удаление.

$accountService | Get-Account -Username 'monitor' | Remove-Account
  
Confirm
Are you sure you want to perform this action?
Performing the operation "Remove-Account" on target "Account monitor will be deleted from server: 172.20.130.151".
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"): Y
  
Succeed
-------
   True

Управление параметрами загрузки и монтирование образов

За установку источника загрузки отвечает командлет Set-BootSource. Параметр -BootSource может принимать одно из следующих значений: None | PXE | HDD | CD | Diags | BiosSetup | USB. В нашем случае мы будем использовать CD. Cвойство -BootMode указывает на тип интерфейса загрузчика: Legacy или UEFI. Мы будем использовать разовую загрузку с CD-носителя и установим параметр -NeedOnceв значение $true. Выбираем источник загрузки:

Set-BootSource -ServerSystem $system -BootSource CD -BootMode UEFI -NeedOnce:$true

Источник загрузки мы указали, но пока в нем не смонтирован образ. Для монтирования используем командлет Mount-VirtualMediaуказав путь до образа -ImageUri и тип -MediaType:

$vm = Get-VirtualMedia -Manager $manager -Id USB1
Mount-VirtualMedia -VirtualMedia $vm -ImageUri nfs://10.123.18.45/infra/iso/Ubuntu/ubuntu-22.04.3-live-server-amd64.iso -MediaType CD -ReadOnly:$true

Осталось выполнить выключение (Stop-Server) / включение (Start-Server) или перегрузку сервера (Restart-Server) и переходить к работе с операционной системой.

Заключение

Итак, мы централизованно, используя командную строку, проверили нескольких серверов, обнаружили проблемные и выполнили базовые настройки оставшихся серверов. Модуль PowerShell с набором командлетов сэкономил нам время на проверку конфигурации, журналов событий и настройку серверов. Также он позволяет создавать сценарии автоматизации под различные задачи — например, первичную конфигурацию или аудит текущих настроек и приведение в соответствие (compliance).

Сценарий, который я описал в статье, не охватывает весь функционал модуля. Если вас заинтересовали его возможности, предлагаю изучить документацию в архиве — уверен, каждый найдет практическое применение модулю. 

Как я писал выше, работа модуля не ограничена только серверами производства YADRO.  Но предупрежу, что некоторые командлеты могут работать некорректно со сторонними серверами. Мы не тестировали модуль на всех доступных на рынке серверных платформах. 

Оставлю ссылку на скачиваемый модуль для PowerShell и документацию еще раз. Надеюсь, решение вам понравится и поможет ускорить и автоматизировать настройку серверов. Буду рад любой обратной связи, которая позволить сделать его лучше.

Комментарии (14)


  1. exchange12rocks
    09.05.2024 10:30

    Гайз, добавьте свой префикс ко всем командлетам - слишком общие у них названия - так нельзя

    Вот прям пересечение с first-party командлетом: https://learn.microsoft.com/en-us/powershell/module/dnsserver/set-dnsserver


    1. KoS-Olyunin Автор
      09.05.2024 10:30
      +1

      Да, Вы правы. Стоило указать как импортировать модуль с префиксом и как задать префикс в манифесте. Добавим в статью. Спасибо.


      1. exchange12rocks
        09.05.2024 10:30

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


        1. KoS-Olyunin Автор
          09.05.2024 10:30

          На самом деле, это вопрос достаточно открытый. Пересечения по именованию командлетов вполне нормальная ситуация, поэтому при импорте модуля поддерживается указание префикса, если это необходимо, и в целом допускает правку манифеста, правда это конечно накладывает дополнительные неудобства, например в случае обновления версии. При использовании ОС Windows, вероятность конфликта действительно выше, ввиду достаточно обширного функционала, поставляемого вместе с ОС. К примеру, VMware PowerCLI в некоторых командлетах кофликтует с функционалом, поставляемым в Windows для управления Hyper-V.


          1. Busla
            09.05.2024 10:30

            Вы на PowerShell только для клиентов пишите, сами его не используете? — явный импорт 12 лет как не нужен:

            Beginning in Windows PowerShell 3.0, modules are imported automatically when any cmdlet or function in the module is used in a command.

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

            Т.к. пользователи будут каждый свой префикс придумывать, нагуглить примеры, решение проблем будет почти невозможно.


            1. KoS-Olyunin Автор
              09.05.2024 10:30

              Почему, используем. Для того, чтобы модуль импортировался автоматически, его нужно положить в директорию, которая указана в PSModulePath. В этом случае, конечно либо нужно указание префикса в манифесте, либо в случае конфликтной ситуации, использовать командлет с явным указанием модуля, например 'Yadro.Automation.Server\Set-DnsServer'.
              Мы Вам очень благодарны за обратную связь, мы обязательно выложим версию с префиксом и обновим документацию.


              1. Busla
                09.05.2024 10:30

                Спасибо.

                Расскажите, пожалуйста, если у вас есть опыт, компетенции в PowerShell, то почему решили сделать модуль бинарным, а не на том же PowerShell написали? Хотя бы верхнеуровневую реализацию командлетов? - и ваши наработки бы остались закрытыми и пользователям было бы проще разобраться, что происходит, добавить алиасы и проверки параметрам. Потом вернуть это вам в виде пул-реквеста.


                1. KoS-Olyunin Автор
                  09.05.2024 10:30

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


          1. exchange12rocks
            09.05.2024 10:30

            К примеру, VMware PowerCLI в некоторых командлетах кофликтует с функционалом, поставляемым в Windows для управления Hyper-V.

            Это не значит, что они правы и надо повторять за ними.


            1. KoS-Olyunin Автор
              09.05.2024 10:30

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


    1. exchange12rocks
      09.05.2024 10:30

      Find-ServerSystems: в параметры, принимающие на вход IP-адреса, лучше принимать объекты типа [ipaddress]

      Для получения информации в табличном формате используйте алиас командлета Format-Table — ft

      Такая фраза подразумевает, что только ft можно использовать, а Format-Table - нельзя

      Connect-Server: Почему вы назвали параметр ManagementAddress? В PowerShell принято называть его ComputerName. Также этот командлет появляется в примерах раньше, чем его полное описание.

      Get-Connection: ClientOriginAddress Тип установленной операционной системы <- тут кажется напутали что-то

      Disconnect-Server - отсутствует параметр -Force - лучше добавить его для скриптов

      Get-System: "if ($_.IsPoweredOn) { return "Включен" } else { "Выключен" }" <- зачем тут return?

      Get-Memory: $_.ErrorCorrection -notlike "NoECC" <- либо забыли звёздочку, либо неправильный оператор сравнения

      Get-ChassisPowerVoltages: "множественное число" в существительном

      Restart-Manager: почему-то у этого командлета в документации появляются [-PassThru] [-WhatIf] [-Confirm], а у остальных их нет

      Set-MananagerNetworkProtocol: [-IsEnabled] - почему тут тип bool, а не -Enabled типа switch?


      1. KoS-Olyunin Автор
        09.05.2024 10:30

        Find-ServerSystems: в параметры, принимающие на вход IP-адреса, лучше принимать объекты типа [ipaddress]

        Вы имеете ввиду тип System.Net.IPAddress? Думаю не стоит лишать пользователей возможностей передавать IP-адреса как строки, но думаю Вы правы и можно добавить отдельный Parameter Set который будет принимать параметры типа IPAddress.

        Connect-Server: Почему вы назвали параметр ManagementAddress? В PowerShell принято называть его ComputerName. Также этот командлет появляется в примерах раньше, чем его полное описание.

        Из практики, я встречал разные варианты именования параметров подключения к удаленному узлу. ComputerName использует в своих командлетах Microsoft. При разработке мы старались именовать параметры так, что бы имена были говорящими и отражали назначение параметра. Я не исключаю, что такие рекомендации существуют, не могли бы Вы поделится ссылкой?

        Get-Connection: ClientOriginAddress Тип установленной операционной системы <- тут кажется напутали что-то

        Спасибо большое за Вашу внимательность, тут действительно ошибка. "Тип установленной операционной системы" - это из другого PowerShell модуля.

        Disconnect-Server - отсутствует параметр -Force - лучше добавить его для скриптов

        В скриптах можно использовать -Confirm:$false, но в документации этот параметр не описан, это наше упущение, проведем повторное детальное ревью и внесем исправления.

        Get-System: "if ($_.IsPoweredOn) { return "Включен" } else { "Выключен" }" <- зачем тут return?

        Согласен, исправим. Спасибо.

        Get-Memory: $_.ErrorCorrection -notlike "NoECC" <- либо забыли звёздочку, либо неправильный оператор сравнения

        Забыли звездочку, исправим. Спасибо.

        Get-ChassisPowerVoltages: "множественное число" в существительном

        Согласен, исправим. Спасибо.

        Restart-Manager: почему-то у этого командлета в документации появляются [-PassThru] [-WhatIf] [-Confirm], а у остальных их нет

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

        Set-MananagerNetworkProtocol: [-IsEnabled] - почему тут тип bool, а не -Enabled типа switch?

        Вы правы, там должен быть switch и это не единственный командлет, где в описании параметров допущена эта ошибка. Все исправим.

        Еще раз спасибо Вам за внимательное чтение документации и что указали нам на все ошибки и недочеты.


  1. Busla
    09.05.2024 10:30

    Find-ServerSystems
    Connect-Server
    Get-Connection
    Disconnect-Server

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

    New-Account

    1. от командлетов New- ждут, что они вернут объект. У вас он молчаливый. Лучше тогда переделать его на Add-

    2. параметр Password не должен быть string, правильнее будет пару параметров Username и Password заменить на Credential

    3. присоединяюсь к вопросу @exchange12rocks: почему -IsEnabled типа bool, а не -Enabled типа switch? Да и то же касается всех прочих bool.

    4. состояние Enable традиционно управляется отдельными командлетами. Было бы неплохо добавить Enable-Account и Disable-Account

    Измените порт:
    PS> Set-RemoteLoggingServer -Manager $manager -Address 1.10.1.11 -Port 3034
    Пример вывода:

    Succeed
    -------
    True

    Зачем этот вывод? — его потом приходится принудительно заглушать. При ошибке должно сформироваться исключение. При успехе должна быть "тишина". То же самое с Start-System и Restart-System

    Судя по документации Set-HttpsCertificate и Add-HttpsCertificate делают одно и то же — задают единственный сертификат web-интерфейса. Или первый раз нужно делать только Add, а потом только Set?

    -PassThru
    Запрашивает выходные данные, если по умолчанию командлет их не выводит.

    не запрашивает (интерактивно у пользователя), а возвращает изменённый объект

    -AccountService
    Учетная запись сервиса. Принимает на вход результат выполнения командлета Get-AccountService (стр. 52).

    а не наоборот: учётная запись сервиса — Service Account ?

    Если

    Командлет Get-VirtualMedia возвращает информацию о подключенных виртуальных носителях.

    а

    Командлет Mount-VirtualMedia подключает виртуальный носитель информации.

    то зачем у командлета Mount-VirtualMedia параметр

    -VirtualMedia
    Подключаемый виртуальный носитель информации. Принимает на вход результат выполнения командлета Get-VirtualMedia

    зачем подключать (монтировать) уже смонтированное?

    -DnsServers
    Настраиваемый клиент DNS-сервера.

    наверное всё же «список DNS-серверов»?

    В документации в примерах кода три типа кавычек: одинарные, двойные и типографские. Во всех ваших примерах должны быть только одинарные.


    1. exchange12rocks
      09.05.2024 10:30

      ++