🏠: работа

Что сделал - 5

Скрипт поиска несмонтированных виртуальных дисков Hyper-V

Обычная история — создаются какие-то тестовые виртуальные машины и вскоре удаляются, или делаются какие-то копии дисков, зачастую в большой спешке, а потом всё это забывается и неизвестно где лежит, и за годы накапливается куча хлама, которую верные сервера надёжно хранят, а люди удивляются — куда же подевалось всё место на дисках?

Алгоритм работы: берутся все виртуальные машины всех хостов, для каждой выводится список дисков (.vhd и .vhdx), если там вместо диска снапшот, то ищется родительский диск (там другое свойство), и результаты заносятся в один массив. Затем ищутся файлы с теми же расширениями на локальных дисках серверов, результаты заносятся в другой массив. Потом массивы сравниваются — отбрасываются значения первого массива, т. е., смонтированные диски, а потом сортируются по уникальным значениям — дело в том, что если хосты принадлежат кластеру и подключены к одной дисковой полке, то и результаты у них будут практически одинаковые. Ну, а дальше из этого делается красивая табличка, подсчитывается общий итог, генерируются команды на удаление и всё высылается на почту. Выглядит это примерно так:

# Команды на удаление
del "D:\VM\disk_c.vhdx" -Force -Confirm:$false
del "L:\vm\vmws-sccm\sccm2.vhdx" -Force -Confirm:$false
del "L:\vm\vmws-dns\Virtual Hard Disks\vmws-dns.vhdx" -Force -Confirm:$false
del "L:\back\vmls-web\vmls-web_Disk0.vhdx" -Force -Confirm:$false
del "L:\vm\vmws-sccm\sccm_c.vhdx" -Force -Confirm:$false

Пока я писал скрипт и скрипел мозгами, как получше реализовать ту или иную операцию, обнаружил прекрасную вещь. Классический подход работы с несколькими удалёнными машинами — когда комп-инициатор, на котором работает скрипт, сам их последовательно опрашивает, то есть, в единицу времени обрабатывается только один удалённый хост. Работает это всё медленно и печально. Но есть способ получше:

