ESXCLI через PowerCLI

Иногда или очень часто администраторам vSphere приходиться использовать для тех или иных задач инструмент командной строки в ESXi –  утилиту esxcli. Обычно админу приходиться коннектится к хосту по SSH и набивать команду за командой или копировать их из блокнота, но все это в пределах одного хоста. Не автоматизировенько… К счастью мы можем использовать для нашей автоматизации инструмент PowerCLI, об установке которого я писал тут.

Можно конечно использовать PowerShell или другой какой ни будь механизм автоматизации, чтобы подключаться к набору хостов через SSH и запускать скрипт блоки. Но это достаточно громоздко, небезопасно и мы лишены возможности обрабатывать ошибки при исполнении команд esxcli.

Итак, PowerCLI. Почему и как? У PowerCLI присутствуют функции и командлет для задействования esxcli на хосте. Это происходит через вэб службы и никакой SSH или DCUI нам для этого не нужен. Для того что бы нам воспользоваться функцией esxcli сначала нужно выгрузить объект esxcli (Имеется ввиду объекта в среде PowerShell, если Вам это ни о чем ни говорит, то и не заморачивайтесь) в переменную:

$esxcli=get-esxcli -vmhost '<ESXi Name>'

С помощью, которой мы можем потом вызывать различные команды, например:

$esxcli.storage.nmp.device.list.Invoke()

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

Как и в классическом esxcli, мы можем с помощью этой переменной и ее дочерних объектов перечислять доступные namaspaces на нужном нам уровне.

PS C:\Users\user\Desktop> $esxcli.storage.core.device

=====================
EsxCliElement: device

   Elements:
   ---------
   capacity
   detached
   inquirycache
   latencythreshold
   partition
   physical
   raid
   smart
   stats
   uidmap
   vaai
   world


   Method Elements:
   ---------
   list
   purge
   set
   setconfig


   Methods:
   --------
   string Help() 

Видим похожий вывод как на классическом esxcli. Но в отличии от ванили тут происходит разделение namespaces (Elements) и подкоманд (Method Elements), а также у нас появились Methods. Что бы подкоманды (типа set, get, list) заработали, нужно добавить к ним Metods. Например, Invoke() приводит команду в действие и выдает результат, а Help() выдает обычную справку по namespace или команде.

$esxcli.storage.core.device.list.Invoke()

C list, get все понятно, а что у нас с командами, которые конфигурацию задают и требуют какие либо аргументы на вход? Тут все не так просто. Нам нужно во-первых определить какие аргументы нужно указать. Для этого мы можем использовать функцию CreateArgs().

PS C:\Users\user\Desktop> $esxcli.system.coredump.network.set.CreateArgs()

Name                           Value                                                         
----                           -----                                                         
interfacename                  Unset, ([string], optional)                                   
serveripv4                     Unset, ([string], optional)                                   
serverport                     Unset, ([long], optional)                                     
serverip                       Unset, ([string], optional)                                   
enable                         Unset, ([boolean], optional)                                   

Затем создаем переменную, содержащую объекты аргументов, заполняем их и передаем переменную в качестве аргумента на исполнение.

$arguments=$esxcli.system.coredump.network.set.CreateArgs()
$arguments.interfacename='vmk0'
$arguments.serverip='192.168.11.148'
$arguments.serverport='6500' 
$esxcli.system.coredump.network.set.Invoke($arguments) 

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

$esxcli.system.coredump.network.set.Invoke(@{interfacename = 'vmk0'; serveripv4 = '192.168.11.148'; serverport = '6500'}) 

Эта команда, как и команды из предыдущего примера делают фактически одно и тоже.

Стоит упомянуть что esxcli через PowerCLI работал так не всегда. До этого в прошлой версии – v1, которая уже устарела и не используется на новых версиях ESXi (сейчас мы используем v2) было все немного по другому и нам приходилось перечислять все аргументы в строго заданном порядке (который без нормальной статьи и не угадаешь), в скобках но зато не было необходимости добавлять функцию Invoke().