Polytech-soft.com

ПК журнал
1 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Python для системного администратора

Python для системных администраторов

Автор перевода messerr, просто с кармой ему не повезло.

Введение

О модулях

Модуль – важное понятие в языке Python. По существу, модуль – это ресурс, который вы подключаете к программе, чтобы затем использовать его. Этот процесс можно сравнить с тем, что вы достанете из ящика лист бумаги и положите его на свой стол, подготовив тем самым к дальнейшему использованию. Модули подключаются при помощи команды import, которая присутствует в начале каждого примера. Модули доступны для связи с базами данных, сетевого программирования, сервисов операционных систем и сотен других полезных областей.

Заставим Python работать

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

Немного о примерах:

  • Каждый пример использует try: и except: с блоком кода внутри. Это осуществляет элементарную обработку ошибок. Python имеет обширную поддержку для обработки всех видов исключений, но, в рамках примеров этой статьи, я обошелся простой проверкой.
  • Эти примеры тестировались с помощью Python 2.5, запущенном на Linux® box, но они должны работать на любой Unix/Linux машине.

Вы несомненно задумаетесь об улучшении этих скриптов. Это хорошо! Натура Python-скриптов заключается в том, что они могут быть легко модифицированы и настроены без необходимости перекомпиляции.

Пример 1: Поиск файлов и отображение прав в дружественном формате

Первый пример (Листинг 1) осуществляет поиск файлов, в соответствии с шаблоном (который вводит пользователь) и выводит результат на экран вместе с правами доступа для каждого файла. Во-первых, вы можете подумать, что эта программа не делает ничего большего, чем вызов команды find; однако она отображает результаты особым образом и ваши варианты отображения этого расширенного поиска безграничны.
Скрипт по существу решает три задачи:

  1. Получает шаблон поиска от пользователя
  2. Выполняет поиск
  3. Показывает результаты пользователю

При написании скрипта постоянно задавайте себе вопрос, «Выполнение какой задачи данный код обеспечивает?» Задавая себе этот вопрос, вы повышаете внимание в вашей работе и ее эффективность.

Листинг 1. Поиск файлов и отображение результатов с правами доступа.

# -*- coding: utf-8 -*-
import stat, sys, os, string, commands
#Записываем в переменную шаблон поиска, введенный пользователем
try:
pattern = raw_input(«Введите шаблон поиска:n»)
#запускаем команду ‘find’ и присваиваем результат переменной
commandString = «find » + pattern
commandOutput = commands.getoutput(commandString)
findResults = string.split(commandOutput, «n»)
#выводим найденные файлы вместе с правами доступа
print «Файлы:»
print commandOutput
print «================================»
for file in findResults:
mode=stat.S_IMODE(os.lstat(file)[stat.ST_MODE])
print «nPermissions for file «, file, «:»
for level in «USR», «GRP», «OTH»:
for perm in «R», «W», «X»:
if mode & getattr(stat,»S_I»+perm+level):
print level, » имеет «, perm, » права доступа»
else:
print level, » не имеет «, perm, » прав доступа»
except:
print «Возникла проблема! Проверьте сообщение выше.»

Программа следует по следующим этапам:

  1. Запрашивает у пользователя шаблон поиска (строки 7-9).
  2. Печатает список найденных файлов (строки 12-14).
  3. Используя модуль stat, получает права доступа для каждого найденного файла и отображает их на экране (строки 15-23).

Результат работы программы показан в Листинге 2.

$ python example1.py
Enter the file pattern to search for:
j*.py

Листинг 2. Вывод первого примера

$ python example1.py
Введите шаблон поиска:
j*.py
Файлы:
jim.py
jim2.py