$hosts = "hv01","hv02","hv03","hv04","hv05"
$allvhds = Invoke-Command -computername $hosts -command {
dir ((gcim Win32_LogicalDisk -filter "drivetype=3").DeviceID -replace "$","\") -Include *.vhd,*.vhdx -Recurse -ErrorAction SilentlyContinue
}

Здесь инициатор просто даёт команду всем удалённым хостам, а потом просто ждёт, когда они завершат работу, и результаты падают в массив по мере их поступления. Работает во столько раз быстрее, сколько хостов участвует. Там есть нюансы — стандартно может работать до 32 потоков одновременно, но это настраивается, да и редко нужно.

Результат работы скрипта — нашлось 49 бесхозных дисков общим объёмом немногим менее 4 терабайт.

Скрипт создания папки на файловом ресурсе

Так как структура довольно сложная и каждый раз муторно руками создавать группы, делать вложенность их друг в друга, да и напортачить легко, поэтому тут автоматизация прямо-таки напрашивается. Работает так: вводишь путь к новой папке, а скрипт сам ищет уровень этой папки, родительский каталог и его группы, и выдаёт данные на проверку. Проверяешь, и если всё в порядке, одобряешь и дальше всё делается само — создаётся сама папка, группы, вложенность и раздаются права. Красота невероятная.

Конвертация виртуальных дисков VMWare (.vmdk) в Hyper-V (.vhdx)

Последний месяц плотно занимался перетаскиванием виртуальных машин со старой VMWare ESXi 5.5 на модный молодёжный Hyper-V 2016. Есть прекрасная программа под названием Microsoft Virtual Machine Converter, которая хорошо выполняет эту функцию. Но иногда виртуальные машины были уже выгружены в виде набора файлов, и нужно было просто переконвертировать диск. Оказалось, что этот конвертер имеет в своём составе модуль для Powershell, и всё заверте…

# импортировать модуль
Import-Module 'C:\Program Files\Microsoft Virtual Machine Converter\MvmcCmdlet.psd1'
# конвертировать
ConvertTo-MvmcVirtualHardDisk -SourceLiteralPath C:\temp\disk.vmdk -DestinationLiteralPath 'C:\temp' -VhdType DynamicHardDisk -VhdFormat Vhdx

И последняя на сегодня забавная история.

Прошивка дисковой полки HP P2000 G3 FC

Великая и ужасная компания Хьюлет-Паккард выпускает (или выпускала) широко известные в узких кругах дисковые полки P2000. После того, как я перенёс все виртуальные машины со старой VMWare, эта полка освободилась, и там нужно было в одном контроллере заменить сбойную флеш-карту и всячески её обновить. С обновлением возникли проблемы, потому что без наличия сервисного контракта Хьюлет-Паккард скачать свежую прошивку со своего сайта не даёт.

Начал поиск в интернетах — и обнаружилось, что эта полка — перемаркированная DotHill AssuredSAN 3000 series, и компания Дотхилл, её выпускавшая, впоследствии была поглощена компанией Сигейт, у которой эти прошивки свободно доступны на сайте. Я скачал прошивку с сайта Сигейта, и она без проблем установилась и работает.

Больше того — у Сигейта есть прошивка новее, чем последняя версия на Хьюлет-Паккарде, но я не стал бежать впереди паровоза и прошил то, что числилось последним на родном сайте.

Всем хорошего дня, не переключайтесь, продолжим после короткой рекламы.

Что сделал - 4

Мониторинг датчиков в серверной

Сделал вот такую красоту:

Скрипт в виде опросника, создающий пользователя в домене

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

Скрипт, разбирающий список IP-адресов, перечисленных через пробел

Затем для каждого выясняется имя сопоставленного этому адресу компьютера и ФИО пользователя (благо, ФИО последнего вошедшего пользователя уже забито другим периодически выполняющимся скриптом в описание компьютера). Оказалось, что в Powershell есть прекрасная команда Resolve-DNSName, позволяющая больше не пользоваться старым nslookup.

Сходил поучился

Zabbix-certificate-exam.jpg
Zabbix-certificate-training.jpg

В конце рабочей недели настроил мониторинг MySQL на всех серверах, где он установлен.

Что сделал - 3

Навёл порядок в серверной

Красота.

Ежемесячный отчёт по «домашним» каталогам пользователей

В табличке выводятся: имя каталога, ФИО владельца (при наличии учётки в AD с одноимённым логином), размер каталога в мегабайтах, статус пользователя (ОК, disabled, no such user), самая новая дата изменения файла в каталоге, разница в днях с текущей датой. В письме, куда вкладывается таблица, подсчитывается количество каталогов активных пользователей, количество каталогов отсутствующих и отключённых пользователей, общее количество каталогов; также выводятся общие размеры каталогов по этим категориям в гигабайтах.

Научился подсчитывать время выполнения скрипта, очень удобно:

$timer = [system.diagnostics.stopwatch]::StartNew()
[math]::round(($timer.Elapsed.TotalSeconds),2)

Перевёл на русский язык интерфейс плагина Nextcloud Outlook Add-in

Перевёл и выслал перевод разработчикам, они обещали включить его в следующую версию.

Что сделал на этой неделе - 2

Пока есть что-то новое и интересное помимо рутины, продолжаю.

Доделал систему прав на каталоги

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

Отчёт по почтовым ящикам — размеры и квоты

Оказалось, что со старых времён у многих ящиков стояли индивидуальные квоты всего в 100 и 200 МБ (запрет отправки), причём, это не имело значения, так как у ящиков стояло наследование от базы данных, а там-то всё выставлено нормально. Чтобы не путаться, убрал эти ничего не значащие квоты, сделал еженедельный отчёт.

Отчёт по антивирусу и антиспаму для пограничного почтового сервера

Примерно месяц назад я обновил Exchange Edge 2010 на самую новую версию, также там стоял Kaspersky for Exchange 9.0 MR2, причём Каспер умеет слать статистику почему-то только через протокол EWS, который в организации отключён. На днях я вычитал в справке по Касперу, что у него есть модуль для Powershell, который умеет выводить статистические данные в консоли, и, естественно, я сразу решил сделать отчёт именно через этот механизм. Оказалось, что в имеющейся версии MR2 команды, указанные в справке, не работают, но на сайте есть новая версия MR5, которую я вечерком из дома и установил, после чего всё пошло как по маслу — теперь имеется еженедельный отчёт по антивирусу и антиспаму на пограничном сервере. Заодно сделал в том же скрипте отдельное письмо, которое указывает на близкий срок окончания лицензии, т. к. одна из команд показывает статус самого сервера.

Статистика количества отправленных и полученных извне писем

В каждой конторе свои особенности, в данном случае иногда бывают запросы от начальства на количество писем от тех или иных сотрудников. Это бывает редко, но чтобы не возвращаться к этой теме в срочном режиме в будущем, сделал и этот отчёт — выполняется по первым числам за предыдущий месяц. Попутно пришлось придумать, как собирать местные адреса — ведь сервер Exchange Edge не в домене и ничего про внутренних пользователей не знает. В результате список адресов я брал из тех же трекинг-логов, сортируя их по наличию местного домена и уникальности. Заодно прокачал работу с датами — как получить 0:00:00 первого числа предыдущего месяца и 23:59:59 последнего дня предыдущего месяца, а в отчёте по антивирусу — то же самое, только с прошлой неделей.

Также, в связи с тем, что я закончил настройку системы управления проектами Redmine и она вошла в более-менее полноценный рабочий режим, теперь нужно записывать туда свою деятельность. Это ещё куда ни шло, но указывать также нужно и трудозатраты в часах, что, честно говоря, идея весьма сомнительная — как считать всю ту работу, которая сопутствует решению той или иной задачи? Практически всегда нужно много чего прочесть и изучить, прежде чем приниматься за непосредственное выполнение, так как систем много и все они разные.

Иногда мысли о решении приходят по дороге домой в вагоне метро, потому что я не могу выключить голову после выхода с работы, а продолжаю размышлять над задачей (может быть, у кого-то обнуляется буфер после пересечения входных ворот, но у меня нет). А порой приходишь домой и лезешь через VPN на работу, чтобы сразу проверить догадку, не упустить мысль. Это тоже включать в трудозатраты? Но тогда в день трудозатрат будет больше, чем рабочих часов. В общем, судя по всему, придётся писать что-то от фонаря, тем более, что я не сижу с таймером и не засекаю, сколько я потратил на задачу, и часто задач решаешь сразу несколько.

К тому же, само протоколирование своей деятельности занимает время, сегодня, например, я потратил около часа, так что же — вносить в трудозатраты «протоколирование трудозатрат»? Лучше уж заняться документированием в wiki, на мой вкус. Ладно, посмотрим.