Автоматизація завдань інженера

Як приклад, у нас буде кілька скриптів, що працюють з комутаторами Brocade. перший з них - буде генерувати конфіг зон, при додаванні нового пристрою в мережу SAN. Завдання в принципі проста, досить рутинна, але може займатися багато часу через необхідність створення великої кількості команд.

Вчинимо наступним чином – спочатку буде повний лістинг скрипту, а потім уже пояснюватимуть – як, що й навіщо. Знову ж таки - зверніть увагу, що це не готове, універсальне рішення. Але ви можете взяти його за основу для реалізації власних завдань.

Вихідник на Pastebin І так, почнемо з головного - що ж робить скрипт? Перед нами стоїть завдання – додати в нашу існуючу SAN мережу, новий пристрій. Це буде або сервер або СГД. Для того, щоб це зробити, в першу чергу нам потрібно отримати список вже наявних пристрій в SAN мережі. Залежно від типу пристрою, що додається, це будуть або сервери або СХД. Звичайно, буде дуже зручно, якщо у аліасів у вашому зонінгу є якісь загальні іменування, до яких можна приєднатися. Ось у плані серверів ми все просто ESXi_*, є ще кілька окремих серверів, але їм зонінг існує окремо, т.к. це не основні, а допоміжні сервери і не з усіма СГД вони пов'язані зонінгом. З СХД все набагато складніше, тому тут доведеться повозитися з фільтрацією + є дуже важливе завдання, для красивого іменування зон не просто взяти аліаси як вони є, а знайти серед них унікальні частини і прибрати все зайве. Але це я вже покажу на прикладі для більшої наочності.

І так, почнемо з самого початку і я розповім про додаткові модулі, які зазвичай використовую: argparse зручна річ, що дозволяєпрацювати з аргументами, що передаються скрипту. Не завжди я сам пам'ятаю всі ключі всіх своїх скриптів, тому help, що автоматично генерується, вкрай корисний.

інженера
OrderedDict у цьому прикладі буде використовуватися саме для «олюднення» аліасів СГД, для красивого іменування зонінгу. paramiko модуль, який я використовую у всіх своїх скриптах, який дозволяє зручно працювати з пристроями за протоколом ssh. re якщо ви маєте робити щось з відповідями на команди від обладнання - без регулярних виразів просто не обійтися.

Функції:connect - це обгортка для paramiko, для з'єднання з комутаторами.findHosts - функція створення списку аліасів хостів з комутатора. За допомогою функції connect вона підключається до комутатора, виконує команду alishow ESXi*, потім за допомогою регулярних виразів обробляє отриману від комутатора відповідь і ми отримуємо повний список аліасів хостів. Як я вже раніше говорив - добре, якщо ваші аліаси мають якусь загальну частину, що б це можна було легко описати логікою. Наступна функція пошуку аліасів СГД буде саме для тих, у кого такої логіки немає.findArrays - аналогічна функція, як і findHosts, тільки шукає не хости, а масиви. Як можна бачити, в даному випадку ми маємо список винятків (exception) для виключення всього непотрібного. Якби в назви наших масивів була якась логіка, наприклад stor_NetApp_8200, stor_fas2650 і т.д., автоматизувати було б простіше. Варто зважати на такі речі, якщо ви плануєте зонінг з нуля. Надалі ви сильно спростите собі життя.findCommon - це продовження функції findArrays. Як я вже казав, з аліасів виду Storwize_p1, Storwize_p2, FAS_8200_initiator1_0f, FAS_8200_initiator2_0f нам потрібновичленувати ім'я безпосередньо масивів, для того, щоб ми могли створювати читальні імена зон, типу ESXi01_3_NetApp_8200.

І так логіка роботи наступна. Викликаючи скрипт, ви в параметрах передаєте необхідні дані - тип пристрою, що додається (що б скрипт розуміти - зонінг для чого саме нам робити і які пристрої витягувати з комутаторів), ім'я (яке буде використовуватися при іменуванні зони), 2 аліасу, 2 WWNа (ми підключаємо і СХД і сервери по 2 портах, за рідкісним винятком.можна зробити і більше, а можна просто двічі запустити скрипт, якщо ви підключаєте СХД по 4 портах), номер фабрики (від цього залежить вибір комутатора. Поділ на 1 і 2 тут умовне , але ми пам'ятаємо, що FC фабрик у нас завжди має бути 2 - для стійкості до відмови) і ім'я конфігураційного файлу на комутаторі. Ось так це буде виглядати

завдань
На виході ми отримаємо тестовий файл, з усіма необхідними командами для створення зонінгу на комутаторі.

завдань
Приклад додавання СГД.
інженера
Приклад додавання сервера.

Насправді отримати просто конфіг, який необхідно вручну виконати на комутаторі не дуже цікаво. Тому вам я покажу як його можна доробити, для автоматичного комміту зони на комутатор. І так - ми отримали файл, ми його візуально про всяк випадок перевірили, можливо у нас є якісь речі, які нам потрібно поправити, після чого ми цей файл зберігаємо і хочемо, щоб він автоматично закомітівся на комутатор. Для цього нам наприкінці скрипту потрібно дописати такі речі:

Відповідно скрипт, при ствердній відповіді на запитання чи залити конфіг, прочитає файл з нашим конфігом (у тому числі і наші виправлення) і виконає послідовно кожну команду на комутаторі.

Приклад 3: Картапідключень Порою для звітності або для складання документації нам необхідно скласти карту підключень пристроїв до портів комутатора. Можна записувати їх відразу, можна довго зіставляти аліаси та WWN пристроїв. Але це не цікаво, простіше це автоматизувати.

Приклад 2 і 3 у мене реалізовані у вигляді єдиного скрипта (насправді він робить ще кілька функцій, але описувати все просто не бачу сенсу) і завдання загалом однакові, тільки для однієї з них нас цікавить конкретний порт на конкретному комутаторі, в в другому випадку нас цікавлять усі порти одного або декількох комутаторів фабрики.

Це працює дуже просто

буде
Пошук пристрою на порту. У цьому прикладі у нас порт транковий

інженера
Пошук всіх пристроїв на комутаторі

Набір додаткових модулів загалом той самий - для роботи з параметрами командного рядка, робота з ssh і регулярні вирази.

І так, на початку нам потрібно створити словник із нашими комутаторами, де ми вказуємо їх ip, логін, пароль та кількість портів. Останній параметр буде важливим, якщо у ваших комутаторів різна кількість портів, і скрипту потрібно знати - скільки портів опитувати, коли як аргумент до порту ми передаємо «all».

Функції:connect - як і в попередньому скрипті відповідає за підключення до комутатора за допомогою paramikofindali - власне цю команду ми і викликаємо, вона займається тим, що запускає дві інші функції для пошуку WWN на порту та його зіставлення з аліасом і потім виведенням інформації в консоль.findWWN - отримує курсор підключення до комутатора і шукає WWN на вказаному порту.findAlias - отримує курсор підключення до комутатора і шукає аліас переданого WWN.

за допомогою argparse знову створеноменюшка, яка генерує хелп

завдань

всі подальші IFи визначають, виходячи з переданих параметрів - на яких комутаторах необхідно виконувати команду. Цей скрипт, на відміну першого, вже можна назвати універсальним. Вам достатньо вказати свої комутатори у словнику та розбивках і він успішно працюватиме і у вашій інфраструктурі.

Сподіваюся цим невеликими прикладами, я показав, як можна зробити свої робочі будні трошки простіше.