================================
Permissions for file jim.py :
USR имеет R права доступа
USR имеет W права доступа
USR не имеет X прав доступа
GRP имеет R права доступа
GRP не имеет W прав доступа
GRP не имеет X прав доступа
OTH имеет R права доступа
OTH не имеет W прав доступа
OTH не имеет X прав доступа
Permissions for file jim2.py :
USR имеет R права доступа
USR имеет W права доступа
USR не имеет X прав доступа
GRP имеет R права доступа
GRP не имеет W прав доступа
GRP не имеет X прав доступа
OTH имеет R права доступа
OTH не имеет W прав доступа
OTH не имеет X прав доступа

Пример 2: Выполнение операций с архивом tar при помощи меню

Предыдущий пример для своей работы запрашивал у пользователя поисковый шаблон. Другой способ получить от пользователя информацию — аргумент в командной строке. Программа в Листинге 3 показывает как сделать это в Python: код берет имя файла tar, как аргумент командной строки и затем предложит пользователю несколько опций. Этот пример так же показывает новый способ решения проблемы. Первый пример использовал модуль команд для запуска find и захвата вывода. Этот подход можно назвать неуклюжим и не очень «питоновским». Этот пример использует для открытия tar файла модуль tarfile, преимущество которого в том, что он позволяет Вам использовать атрибуты и методы Python при манипуляции с файлами. При помощи многих модулей Python, вы можете делать вещи, недоступные через командную строку. Этой хороший пример использования меню в Python. Программа выполняет различные действия в зависимости от вашего выбора:

  • Если вы нажмете 1, программа предложит выбрать файл в архиве для извлечения в текущую директорию и затем извлечет файл.
  • Если вы нажмете 2, программа предложит выбрать файл и затем покажет информацию о нем.
  • Если вы нажмете 3, программа выведет список всех файлов в архиве.

Листинг 3. Выполнение операций с архивом tar при помощи меню

# -*- coding: utf-8 -*-
import tarfile, sys
try:
#открываем tar-файл
tar = tarfile.open(sys.argv[1], «r:tar»)
#выводим меню и сохраняем выбор
selection = raw_input(«Введитеn
1 чтобы извлечь файлn
2 чтобы вывести информацию о файле в архивеn
3 чтобы показать все файлы в архивеnn»)
#выполняем действия, основанные на выборе
if selection == «1»:
filename = raw_input(«введите имя файла для извлечения: «)
tar.extract(filename)
elif selection == «2»:
filename = raw_input(«введите имя файла для просмотра: «)
for tarinfo in tar:
if tarinfo.name == filename:
print «n
Имя файла:tt», tarinfo.name, «n
Размер:tt», tarinfo.size, «байтn»
elif selection == «3»:
print tar.list(verbose=True)
except:
print «При выполнении программы возникла проблема!»

Программа следует по следующим этапам:

  1. Открывает tar файл (строка 5).
  2. Выводит на экран меню и получает выбор пользователя (строки 8-11).
  3. Если вы нажали 1 (строки 14-16), извлекает файл из архива.
  4. Если вы нажали 2 (строки 17-23), предоставляет информацию о выбранном файле.
  5. Если вы нажали 3 (строки 24-25), предоставляет информацию о всех файлах в архиве.

Результат работы программы показан в Листинге 4.

Листинг 4. Меню пользователя для второго примера

$ python example2.py jimstar.tar
Введите
1 чтобы извлечь файл
2 чтобы вывести информацию о файле в архиве
3 чтобы показать все файлы в архиве

Пример 3. Проверка запущенного процесса и отображение информации в дружественном представлении.

Одной из важнейших обязанностей системного администратора является проверка запущенных процессов. Скрипт в Листинге 5 даст вам несколько идей. Программа использует преимущества возможностей Unix: команда grep использует вывод, генерированный другой командой. Это позволит вам уменьшить объем данных, которые в дальнейшем будет анализировать Python.
Программа так же использует модуль string. Изучите этот модуль — вы будете часто его использовать.

Листинг 5. Отображение информации о запущенном процессе в дружественном представлении

