MiddleDevOps Engineer > Контейнеры и доставка > Infrastructure as Code и управление конфигурацией
Короткий ответ Нужно создать .j2-шаблон с циклом {% for %} по списку переменной (например, upstream_servers) и условием {% if gzip_enabled %} для опциональных блоков, подключить его через модуль ansible.builtin.template с указанием src/dest; для диагностики используется ansible-playbook --check --diff (покажет построчный diff без применения) или прогон модуля template в режиме с -vvv, а также точечная проверка конкретных значений переменных через ansible -m debug -a "var=upstream_servers". Как это работает подробнее модуль template рендерит Jinja2-шаблон на управляющей машине (control node), подставляя значения переменных, доступных для конкретного хоста (из inventory, group_vars, host_vars, facts), и копирует результат на целевой хост, сравнивая содержимое с уже существующим файлом для определения changed/ok; то есть вся логика выбора данных решается до копирования файла, а не на самом хосте. Пример кода Что использовать на практике Практика. при отладке шаблона полезно временно вывести промежуточное значени
ansibleconfiguration-management
SeniorPython Developer > Основы Python > Фоновые задачи
Короткий ответ Нужно явно решить, сколько времени дать активным задачам на самостоятельное завершение (таймаут), как обработать задачи, не успевшие завершиться, и обеспечить, что частично выполненные операции не оставят данные в несогласованном состоянии — конкретные механизмы зависят от того, идемпотентны ли задачи и насколько критична потеря/повтор отдельной задачи. Как это работает подробнее Обработчик сигнала (SIGTERM от оркестратора) должен перестать принимать новые задачи, дать текущим ограниченное время на завершение (через asyncio.wait_for или join(timeout=...)), а затем решить по оставшимся: принудительно отменить (cancel для корутин, флаг для потоков, так как потоки нельзя прервать насильно) или считать их «в процессе» и полагаться на внешний механизм переподхвата. Компромисс. Короткий таймаут graceful shutdown ускоряет деплои и освобождение ресурсов, но увеличивает риск принудительного прерывания задач, которые почти завершились; длинный таймаут снижает этот риск, но замедляет выкатки и может конфл
background-taskspython
SeniorDevOps Engineer > Контейнеры и доставка > Скриптинг и автоматизация
Короткий ответ Библиотека должна по умолчанию задавать безопасные таймауты, ограниченные ретраи с backoff и джиттером только для идемпотентных операций, встроенный circuit breaker для защиты как клиентов, так и самого вызываемого сервиса, и обязательную структурированную телеметрию (request ID, латентность, код ответа) из коробки; единственно верной комбинации параметров не существует — конкретные значения таймаутов, число ретраев и пороги circuit breaker нужно обсуждать отдельно для каждого класса зависимостей и явно проговаривать компромиссы с командами-потребителями библиотеки. Как это работает подробнее централизованная библиотека даёт единый контроль над устойчивостью (таймауты, ретраи, circuit breaker) и наблюдаемостью (трейсинг, метрики) для всех её пользователей сразу, вместо того чтобы каждая команда реализовывала это по-своему с разным качеством. Circuit breaker временно прекращает попытки вызова при устойчивых сбоях зависимости, защищая и вызывающую сторону от трат ресурсов на заведомо неудачные за
circuit-breakerobservability
SeniorPython Developer > Основы Python > Надёжность API
Короткий ответ Доставку нужно делать асинхронно через очередь с повторными попытками и экспоненциальным backoff, подписывать каждое событие уникальным event_id для дедупликации на стороне подписчика, перемещать сообщения, исчерпавшие попытки, в DLQ с возможностью ручного/автоматического переразбора, и явно документировать подписчикам, что строгий порядок доставки между разными событиями не гарантируется, если это не было отдельно спроектировано. Как это работает подробнее отправка webhook — это по сути ненадёжный HTTP-вызов к стороннему сервису, который может быть недоступен, медленным или отвечать ошибкой; каждая попытка доставки должна иметь таймаут, ограниченное число повторов с нарастающей задержкой, и фиксацию результата (успех/ошибка) для наблюдаемости. Подписчик должен получать подписанный payload (HMAC) с уникальным идентификатором события, чтобы мог идемпотентно обработать повторную доставку — гарантия "ровно один раз" на уровне HTTP между двумя независимыми системами недостижима, поэтому стандарт —
dead-letter-queuemessage-ordering
MiddleDevOps Engineer > Контейнеры и доставка > Infrastructure as Code и управление конфигурацией
Короткий ответ Пайплайн на PR должен выполнять terraform init + terraform plan -out=plan.tfplan, сохранять читаемый вывод (terraform show -no-color plan.tfplan) и публиковать его как комментарий к PR через API системы CI/VCS; после merge в main отдельный job выполняет terraform apply с ручным approval-гейтом (environment protection rule в GitHub Actions/manual gate в GitLab CI) и обязательно используя именно тот план, что был проверен (или заново сгенерированный план с тем же содержимым); одновременный запуск двух apply предотвращается как самим state locking backend'а (второй apply будет ждать/упадёт на занятом локе), так и организационно — настройкой очереди/конкурентности на уровне CI (например, concurrency group на имя окружения), чтобы не запускать два job параллельно на один и тот же state вообще. Как это работает подробнее CI-система видит каждый PR и merge как отдельное событие и по умолчанию может запускать job'ы параллельно; ограничение конкурентности (named concurrency group / environment lock в CI
ci-cdconfiguration-management
MiddlePerformance Marketer > Google Ads > Данные, комплаенс и безопасность рекламных аккаунтов
Короткий ответ Восстановите контроль над связанным логином, отзовите подозрительные права, верните легитимный способ оплаты и приостановите активные кампании до выяснения обстоятельств. Затем обратитесь в поддержку платформы. Как это работает подробнее Несанкционированный вход может быть следствием фишинга или утечки пароля, поэтому нужно защищать саму учётную запись, а не только рекламный кабинет. Проверьте область инцидента. Изучите журнал изменений и проверьте другие аккаунты, связанные тем же Business Manager или email. Что использовать на практике Зафиксируйте действия. Смените пароль, включите или проверьте 2FA, удалите неизвестных пользователей, проверьте оплату и сохраните сведения для обращения в поддержку. Подводные камни Не ограничивайтесь возвратом карты. Если не отозвать доступ злоумышленника, он может снова изменить настройки аккаунта.
2faaccount-security
MiddleDevOps Engineer > Контейнеры и доставка > Облачные платформы
Короткий ответ Нужно немедленно исправить источник публичного доступа (ACL или слишком широкую bucket-политику), включить блокировку публичного доступа на уровне bucket/аккаунта, затем провести ревизию логов доступа, чтобы понять, обращался ли кто-то посторонний к данным, и внедрить автоматическую проверку, предотвращающую повторное появление публичных bucket. Как это работает подробнее публичный доступ обычно появляется либо из-за ACL, явно разрешающей чтение «всем», либо из-за bucket-политики с принципалом * без условий; у большинства провайдеров есть отдельная настройка уровня аккаунта, блокирующая публичный доступ даже при ошибочной политике на конкретном bucket. Пример кода Что использовать на практике Рекомендация. сначала закрывают доступ, затем проверяют access-логи bucket на предмет обращений с внешних/неожиданных IP за период, пока bucket был открыт; дальше добавляют превентивный контроль — автоматическое сканирование конфигурации, которое будет алертить или блокировать создание публичного bucket. П
cloud-securityiam
MiddlePython Developer > Основы Python > Docker и контейнеры
Короткий ответ Multi-stage build позволяет использовать «тяжёлый» этап с компиляторами для сборки зависимостей, а в финальный образ скопировать только готовые артефакты на «тонкий» базовый образ, не включая инструменты сборки и кэш pip, которые не нужны в runtime. Как это работает подробнее в Dockerfile можно объявить несколько стадий FROM ... AS builder, а в финальной стадии командой COPY --from=builder забрать только нужные файлы; промежуточные слои не попадают в итоговый образ. Пример кода Что использовать на практике Рекомендация. особенно полезно для зависимостей с C-расширениями, требующих компилятор — он нужен только на этапе установки; финальный образ на базе slim/alpine получается значительно меньше и с меньшей поверхностью атаки. Подводные камни Риск. копировать в финальную стадию весь /usr; выбирать alpine без проверки совместимости — musl libc может конфликтовать с пакетами, собранными под glibc.
containerizationcontainers
MiddleData Analyst > SQL и данные > Аналитическое мышление
Короткий ответ Это похоже на парадокс Симпсона — рост общей метрики при падении во всех подгруппах объясняется изменением структуры (весов) сегментов, например ростом доли сегмента с изначально более высокой конверсией, а не реальным улучшением. Как это работает подробнее общая метрика — это взвешенное среднее по сегментам; если доля сегмента с высокой базовой конверсией выросла, общая метрика может расти, даже если конверсия внутри каждого сегмента падает. Игнорирование структуры весов ведёт к ложному выводу об улучшении. Пример кода Что использовать на практике Порядок действий. проверяю, изменилась ли доля трафика между сегментами за рассматриваемый период (mix shift); пересчитываю, какой была бы общая конверсия при неизменной структуре весов (фиксация весов на базовый период), чтобы отделить эффект структуры от эффекта внутри сегментов. Подводные камни Частые ошибки. докладывать руководству только агрегированную цифру как «успех», не проверив разбивку по сегментам; пытаться объяснить рост одной причиной,
conversion-ratemix-shift
MiddleData Analyst > SQL и данные > Коммуникация с бизнесом
Короткий ответ Объясню без термина «парадокс Симпсона», а через аналогию: общая цифра упала не потому, что каждый сегмент работает хуже, а потому, что изменился состав трафика — выросла доля сегмента с изначально более низкой конверсией (например, мобильного веба), что «утяжелило» общую смесь вниз даже при улучшении каждой отдельной части. Как это работает подробнее агрегированная метрика — это взвешенная сумма метрик сегментов, и вес каждого сегмента (его доля в общем трафике) может меняться во времени независимо от качества самого сегмента; при сдвиге структуры трафика общий показатель может двигаться в другую сторону, чем каждая его часть. Что использовать на практике Применение. показываю таблицу «было / стало» с долями сегментов и их конверсией отдельно, явно считаю вклад каждого сегмента в общий показатель (weighted contribution), чтобы визуально показать, что рост доли слабого сегмента перевесил улучшение внутри каждого сегмента. Проверка или пример. Сегмент Q1: доля / конв. Q2: доля / конв. Десктоп 50
conversion-ratesegmentation