Иногда или очень часто администраторам 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().