# -*- coding: utf-8 -*-
import commands, os, string
program = raw_input(«Введите имя программы для проверки: «)
try:
#выполняем команду ‘ps’ и присваиваем результат списку
output = commands.getoutput(«ps -f|grep » + program)
proginfo = string.split(output)
#выводим результат
print «n
Путь:tt», proginfo[5], «n
Владелец:ttt», proginfo[0], «n
ID процесса:tt», proginfo[1], «n
ID родительского процесса:t», proginfo[2], «n
Время запуска:tt», proginfo[4]
except:
print «При выполнении программы возникла проблема!»

Программа следует по следующим этапам:

  1. Получает имя процесса для проверки и присваивает его переменной (строка 3).
  2. Запускает команду ps и добавляет результат в список (строки 7-8).
  3. Выводит детальную информацию о процессе (строки 11-16).
  4. Результат работы программы показан в Листинге 6.

Листинг 6. Вывод третьего примера

$ python example3.py
Введите имя программы для проверки: xterm
Путь: pts/0
Владелец: goga
ID процесса: 26509
ID родительского процесса: 26493
Время запуска: 17:28

Пример 4. Проверка имен пользователей и паролей на соблюдение политики безопасности. Управление безопасностью важная часть работы для каждого системного администратора. Python делает эту работу проще, как показывает последний пример. Программа в Листинге 7 использует модуль pwd для доступа к базе данных паролей. Она проверяет имена пользователей и пароли на соблюдение политики безопасности (в данном случае, имена должны быть как минимум 6 символов в длину, пароли — 8 символов). Есть два предостережения:
Эта программа работает только если у вас есть полные права для доступа к /etc/passwd.
Если вы используете теневые пароли, скрипт работать не будет (однако, в Питон 2.5 есть модуль spwd, который решит эту проблему).

Читать еще:  Групповые политики локальный администратор

Листинг 7. Проверка имен пользователей и паролей на соблюдение политики безопасности

# -*- coding: utf-8 -*-
import pwd
#заводим счетчики
erroruser = []
errorpass = []
#получаем базу данных паролей
passwd_db = pwd.getpwall()
try:
#проверяем каждое имя пользователя и пароль на валидность
for entry in passwd_db:
username = entry[0]
password = entry [1]
if len(username)

Программа следует по следующим этапам:

  1. Инициализирует списки счетчиков (строки 4-5).
  2. Открывает базу данных паролей и записывает данные в список (строка 8).
  3. Проверяет имена пользователей и пароли на валидность (строки 12-18).
  4. Выводит имена и пароли, не соответствующие политике безопасности (строки 21-26).

Результат работы программы показан в Листинге 8.

Листинг 8. Вывод четвертого примера

$ python example4.py
Следующие пользователи имеют имена менее чем из 6 символов::
Guest
Следующие пользователи имеют пароли менее чем из 8 символов:
Guest
johnsmith
joewilson
suejones

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

  • Управление серверами: проверка патчей для конкретного приложения и их автоматическое обновление.
  • Журналирование: автоматическая отправка e-mail при появлении в логах особого вида ошибки.
  • Сеть: создание Telnet соединения к серверу и слежение за статусом соединения.

Тестирование web-приложений: использование свободно доступных инструментов для эмуляции веб-браузера и проверки веб-приложения на функциональность и производительность.
Это всего лишь несколько примеров — я уверен вы сможете добавить к ним свои собственные полезные идеи.

Python для системных администраторов

Эффективное управление серверами UNIX и Linux.

Гифт Н., Джонс Д. «Python в системном администрировании UNIX и Linux»Символ-Плюс, 2009 год, 512 стр. (6,37 мб. djvu + 4,13 мб. Source Code)

Книга показывает как можно эффективно использовать язык программирования Python для системных администраторов. Решать многие повседневные задачи управления серверами UNIX и Linux с его помощью. Все задачи разбиты по главам, где показаны примеры практического применения скриптов для резервного копирования данных, архивирования или созданию собственных инструментов командной строки, создание многозадачных приложений, разработки сценариев для выполнения запланированных задач.

