Как вы использовали Python для задач автоматизации в DevOps?

Ответ

Python — мой основной инструмент для создания гибких скриптов автоматизации, когда готовые инструменты (Ansible, Terraform) не покрывают специфичные кейсы.

1. Автоматизация облачной инфраструктуры (AWS с Boto3): Писал скрипты для сложных сценариев, неудобных для чистого CloudFormation/Terraform.

Пример: Скрипт для ротации ключей доступа IAM у сервисных аккаунтов с уведомлением:

import boto3
import json
from datetime import datetime, timezone

def rotate_iam_keys(user_name):
    iam = boto3.client('iam')

    # 1. Получаем старые ключи
    old_keys = iam.list_access_keys(UserName=user_name)['AccessKeyMetadata']

    # 2. Создаем новый ключ
    new_key_resp = iam.create_access_key(UserName=user_name)
    new_key = new_key_resp['AccessKey']

    # 3. Обновляем секрет в AWS Secrets Manager
    secrets = boto3.client('secretsmanager')
    secret_value = {"AWS_ACCESS_KEY_ID": new_key['AccessKeyId'],
                    "AWS_SECRET_ACCESS_KEY": new_key['SecretAccessKey']}
    secrets.put_secret_value(
        SecretId=f'/app/{user_name}-credentials',
        SecretString=json.dumps(secret_value)
    )

    # 4. Деактивируем старые ключи (с задержкой для грации)
    for key in old_keys:
        iam.update_access_key(
            UserName=user_name,
            AccessKeyId=key['AccessKeyId'],
            Status='Inactive'
        )
    print(f"Keys rotated for {user_name}. New Key ID: {new_key['AccessKeyId']}")

if __name__ == "__main__":
    rotate_iam_keys('my-ci-user')

2. Кастомные провайдеры данных и валидации для Terraform: Создавал внешние data source на Python, чтобы Terraform мог запрашивать информацию из внутренних API компании (например, список разрешенных CIDR).

3. Обработка и агрегация логов/метрик: Использовал pandas и requests для анализа дампов логов из S3 или для создания кастомных дашбордов, агрегирующих данные из Prometheus API и Jira.

4. Интеграция различных инструментов в CI/CD: Писал скрипты-глу (glue scripts), которые, например:

  • Парсили вывод terraform plan, искали деструктивные изменения и комментировали их в Pull Request.
  • После успешного деплоя в staging через ArgoCD Slack-бот на Python запускал набор интеграционных тестов.

Ключевые библиотеки в моем stack: boto3, requests, pyyaml, jinja2 (для шаблонизации конфигов), fabric/paramiko (для SSH), pytest (для тестирования самих скриптов).

Ответ 18+ 🔞

А, ну это про автоматизацию на Python! Да, чувак, это моя тема, когда всякие Ansible с Terraform'ом начинают тупить, как мартышлюшка с калькулятором. Бывает же такое — специфичный кейс, а готовые инструменты разводят руками: «Ну, ёпта, сами как-нибудь».

1. Облака, AWS и эта вечная возня с ключами (Boto3): Вот, например, история про ротацию ключей IAM. Ситуация, бля, классическая: сервисные аккаунты, ключи стареют, а вручную это делать — терпения ноль ебать. CloudFormation тут тупит, Terraform тоже не фонтан. Вот и пишешь скрипт, который всё делает по-взрослому: новый ключ создал, в Secrets Manager засунул, старые прибил. Главное — с задержкой, для грации, чтобы ничего не упало посередине. Выглядит это примерно так, смотри:

import boto3
import json
from datetime import datetime, timezone

def rotate_iam_keys(user_name):
    iam = boto3.client('iam')

    # 1. Получаем старые ключи
    old_keys = iam.list_access_keys(UserName=user_name)['AccessKeyMetadata']

    # 2. Создаем новый ключ
    new_key_resp = iam.create_access_key(UserName=user_name)
    new_key = new_key_resp['AccessKey']

    # 3. Обновляем секрет в AWS Secrets Manager
    secrets = boto3.client('secretsmanager')
    secret_value = {"AWS_ACCESS_KEY_ID": new_key['AccessKeyId'],
                    "AWS_SECRET_ACCESS_KEY": new_key['SecretAccessKey']}
    secrets.put_secret_value(
        SecretId=f'/app/{user_name}-credentials',
        SecretString=json.dumps(secret_value)
    )

    # 4. Деактивируем старые ключи (с задержкой для грации)
    for key in old_keys:
        iam.update_access_key(
            UserName=user_name,
            AccessKeyId=key['AccessKeyId'],
            Status='Inactive'
        )
    print(f"Keys rotated for {user_name}. New Key ID: {new_key['AccessKeyId']}")

if __name__ == "__main__":
    rotate_iam_keys('my-ci-user')

2. Terraform и его капризы с данными: Бывает, ему надо список каких-нибудь CIDR из нашего внутреннего API, а своего провайдера для этого нет. Вот тут и вылезает Python как внешний data source. Написал скрипт, который дергает наш корпоративный API, отдает JSON — и Terraform счастлив, как слон. Без этого — просто пизда рулю, ничерта не сконфигурируешь.

3. Логи, метрики и этот адский бардак: Тут, конечно, pandas — наш отец родной. Выгрузил тонны логов из S3, проанализировал, агрегировал. Или, например, наколхозил дашборд, который тянет данные из Prometheus API, потом лезет в Jira тикеты смотреть — в общем, делает всю ту ебучую работу, на которую нет готового инструмента. Удивление пиздец, сколько рутины можно автоматизировать парой скриптов.

4. CI/CD и скрипты-клей: Это вообще отдельная песня. Написать скрипт, который парсит вывод terraform plan, ищет там, сука, деструктивные изменения, и потом лезет в пул-реквест комментировать: «Э, дружок-пирожок, ты там пол-инфраструктуры сносишь!». Или вот: задеплоилось в staging, Slack-бот на Python просыпается и начинает гонять интеграционные тесты. Красота, а не жизнь.

Из инструментов, без которых я как без рук: boto3 (естественно), requests (куда ж без него), pyyaml и jinja2 для всех этих конфигов, fabric/paramiko когда надо по SSH потыкать, и pytest — потому что свои же скрипты надо тестировать, а то накосячишь, и будет вам хиросима и нигерсраки. Вот так вот, коротко и по делу.