Быстрый старт: Скрипты на Python для сисадмина

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

1. Окружение и базовый синтаксис в задачах администрирования

Окружение и базовый синтаксис в задачах администрирования

Граница между Bash-скриптом и необходимостью использовать Python обычно проходит там, где появляются вложенные структуры данных или необходимость обрабатывать ответы API. Конвейер из grep, awk и sed отлично справляется с плоским лог-файлом, но когда нужно прочитать JSON-ответ от облачного провайдера, отфильтровать серверы по тегам и отправить метрики, Bash превращается в хрупкий и нечитаемый код. Python предлагает предсказуемость: строгую типизацию, богатую стандартную библиотеку и инструменты для создания полноценных CLI-утилит, которые ведут себя как нативные команды Linux.

Изоляция зависимостей: системный Python против venv

Главное правило системного администратора при работе с Python: никогда не устанавливать сторонние пакеты через pip глобально в операционную систему. Системный интерпретатор Python используется критически важными компонентами ОС (например, пакетными менеджерами dnf в RHEL/CentOS или apt в Ubuntu). Глобальная установка пакета может обновить зависимость, которую использует системная утилита, что приведет к неработоспособности ОС.

Для решения этой проблемы используется модуль venv, который создает изолированные виртуальные окружения.

Эта команда создает директорию .venv, внутри которой формируется изолированная файловая структура. В ней находятся собственные бинарные файлы интерпретатора и локальная директория site-packages для установки библиотек.

!Структура виртуального окружения Python

Чтобы скрипт использовал это изолированное окружение, не обязательно каждый раз выполнять команду source /opt/scripts/.venv/bin/activate. Достаточно указать прямой путь к интерпретатору виртуального окружения при запуске скрипта или использовать правильный Shebang.

Анатомия правильного скрипта: Shebang и кодировки

Первая строка любого исполняемого скрипта в Linux — Shebang (#!). Она указывает загрузчику ОС, какую программу использовать для интерпретации текстового файла.

Часто можно встретить жестко заданный путь: #!/usr/bin/python3

Для простых системных скриптов это допустимо, но если скрипт должен работать внутри виртуального окружения (где интерпретатор находится, например, в /opt/scripts/.venv/bin/python), жесткий путь сломает логику изоляции: скрипт всё равно запустится системным интерпретатором.

Правильный паттерн — использование утилиты env: #!/usr/bin/env python3

Утилита env ищет исполняемый файл python3 в директориях, перечисленных в переменной окружения PATH, и env корректно подхватит изолированный интерпретатор.

После добавления Shebang скрипту необходимо выдать права на исполнение:

Теперь скрипт можно запускать как обычную команду: ./check_nodes.py.

Структуры данных для инфраструктуры

В задачах администрирования редко приходится писать абстрактные алгоритмы. Основная работа — это манипуляция данными: списками серверов, конфигурациями в виде ключ-значение, параметрами процессов. Для этого в Python используются две фундаментальные структуры: списки (list) и словари (dict).

Словарь идеально подходит для описания единичного объекта инфраструктуры, так как позволяет обращаться к атрибутам по именованным ключам. Список позволяет хранить набор таких объектов.

В этом примере используется f-строка (строка с префиксом f), которая позволяет встраивать значения переменных прямо в текст, заключая их в фигурные скобки {}. Это избавляет от громоздкой конкатенации строк и делает вывод логов читаемым.

Для более компактной обработки списков применяется механизм List Comprehension (генераторы списков). Если стоит задача получить только IP-адреса серверов, чья нагрузка превышает порог, вместо написания многострочного цикла for с методом .append(), можно использовать однострочную конструкцию:

Генераторы списков работают быстрее обычных циклов и делают код более "питоничным" (Pythonic), сокращая визуальный шум.

Отказ от хардкода: модуль argparse

Скрипт из предыдущего примера имеет фатальный недостаток: порог нагрузки (2.0) жестко зашит в код (захардкожен). Чтобы изменить порог, администратору придется открывать файл в редакторе и модифицировать исходный код. Настоящие утилиты должны принимать параметры извне.

Самый примитивный способ получить переданные аргументы — использовать список sys.argv, который содержит все слова, переданные при запуске. Однако ручной разбор sys.argv требует самостоятельной проверки индексов, обработки отсутствующих аргументов и написания логики для флагов (например, -h или --help).

Стандартом де-факто для создания интерфейсов командной строки в Python является встроенный модуль argparse. Он берет на себя всю рутину: валидацию типов, установку значений по умолчанию и автоматическую генерацию справочной информации.

!Пошаговый разбор аргументов командной строки модулем argparse

Перепишем скрипт проверки серверов, добавив в него профессиональный CLI-интерфейс:

Теперь скрипт ведет себя как стандартная утилита Linux. Если запустить его с флагом -h, argparse автоматически сгенерирует и выведет справку:

Если пользователь передаст неверный тип данных, например строку вместо числа (./check_nodes.py -t high), модуль argparse перехватит ошибку до начала выполнения основной логики, выведет сообщение error: argument -t/--threshold: invalid float value: 'high' и завершит скрипт с ненулевым кодом возврата. Параметр choices дополнительно защищает от опечаток в названиях ролей, не позволяя запустить скрипт с несуществующим фильтром.

Конструкция if __name__ == "__main__": в конце файла является стандартом написания Python-скриптов. Она проверяет, запущен ли файл напрямую интерпретатором, или же он импортирован другим Python-файлом как библиотека. Если файл запущен напрямую, специальная переменная __name__ получает значение "__main__", и вызывается функция main(). Это делает код переиспользуемым и защищает от случайного выполнения логики при импорте.

Переход от Bash к Python в системном администрировании начинается с этих базовых конструкций. Изолированное окружение защищает операционную систему от конфликтов версий. Словари и списки позволяют описывать топологию сети или параметры сервисов в понятном виде, а модуль argparse превращает куски кода в полноценные инструменты, готовые к передаче другим инженерам или интеграции в CI/CD пайплайны.