Темы рассмотренные в книге: организация разделения процессов и информационное взаимодействие между ними с использованием сетевых протоколов и задач. Разработка интерактивных программ с графической оболочкой. Обработка обращений и взаимодействие с базами данных. Создание многозадачных приложений работающих с Google App Engine.

Кроме того, авторы книги создали доступную для загрузки и свободно распространяемую — VM (виртуальную машину на базе Ubuntu), включающую исходные тексты примеров из книги и способную выполнять примеры, использующие SNMP, IPython, SQLAlchemy и многие другие утилиты. Книга рассчитан на системных администраторов и программистов, начинающих осваивать язык Python.
ISBN 978-5-93286-149-3 ISBN 978-0-596-51582-9 (англ)

1. Введение 21
Почему Python 21
Мотивация 28
Основы 29
Выполнение инструкций в языке Python 30
Использование функций в языке Python 35
Повторное использование программного кода с помощью инструкции import 39

2. IPython 45
Установка IPython 46
Базовые понятия 48
Справка по специальным функциям 56
Командная оболочка UNIX 61
Сбор информации 81
Автоматизация и сокращения 95
В заключение 101

3. Текст 102
Встроенные компоненты Python и модули 103
Анализ журналов 146
ElementTree 153
В заключение 158

4. Создание документации и отчетов 159
Автоматизированный сбор информации 160
Сбор информации вручную 163
Форматирование информации 174
Распространение информации 180
В заключение 185

5. Сети 186
Сетевые клиенты 186
Средства вызова удаленных процедур 199
SSH 206
Twisted 209
Scapy 216
Создание сценариев с использованием Scapy 219

6. Данные 221
Введение 221
Использование модуля OS для взаимодействия с данными 222
Копирование, перемещение, переименование и удаление данных 224
Работа с путями, каталогами и файлами 226
Сравнение данных 230
Объединение данных 233
Поиск файлов и каталогов по шаблону 239
Обертка для rsync 241
Метаданные: данные о данных 244
Архивирование, сжатие, отображение и восстановление 246
Использование модуля tarfile для создания архивов TAR 246
Использование модуля tarfile для проверки содержимого файлов TAR 249

7. SNMP 252
Введение 252
Краткое введение в SNMP 252
IPython и Net-SNMP 256
Исследование центра обработки данных 260
Получение множества значений с помощью SNMP 263
Создание гибридных инструментов SNMP 270
Расширение возможностей Net-SNMP 271
Управление устройствами через SNMP 275
Интеграция SNMP в сеть предприятия с помощью Zenoss 276

8. Окрошка из операционных систем 278
Введение 278
Кросс-платформенное программирование на языке Python в UNIX 279
Pylnotify 291
OS X 293
Администрирование систем Red Hat Linux 298
Администрирование Ubuntu 299
Администрирование систем Solaris 299
Виртуализация 300
Облачная обработка данных 301
Использование Zenoss для управления серверами Windows из Linux 309

9. Управление пакетами 313
Введение 313
Setuptools и пакеты Python Eggs 314
Использование easy_install 315
Дополнительные особенности easy_install 318
Создание пакетов 324
Точки входа и сценарии консоли 329
Регистрация пакета в Python Package Index 330
Distutils 332
Buildout 335
Использование Buildout 335
Разработка с использованием Buildout 339
Virtualenv 339
Менеджер пакетов ЕРМ 344

10. Процессы и многозадачность 350
Введение 350
Модуль subprocess 350
Использование программы Supervisor т для управления процессами 361
Использование программы screen для управления процессами 364
Потоки выполнения в Python 365
Процессы 378
Модуль processing 379
Планирование запуска процессов Python 382
Запуск демона 384
В заключение 388

