Записи с темой: Scripting (3)
We rise up for the things we believe in over and over again

Даже не знаю, с чего начать. Наверное, с начала.
По роду своей деятельности возникает нужда массовой замены паролей от интерфейсов управления серверного хозяйства. Политики безопасности, все дела, никуда от этого не денешься. И чем дальше, тем более это хозяйство обширное. Но не только по числу севреров, но и по количеству вендоров. Когда серверов штук пять-десять - зайти на каждый из них да поменять пароль от учетки не шибко сложно. Когда их пара-тройка десятков, уже напряжно, но тоже терпимо (сквозь сжатые зубы). Когда число переваливает за сотню - это уже ни в какие ворота. И ладно, если еще ты знаешь, когда очередной дедлайн, можно распланировать. А если задачу спускают внезапно со вполне себе официальным "это должно быть сделано вчера" - волей неволей задумаешься хоть о какой-нибудь, но автоматизации. Вот и в этот раз.

Я уже не помню, чем меня взбесил стандартный инструмент под названием ipmitool, но тогда я пришел к выводу, что это совершенно неюзабельная шляпа. И пришлось колхозить связку Powershell + Rest API. Этот подход работал, пока вендор был один. Когда их число начало увеличиваться, начало увеличиваться и количество скриптов, потому что каждый вендор ваяет свою версию OpenBMC, перекраивая форматы запросов и ответов под себя. В итоге текущий подход меня перестал удовлетворять от слова совсем, и я снова пришел к изначальному вопросу - как это автоматизировать. И снова таки вернулся к ipmitool.

В этой итерации в общем и целом все получилось. Алгоритм набросал, осталось только выбрать, на чем его реализовывать. И вариантов, как ни странно, аж целых несколько, и продиктовано их наличие некоторыми вводными.
1. Можем взять... bash. Внезапно, да. В целом это даже полезно, но загвоздка в том, что не всюду есть возможность дотянуться со своей станции управления под никсами. А туда, куда можно дотянуться, сделать это можно только из под виндов. Да, постепенно отмирает и винда, но пока еще живет. И ускорить этот процесс не в моих силах.
2. Можем взять... cmd. Тоже внезапно. Этот курилка есть гарантировано везде, где мне приходится работать.
3. Можем взять... да-да, название записи говорит обо всем - старую добрую "мощную ракушку".

И на этот раз я решил пойти немного более заковыристым путем - реализовать алгоритм смены пароля через ipmitool во всех перечисленных оболочках. Что тут сказать, результаты меня удивили. ОЧЕНЬ удивили.

Начнем с того, что нужный скрипт на баше, который я не перевариваю, был написан где-то минут за 20. Повторю - я ненавижу баш. Ну да ладно, написал, и написал, нужно идти дальше. Берем в руки cmd и блонот, и... мама мия. Я баш не любил, да? Как вам такое, Илоны вы наши Маски:

- блджад. В зависимости от того, где была объявлена переменная, вызывается в скрипте она ТРЕМЯ разными способами... Это ж просто азаза...
- ?
­ если объявлена просто в плоском скрипте:
set var=byaka
echo %var%
byaka
­- Угу.
­- если объявлена в FOR как переменная цикла:
FOR /F "tokens=1" %%I... (
echo I
)
- echo %%I ?
- да, забыл проценты набрать. Если же переменная объявлена внутри FOR:
set c=ipmitool -H %%I...
echo !c!

И да, в этом случае еще и специальную инструкцию не забудь про SETLOCAL EnableDelayedExpansion, про который я, к своему стыду, вообще только сегодня узнал. Твою ж налево, а... Но ладно, с грехом пополам, незнамо сколько кружками зеленого чая (кофемашина сломалась, живо напомнив мне 4-ю книгу цикла Экспансия, кто знает, тот знает) и огромного количества матов в голове и эту реализацию удалось допилить до логического конца.

Осталась ракушка. И черт побери, тут я могу лишь вспомнить слова, подсмотренные в сети, используемые в достаточно пикантной ситуации: Light has failed me. В том плане, что чертова ракушка, служившая мне верой и правдой, столько лет, и дававшая приют и защиту от всякого скриптописательного, разлетелась вдребезги.

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

Иии... это не работает. Переменная с паролем все равно раскрывается черт знает во что. Несмотря на использовании нужных кавычек во время ее определения. Но где тогда идет раскрытие? Да, как оказалось, прямо в строке Invoke-expression и идет, там ведь как раз стоят двойные, и без них никуда.

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

Такой вариант вполне себе прокатывает, но поскольку скриптом буду пользоваться не я один, кто-нибудь определенно забудет про эти экраны. Будет плохо.
Второй вариант - вывести все переменные, которые касаются паролей (а их будет две - старый и новый пароли) из кавычек вообще. Пришлось нагородить примерно такое:

И вот этот вариант уже не требует никакой доработки напильником.

Что ж, в итоге все равно остановился на Powershell-варианте, но реализации на cmd и баше лежат под рукой. На всякий случай.

@музыка: L'Avenue - Sundown

@темы: Этот безумный мир, PowerShell, Scripting

We rise up for the things we believe in over and over again

В рамках миграции данных с одной СХД на другую понадобилось мигрировать и разделы с репликами DPM. В самом DPM есть средства миграции, и они даже работают, но как я уже говорил - DPM = problem, поэтому надо бы как-то проконтролировать, а действительно ли все тома с данными переехали куда надо. Казалось бы, что может быть проще - открыть Disk Manager, да посмотреть, какой том на каком диске. Не в этот раз - DPM плодит тома самостоятельно, и их столько, что проверять это все в рукопашную рехнешься.
Что делать? Нужно как-то получить список вида VolumeID - DiskID. Встроенные средства Win2012 просто так это сделать не позволят, но есть интересная утилитка от SysInternals под названием DiskExt, которая и выдает нужные нам данные. Одна беда - вывод ее является голым текстом, который еще надо будет парсить. Кусок этого вывода ниже:


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


Как это всё безобразие работает?

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

Отдельного упоминания заслуживает блок Extents. Каждый том может располагаться далеко не на одном диске, поэтому внутри блока в цикле нужно будет перебрать каждый кусок тома и выписать оттуда, на каком диске он размещен.

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

@музыка: Ronan Hardiman - Breakout

@темы: PowerShell, Scripting, DPM

10:34

Python + TG

We rise up for the things we believe in over and over again
Интереса ради запилил себе скрипт на Путоне, который будет вызывать на удаленном сервере программку vnstat, которая уже в свою очередь подсчитает, сколько трафика через сервер прошло. Скрипт это дело всосет и отправит мне в телегу.



Черт побери, насколько же Путон для меня непривычен.
Как я уже отвык от того, что переменные указываются сразу по имени без спец.символа: varname вместо $varname
Каким неудобным кажется разный формат включения переменных в строку в зависимости от того, где эта строка - в операторе вывода или в присвоении значения.

В общем, привыкать и привыкать...

@темы: Scripting