11. Создание графического интерфейса 390
Теория создания графического интерфейса 390
Создание простого приложения PyGTK 392
Создание приложения PyGTK для просмотра файла журнала веб-сервера Apache 394
Создание приложения для просмотра файла журнала веб-сервера Apache с использованием curses 398
Веб-приложения 403
Django 404
В заключение 426

12. Сохранность данных 427
Простая сериализация 428
Реляционная сериализация 448
В заключение 458

13. Командная строка 459
Введение 459
Основы использования потока стандартного ввода 460
Введение в optparse 462
Простые шаблоны использования optparse 462
Внедрение команд оболочки в инструменты командной строки на языке Python 470
Интеграция конфигурационных файлов 477
В заключение 479

14. Практические примеры 480
Управление DNS с помощью сценариев на языке Python 480
Использование протокола LDAP для работы с OpenLDAP, Active Directory и другими продуктами из сценариев на языке Python 482
Составление отчета на основе файлов журналов Apache 484
Зеркало FTP 492
Приложение. Функции обратного вызова 496
Алфавитный указатель 499

Python в администрировании сервера: почему бы и нет?

Архив номеров / 2002 / Выпуск №1 (1) / Python в администрировании сервера: почему бы и нет?

РОМАН ЗУСИ

Python в администрировании сервера: почему бы и нет?

Стандартных решений не существует. Каждый системный администратор рано или поздно начинает писать свои скрипты, которые облегчают его работу, избавляя от рутины. Для автоматизации в UNIX-системах традиционно применяются командные оболочки (типа bash или ksh, разновидностей оболочек достаточно много) и язык Perl. Причем, следуя философии UNIX, эти оболочки используют для решения проблемы целый набор инструментов, выполняющих небольшие частные задачи: ls, wc, sort, grep, diff, tar, .

Обычно простые задачи выполняются в командной оболочке запуcком соответствующих инструментов и организацией потока данных. Для более сложных задач требуются и более сложные инструменты, например, awk, sed или даже Perl. Так принято.

Однако хотелось бы обратить внимание системных администраторов на такой сценарный (скриптовый) язык как Python. Этот язык, благодаря своим хорошим качествам, о которых поговорим далее, уверенно завоевывает популярность, в том числе для задач системного администрирования. Например, именно его применяет Red Hat в инструменте под названием anaconda для обеспечения начальной установки своего дистрибутива Linux.

Конечно, системные администраторы – натуры весьма консервативные, и потому я решил написать эту статью, показывающую, что Python действительно имеет преимущества по сравнению с языком Perl и оболочками при решении как повседневных, так и одноразовых задач.

Python – интерпретируемый язык с развитыми высокоуровневыми структурами данных, имеющий все необходимое для вызова функций POSIX-совместимых систем. Впрочем, Python является многоплатформенным языком, так что его можно с успехом использовать и, к примеру, в среде Windows. Однако не буду долго говорить о происхождении и синтаксисе языка: об этом заинтересованный читатель узнает на http://python.ru или из книги Сузи Р.А. Python. – СПб.: БХВ-Петербург, 2002; а сразу перейду к делу.

Начнем с небольшого примера, в котором нам требуется установить права и принадлежность файлов, чтобы имена совпадали с именами пользователей в системе (для простоты будем считать, что имена пользователей доступны из файла /etc/passwd). Подобная задача может возникнуть, например, в каталоге с почтовыми ящиками, где каждый ящик должен принадлежать соответствующему его названию пользователю.

import os, string

for line in open(«/etc/passwd»).readlines():

users[rec[0]] = int(rec[2]), int(rec[3]) # uid и gid

for file in os.listdir(«.»):

print «Сирота: «, file

os.chown(file, uid, gid)

В самом начале мы импортируем модуль для работы с функциями ОС (os) и работы со строками (string). Перед началом цикла по строкам файла /etc/passwd словарь users пуст. В цикле по строкам файла /etc/passwd мы делаем следующее. Именем rec обозначаем кортеж значений записи passwd-файла. Мы знаем, что первое поле этой записи – имя пользователя. Имя пользователя и станет ключом в словаре users. В качестве значения для данного ключа мы берем приведенные к целому типу поля 2 и 3, соответствующие идентификаторам пользователя и группы. Таким образом в первом цикле формируется отображение имени пользователя и его идентификаторов. Во втором цикле, по именам файлов в текущем каталоге, пытаемся (try) найти владельца файла, обращаясь к словарю users. Если это не удается, мы пишем на стандартный вывод соответствующую диагностику. В этом случае владельцем файла станет root. Последние две команды, думается, ясны и без комментариев.

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

Для любознательных укажем и второй путь решения, в котором используются «правильные» средства:

import os, pwd, glob

for file in glob.glob(«*»):

print «Сирота: «, file

os.chown(file, rec[2], rec[3])

Здесь удалось добиться некоторого сокращения программы за счет использования функции getpwnam модуля pwd стандартной библиотеки Python. Здесь также применена функция glob из одноименного модуля для получения списка файлов.

Для сравнения приведен неправильный пример подобной же программы, написанный в оболочке bash.

# Не работает, если имена файлов содержат точку или пробел

chown $file.$file $file || chown root.root $file

Конечно, на языке командной оболочки программа получилась раза в два короче. Однако в ней таится неприятная неожиданность: она работает некорректно для файлов, содержащих в имени точку, пробел или дефис в начале!

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

Из приведенных примеров уже видна особенность языка Python, не всеми воспринимаемая хорошо: для выделения фрагментов кода в составных операторах используется единообразный отступ. Тем самым интерпретатор Python требует от программиста визуально выделять структуру программы, что положительно сказывается на читаемости кода. И это немаловажно, ведь написанный скрипт может пригодиться для похожей задачи.

В следующем примере мы рассмотрим еще одну часто возникающую задачу: проверка работоспособности POP3-сервиса и отправка сообщения электронной почты в случае неудачи. Заметьте, что приведенный пример одинаково хорошо подходит и для UNIX, и для NT.

import smtplib, poplib

Subject: POP3 down.

Please, restart pop3 at mymail.

print «нет связи»

С помощью конструктора объекта POP3-соединения из модуля poplib мы пытаемся установить соединение с POP3-сервером mymail. Если это не удается, мы должны отправить о происшествии письмо на admin@othermail. В этом нам поможет модуль smtplib и конструктор класса SMTP. Если и это не удается, просто выводится «нет связи». Заметьте, как легко в Python ввести многострочный текст.

Надеемся, вы как минимум заинтересовались предлагаемым инструментом.

Таблица 1 поможет быстро найти аналоги распространенных команд среди функций стандартной библиотеки языка Python. Перед использованием функции достаточно импортировать соответствующий модуль.

chmod режим путь

chown uid.gid путь

os.chown(» путь «, uid, gid)

time.localtime(time.time()) и другие функции модуля time

функции модуля difflib

print «%(перем)s» % vars()

для работы с регулярными выражениями служит модуль re

Автоматизация задач инженера/администратора при помощи Python


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

На самом деле автоматизация любых задач стала меня интересовать довольно давно. А моему первому в этом плане проекту — TorrentMonitor на сегодняшний день уже 6,5 лет.
И так, сегодня на конкретном примере я постараюсь рассказать о том, как можно работать с различным оборудованием при помощи Python, как этим облегчить свою работу и жизнь. Но Python не панацея. Всё зависит от ваших текущих знаний или какие знания и опыт вы хотели бы получить. Есть приверженцы Bash/Powershell. Кто-то говорит, что это хороший вариант. На мой взгляд — проще учить один язык, который на 90% одинаково будет себя вести на разных платформах, чем учить 2 языка. Да и ни Powershell своими командлетами, ни Bash своим синтаксисом мне совершенно не нравятся. Тем более, что у Python есть уже огромное количество разнообразных модулей и вы можете даже сделать для своих скриптом кросплатформенный GUI, если уж совсем скучно станет. В нашей компании есть инженер, который в рамках своих задач по сопровождению приложений и серверов JEE написал не просто скрипт, а целую систему на Bash, которая была положительно отмечена руководством, используется не только в рамках нашей компании и нашими инженерами, но уже и разработчиками самой системы. Так что выбор инструмента, по сути, не так уж и важен. Главное что бы вы были в состоянии реализовать на нём то, что задумываете.

В качестве примера у нас будет несколько скриптов, работающих с коммутаторами 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 — для отказоустойчивости) и имя конфигурационного файла на коммутаторе.
Вот так это будет выглядеть

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

Пример добавления СХД. Пример добавления сервера.

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

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

Пример 2: Ищем устройство на порту
Наши коммутаторы мониторятся при при помощи Zabbix, в том числе и ошибки на портах. Я об этом в статьях по Brocade ещё не говорил, это тема лишь 7 и 13 частей, но в данном случае для примере пока не важно, что именно за ошибки на портах у нас есть. В любом случае, для того, что бы начать разбирать в возникшей проблеме — нам необходимо понять с какого устройства всё началось.
er_other_discard port 4 delta (IBM SAN 10.6.220.10:brocadeportstaterrlld.sh[er_other_discard,4,10,1]): 30
Здесь у на сошибка на 4-и порту коммутатора 10.6.220.10
Да, мы можете зайти самостоятельно на коммутатор, сделать switchshow, посмотреть WWN на порту, сделать nodefind. А может быть ещё и пароль от коммутатора у вас сгенерирован и записан где-нибудь в хранилище паролей, пароль от которого ещё нужно вспомнить. В общем да — я ленив, и никогда этого не скрывал

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

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

Работает это очень просто
Поиск устройства на порту. В данном примере у нас порт транковый

Поиск всех устройств на коммутаторе

Набор дополнительных модулей в общем то тот же самый — для работы с параметрами коммандной строки, работа с ssh и регулярные выражения.

И так, в начале нам нужно создать словарь с нашими коммутаторами, где мы указываем их ip, логин, пароль и количество портов. Последний параметр будет важен, если у ваших коммутаторов разное количество портов, и скрипту нужно знать — сколько портов опрашивать, когда в качестве аргумента к порту мы передаём «all».

Функции:
connect — как и в предыдущем скрипте отвечает за подключение к коммутатору при помощи paramiko
findali — собственно эту команду мы и вызываем, она занимается тем, что запускает дву другие функции для поиска WWN на порту и его сопоставление с алиасом и затем выводом информации в консоль.
findWWN — получает курсор подключения к коммутатору и ищет WWN на указанном порту.
findAlias — получает курсор подключения к коммутатору и ищет алиас переданного WWN.

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

И так — параметры:
-c — выполняемая команда. В нашем случае только findali, остальное я убрал, что бы не загромождать код.
-switchall — выполнение команды на всех коммутаторах
-a — выполнение команды на конкретном коммутаторе (в качестве идентификатора я использую последний октет адреса коммутатора)
-dc — выполнение команды на коммутаторах в конкретном ЦОДе
-f — выполнение команды на коммутаторах первой или второй фабрики
-st — выполнение команды на коммутаторах по логическому распределению core/edge
-p — порт. может быть указан как один, так и через запятую, либо all.

все дальнейшие IFы определяют исходя из переданных параметров — на каких коммутаторах необходимо выполнять команду.
Данный скрипт, в отличие от первого, уже можно назвать универсальным. Вам достаточно указать свои коммутаторы в словаре и разбивках и он будет успешно работать и в вашей инфраструктуре.

Надеюсь этим небольшими примерами, я показал как можно сделать свои рабочие будни немножко проще.

Добавить комментарий Отменить ответ

Для отправки комментария вам необходимо авторизоваться.

Ссылка на основную публикацию
Adblock
detector
Рубрика: Администрирование / Продукты и решения