Библиотека девопса | DevOps, SRE, Sysadmin
10.4K subscribers
1.85K photos
76 videos
5 files
3.25K links
Все самое полезное для девопсера в одном канале.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/25874ec4

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/6798b4e4509aba56522d1787
Download Telegram
⚙️ systemd-nspawn: контейнеры, о которых вы не знали, что они уже у вас есть

Пока все спорят, Podman лучше Docker или нет, в вашей системе уже лежит systemd-nspawn. Просто никто не сказал.

Это системный контейнер прямо из коробки часть systemd. Никакого демона, никакого рантайма, никакой регистрации на Docker Hub.

nspawn — это лёгкий контейнер на уровне ОС. Не Docker с OCI-образами, слоями, сетью, не VM с гипервизором и своим ядром. Что-то среднее: изолированный процесс со своим корнем файловой системы, PID-пространством и сетью. Ядро при этом общее с хостом.

Когда использовать вместо альтернатив

Docker/Podman когда нужны образы, реестры, оркестрация, микросервисы.

nspawn когда нужно:

• быстро поднять изолированное окружение для теста или сборки
• запустить другой дистрибутив на том же хосте без VM
• отлаживать chroot, но с нормальной изоляцией
• не тащить Docker на минималистичный сервер

Примеры команд

Создаём минимальный Debian-контейнер:
debootstrap stable /var/lib/machines/mydebian


Запускаем:
systemd-nspawn -D /var/lib/machines/mydebian


Запускаем как полноценный systemd-контейнер:
systemd-nspawn -D /var/lib/machines/mydebian --boot --network-veth


Нет хайпа, нет логотипа с китом, нет конференций. Просто инструмент, который работает, весит ноль байт сверх того что уже есть, и не требует отдельного сервиса в продакшне.

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека devops'a

#арсенал_инженера
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
🔄 Обновление SysVinit

SysVinit 3.16 это первый релиз за полгода. Больших изменений нет: авторы подчистили код и привели документацию в порядок.

Что изменилось:

Поправили опечатки и синтаксис в двух мануальных страницах — inittab и init. Туда же добавили описание того, как init читает директорию /etc/inittab.d/ — раньше это нигде не было задокументировано.

Contributor avivdaum улучшил конвертацию юнит-файлов systemd в SysV-скрипты. Пригодится тем, кто работает в смешанных окружениях или переходит с systemd.

Из кода убрали лишние отладочные и статусные сообщения при чтении /etc/inittab.d/, а в компоненте sulogin удалили неиспользуемые переменные.

SysVinit продолжает жить в дистрибутивах без systemd — Devuan, antiX и других легковесных системах.

➡️ Источник

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека devops'a

#пульс_индустрии
Please open Telegram to view this post
VIEW IN TELEGRAM
👨‍💻 Переходим с Ingress на Gateway API

ingress2gateway 1.0 это инструмент, который переводит Ingress-конфиги в Gateway API и сразу показывает, что не смог перевести автоматически.

Основная идея: вы даёте ему Ingress-манифесты или указываете кластер, он отдаёт Gateway API YAML. У Ingress-NGINX, Kong, Istio, GCE и других контроллеров свои аннотации и CRD, и ingress2gateway умеет их читать и переводить в соответствующие конструкции Gateway API.

Установка:
go install github.com/kubernetes-sigs/ingress2gateway@v1.0.0
# или
brew install ingress2gateway


Запуск:
# из файлов
ingress2gateway print --input-file my-manifest.yaml --providers=ingress-nginx > gwapi.yaml

# из неймспейса кластера
ingress2gateway print --namespace my-api --providers=ingress-nginx > gwapi.yaml

# из всего кластера
ingress2gateway print --providers=ingress-nginx --all-namespaces > gwapi.yaml


regex-матчи в Ingress-NGINX по умолчанию case-insensitive, поэтому инструмент добавит (?i) в начало паттерна. Скорее всего, вы захотите убрать это вручную.

ingress2gateway v1.0 совместим с Gateway API v1.4. Инструмент следит за версиями Gateway API и обновляется вместе с ними.

➡️ Блог разработчиков

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека devops'a

#арсенал_инженера
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
💡 Linux, который хочет быть BeOS

23 марта 2026 года команда VitruvianOS опубликовала первый публичный релиз своей операционной системы. Проект существует с 2019 года, но до этого момента разработчики намеренно не привлекали к нему широкое внимание.

VitruvianOS построена поверх Linux-ядра, но с реализацией совместимости с API BeOS и Haiku. Это значит, что приложения, написанные для Haiku, могут запускаться как нативные Linux-процессы.

Разработчики построили собственный слой Nexus, который выполняет ту же роль, что Binder в Android: управляет межпроцессным взаимодействием и событийной моделью. Вместо X11 или Wayland используется собственная графическая подсистема. Ядро собрано с real-time патчами для снижения задержек на десктопе.

➡️ Сайт проекта

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека devops'a

#арсенал_инженера
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2👍1
🔄 Обновление Ansible

Вышел очередной минорный релиз Ansible Core v2.20.4.

Что нового в ansible-test

Теперь можно указывать тестовые окружения более гибко через контейнерные и удалённые алиасы, не привязываясь к конкретной конфигурации.

Плюс добавили поддержку Ansible Core CI прямо из GitHub Actions — если вы гоняете тесты в CI на GitHub, это упрощает настройку.

Исправления

Починили выполнение команд PowerShell через плагины подключений, которые не поддерживают stdin и pipeline. Раньше в таких сценариях команды могли не выполняться корректно.

В ansible-connection убрали ошибки десериализации: объекты AnsibleTaggedObjects в ответах JSON-RPC теперь корректно конвертируются в обычные типы до передачи в модульный контекст.

Модуль rpm_key переехал с утилиты gpg на библиотечный API librpm. Это даёт совместимость с PGP-ключами версии 6, которые gpg в ряде систем не поддерживает.

Поиск конфигурации через config lookup теперь правильно использует предустановленные константы при темплейтинге.

И небольшой фикс для тех, кто использует чистую Python-реализацию PyYAML: убрали трейсбек при парсинге YAML из строк.

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека devops'a

#пульс_индустрии
Please open Telegram to view this post
VIEW IN TELEGRAM
👍32
📈 Топ-вакансий для девопсов за неделю

DevOps-инженер — удалёнка

SRE-инженер — удалёнка

DevOps (Авторизация SaaS) — до 350 000 ₽ и удалёнка

➡️ Еще больше топовых вакансий — в нашем канале Devops Jobs

🐸Библиотека devops'a

#вакансия_недели
Please open Telegram to view this post
VIEW IN TELEGRAM
👨‍💻 Инцидент на праздниках

Январские праздники, 7:02 утра. Консьюмер не запустился вовремя из-за регламентных работ. За три минуты простоя Kafka тихо удалила все сообщения. retention.bytes был настроен на 10 МБ, и брокер не пощадил ни одну проводку.

Архитектор Альфа-Банка разобрал 5 реальных случаев из прода: как неправильный сайзинг топика, кривые параметры retention и слепое доверие к дефолтным настройкам приводят к потере данных в самый неподходящий момент.

➡️ Читать статью

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека devops'a
Please open Telegram to view this post
VIEW IN TELEGRAM
🔧 Что на самом деле происходит, когда вы запускаете apt upgrade

Вы набираете две команды, жмёте Enter и уходите пить кофе. Но за эти секунды система делает куда больше, чем кажется.

1. Сначала идёт apt update

Это не обновление пакетов — это обновление *списков* пакетов. APT обходит все репозитории из /etc/apt/sources.list и скачивает свежие индексы. Без этого шага upgrade работает по устаревшей карте.

2. Разрешение зависимостей

APT строит граф зависимостей: какие пакеты нужно обновить, какие версии совместимы, что тянет что за собой. Это NP-сложная задача в общем случае — и APT решает её эвристиками. Иногда неидеально.

3. Скачивание .deb-файлов

Пакеты загружаются в /var/cache/apt/archives/. Если соединение оборвётся, то ничего страшного, при следующем запуске докачает.

4. Проверка подписей

Каждый пакет проверяется по GPG-подписи. Это защита от подмены: если подпись не совпадает, то установка не пройдёт.

5. Распаковка и скрипты

.deb это ar-архив, внутри которого лежат control.tar и data.tar. APT распаковывает файлы, а потом запускает скрипты: preinst → установка → postinst. Именно здесь может что-то пойти не так.

6. apt upgrade vs apt full-upgrade

upgrade никогда не удаляет пакеты и не устанавливает новые зависимости, если это ломает что-то существующее. full-upgrade (он же dist-upgrade) — может. Он агрессивнее и умнее одновременно.

Что может пойти не так

- Конфликт версий библиотек
- Новый конфиг поверх старого (dpkg спросит — не игнорируйте)
- Обновление ядра без перезагрузки (старое ядро всё ещё работает до ребута)
- held packages — пакеты на удержании, которые не обновятся без явного разрешения

Полезные команды:
apt list --upgradable        # что будет обновлено
apt-get -s upgrade # симуляция без изменений
/var/log/apt/history.log # история всех операций


Две строчки в терминале и десятки процессов под капотом. Теперь вы знаете, что именно происходит за этим скромным [Y/n].

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека devops'a

#арсенал_инженера
Please open Telegram to view this post
VIEW IN TELEGRAM
5
💻 Load Balancer: в чём разница между L4 и L7

Когда миллионы запросов летят на ваш сервис балансировщик нагрузки решает куда их направить . Но не все балансировщики одинаковы. Главный выбор: L4 или L7.

L4 работает на транспортном уровне: TCP/UDP.
L7 работает на уровне приложений: HTTP/HTTPS.
Это фундаментальное различие определяет всё остальное.

L4 — быстро, слепо, надёжно

L4-балансировщик видит только IP-адреса и порты, но не понимает, что находится внутри пакетов. Он пересылает TCP/UDP-соединения напрямую на бэкенд-серверы, не заглядывая в содержимое.

Что из этого следует:
— Минимальная задержка — решения принимаются менее чем за 100 микросекунд
— Работает с любым протоколом: MySQL, Redis, кастомные TCP-протоколы
— Не умеет роутить по URL, заголовкам или кукам
— Не делает SSL-терминацию

Хорошая аналогия: L4-балансировщик — как инспектор ДПС, который направляет машины по номерным знакам, не зная, что внутри.

L7 — умно, гибко, дороже

L7-балансировщик работает на уровне приложений: завершает входящее соединение, при необходимости расшифровывает трафик, инспектирует сообщения, принимает решение о роутинге на основе содержимого, открывает новое TCP-соединение к нужному бэкенду и отправляет туда запрос.

Что он умеет:
— Роутинг по URL: /api — одни серверы, /static — другие
— Манипуляция заголовками, SSL-терминация
— Sticky sessions (привязка сессии к конкретному серверу)
— Rate limiting, аутентификация, логирование
— Защита от XSS и SQL-инъекций — некоторые L7-балансировщики работают как WAF

Цена: типичная задержка L7 около 10 миллисекунд против микросекунд у L4. Плюс CPU на парсинг каждого запроса.

Когда что использовать

Выбирайте L4, если:
— Протокол не HTTP (DNS, базы данных, кастомный TCP)
— Нужна максимальная скорость и минимальный оверхед
— Простое распределение без контентного роутинга

Выбирайте L7, если:
— Работаете с HTTP/HTTPS/gRPC
— Нужен роутинг по путям, заголовкам, кукам
— Хотите SSL-терминацию в одном месте
— Важна наблюдаемость и безопасность

Как это выглядит в продакшне

Netflix комбинирует L4-балансировщики на региональном уровне с L7-шлюзами (Zuul/Envoy) для разделения логики. AWS предлагает Classic ELB (L4) и ALB (L7), большинство современных архитектур выбирают ALB.

Практическое правило: начинайте с L7 для HTTP-нагрузок. Переходите к L4 только когда упираетесь в производительность или нужен протоколо-агностичный роутинг.

Балансировщик это первый рубеж вашей архитектуры. Каждое его решение влияет на пользователя ещё до того, как запрос добрался до вашего кода.

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека devops'a

#арсенал_инженера
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥62
😱 Если ваш продукт не умеет отдавать данные в формате, понятном AI-агенту, то вас просто не существует

Скрипт не будет кликать по красивым кнопкам в браузере, он уйдёт к конкуренту с нормальным API. Перестроить архитектуру под машинных клиентов — это уже не хайп, а необходимое условие сохранения конкурентоспособности.

Как адаптировать продукт и не исчезнуть из выдачи:

— интегрировать MCP и A2A-взаимодействие, чтобы агенты могли вас читать;
— научиться контролировать стоимость (лимиты, кэш, роутинг между моделями);
— настроить AgentOps: трейсинг, логирование и отлов регрессий.

Всё это ждёт вас на обновлённом курсе «Разработка AI-агентов». Мы специально сделали фокус на утилитарном инжиниринге и production-ready решениях.

Кстати, до 29 марта можно забрать курс с большой скидкой, и стоит поторопиться — мест на потоке всё меньше.

Зафиксировать цену и начать деплоить агентов без слива бюджета 👈
✏️ Кластер сжигает деньги, а SLO трогать нельзя

Задача классическая: снизить затраты на инфраструктуру, не уронив надёжность. Казалось бы, противоречие. Но решение существует, и оно не одно.

Попробуйте ответить сами: с чего бы вы начали?

➡️ А ответ смотрите по ссылке

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека devops'a

#задача_со_звёздочкой
Please open Telegram to view this post
VIEW IN TELEGRAM
🔄 Вышел Kali Linux 2026.1

Первый релиз 2026 года. Обновление темы оформления плюс несколько весомых новинок.

Новая тема 2026

Обновлено всё визуальное окружение: загрузочная анимация, меню GRUB, графический установщик, экран входа и рабочий стол. Также исправлена давняя проблема: анимация загрузки на live-образах раньше зависала в самом начале, теперь работает корректно и зацикливается при долгой загрузке.

BackTrack Mode

В этом году 20-летие BackTrack Linux, предшественника Kali. В честь этого в kali-undercover добавили режим BackTrack: рабочий стол трансформируется в интерфейс BackTrack 5 с оригинальными обоями, цветами и темой окон.

Запустить можно из меню или командой:
kali-undercover --backtrack

Повторный запуск возвращает обычный Kali.

8 новых инструментов

AdaptixC2 — фреймворк для постэксплуатации и эмуляции атак
Atomic-Operator — запуск тестов Atomic Red Team на разных ОС
Fluxion — аудит безопасности и социальная инженерия
GEF — расширенный интерфейс для GDB
MetasploitMCP — MCP-сервер для Metasploit
SSTImap — автоматическое обнаружение SSTI-уязвимостей
WPProbe — быстрый энумератор плагинов WordPress
XSStrike — продвинутый сканер XSS

Всего: 25 новых пакетов, 9 удалено, 183 обновления. Ядро обновлено до 6.18.

Известная проблема

Метапакет kali-tools-sdr и пакеты gr-air-modes и gqrx-sdr сломаны в этом релизе. Исправление ожидается в следующем выпуске.

NetHunter

• Исправлены баги в приложении: WPS-сканирование, проверка HID-разрешений, кнопка «Назад»

• Новое ядро для Redmi Note 8 (Android 16)

• На Samsung S10 наконец заработали reaver, bully и kismet

• Первый рабочий патч для Wi-Fi-инъекций на чипсетах Qualcomm потенциально открывает поддержку для большинства телефонов на Qualcomm

Обновиться с предыдущей версии:
sudo apt update && sudo apt -y full-upgrade


➡️ Источник

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека devops'a

#пульс_индустрии
Please open Telegram to view this post
VIEW IN TELEGRAM
👨‍💻 Две строки, которые спасут ваш bash-скрипт от тихих ошибок

Большинство bash-скриптов падают молча. Команда завершилась с ошибкой, но скрипт продолжил работу, удалил не те файлы, задеплоил что-то сломанное. И вы узнаёте об этом только потом.

Две строки в начале файла это исправляют:
#!/bin/bash
set -euo pipefail


Первая строка это шебанг. Она говорит системе, каким интерпретатором запускать скрипт. Без неё поведение зависит от оболочки пользователя, а это непредсказуемо.

Вторая строка включает три флага сразу.

set -e останавливает скрипт, если любая команда завершилась с ошибкой. По умолчанию bash игнорирует ошибки и идёт дальше.

set -u превращает обращение к необъявленной переменной в ошибку. Опечатка в имени переменной без этого флага просто вернёт пустую строку и скрипт продолжит работу с пустым значением там, где ожидал путь или имя файла.

set -o pipefail ловит ошибки внутри пайпов. Без него такая конструкция:
cat file.txt | grep "pattern"


вернёт успех, даже если cat не смог открыть файл. Флаг фиксирует ошибку в любом месте цепочки.

Шебанг + set -euo pipefail это минимальный стандарт для любого bash-скрипта, который делает что-то важное.

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека devops'a

#root_prompt
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
🔄 Вышел nginx 1.29.7 и 1.28.3

Одновременно вышли два обновления nginx: основная ветка 1.29.7 с новыми возможностями и стабильная 1.28.3 только с исправлениями безопасности.

Уязвимости

Закрыто 6 уязвимостей, четыре из которых получили высокий уровень опасности.

Три уязвимости связаны с переполнением буфера:

CVE-2026-27654 — переполнение в модуле WebDAV при обработке запросов COPY и MOVE с директивой alias. Позволяет обратиться к файлам за пределами базового каталога. Примечательно, что уязвимость обнаружена с помощью AI-модели Claude.

CVE-2026-27784 и CVE-2026-32647 — переполнения буфера в модуле ngx_http_mp4_module при обработке специально сформированных MP4-файлов. Последствия могут не ограничиваться аварийным завершением процесса.

Остальные три:

CVE-2026-27651 — разыменование нулевого указателя при некорректном использовании CRAM-MD5 или APOP.

CVE-2026-28753 — манипуляция PTR-записями DNS для подстановки данных атакующего в SMTP-соединение к бэкенду.

CVE-2026-28755 — обход OCSP-проверки сертификата в модуле stream.

Новое в 1.29.7

Добавлена поддержка Multipath TCP: пакеты теперь можно доставлять одновременно по нескольким маршрутам через разные сетевые интерфейсы. Включается параметром multipath в директиве listen.

В директиву keepalive блока upstream добавлен параметр local: для каждого блока location и server теперь можно поддерживать отдельное соединение к upstream вместо общего. Сама директива keepalive в блоке upstream теперь включена по умолчанию.

Важное изменение поведения: в режиме прокси теперь по умолчанию используется HTTP/1.1 с keep-alive. Если бэкенд поддерживает только HTTP/1.0, нужно явно вернуть старое поведение:
proxy_http_version 1.0;
proxy_set_header Connection "Close";


➡️ Источник

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека devops'a

#пульс_индустрии
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Ubuntu 26.04 LTS Beta уже доступна

Команда Ubuntu выпустила бета-версию Ubuntu 26.04 LTS с кодовым именем Resolute Raccoon. Финальный релиз запланирован на 23 апреля 2026 года.

Что изменилось относительно Ubuntu 25.10:

Ядро обновилось до версии 7.0, а рабочий стол GNOME до версии 50.

В инструментарии разработчика: LLVM 21 стал дефолтным компилятором, Rust обновился до 1.93.1, OpenJDK до версии 25, PHP до 8.5.2 с новым pipe-оператором.

В базах данных крупные апдейты: PostgreSQL 18 с новой подсистемой I/O и приростом производительности до 3× при чтении с диска, MariaDB 11.8 теперь в main с полной поддержкой.

Docker 29 с экспериментальной поддержкой nftables, containerd image store теперь дефолтный для свежих установок.

Съёмные носители теперь монтируются в /run/media вместо /media.

➡️ Источник

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека devops'a

#пульс_индустрии
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
📰 Подборка обновлений недели и не только

Последний дайджест марта, следующий выйдет уже в апреле.

Wayland 1.25

Обновление SysVinit

Обновление Ansible

5 ошибок проектирования интеграции с кафкой

Вышел Kali Linux 2026.1

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека devops'a

#дайджест_недели
Please open Telegram to view this post
VIEW IN TELEGRAM
Библиотека девопса | DevOps, SRE, Sysadmin
📰 Подборка обновлений недели и не только Последний дайджест марта, следующий выйдет уже в апреле. — Wayland 1.25 — Обновление SysVinit — Обновление Ansible — 5 ошибок проектирования интеграции с кафкой — Вышел Kali Linux 2026.1 📍 Навигация: Вакансии…
🤩 Один плагин вместо пяти команд

Знакомая ситуация: под падает в CrashLoopBackOff, и вы начинаете по очереди гонять kubectl describe pod, kubectl logs --previous, kubectl get events... и пытаетесь склеить картину в голове.

kubectl-crashloop делает это за вас одной командой:
kubectl crashloop payments-api-proglib -n production


Плагин объединяет в один терминальный отчёт:

- Warning Events из кластера
- LastTerminationState (exit code, причина, время)
- Логи предыдущего контейнера (--previous)
- Если предыдущих логов уже нет — фолбэк на текущие с пометкой

Что ещё умеет

-o json — JSON-вывод для автоматизации и incident-тулинга
--tail N — количество строк логов на контейнер
--limit N — максимум записей о крашах
-c container — ограничить вывод одним контейнером

Установка через Krew:
kubectl krew install crashloop


Базовый запуск:
kubectl crashloop payments-api-proglib


С указанием namespace:
kubectl crashloop payments-api-proglib -n production


Конкретный контейнер, больше логов:
kubectl-crashloop payments-api-6d9c9b77d9-x2n5k -n production -c api --tail 10


JSON-вывод для скриптов:
kubectl crashloop payments-api-6d9c9b77d9-x2n5k -n production -o json


Важный нюанс

Плагин работает на уровне конкретного пода, а не деплоймента. Если хотите проверить деплоймент, то выберите один из реплика-подов вручную. Это сознательное ограничение: инструмент остаётся простым и предсказуемым.

Необходимые права доступа

Минимальный набор RBAC-прав в нужном namespace:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: kubectl-crashloop
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get"]
- apiGroups: [""]
resources: ["pods/log"]
verbs: ["get"]
- apiGroups: [""]
resources: ["events"]
verbs: ["list"]


➡️ Репозиторий

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека devops'a

#арсенал_инженера
Please open Telegram to view this post
VIEW IN TELEGRAM
2🤩2👍1
🛠 [[ ]] вместо [ ] в bash не стиль, а безопасность

Одиночные скобки [ ] — это не синтаксис bash, а внешняя команда /usr/bin/[. Двойные [[ ]] — встроенная конструкция самого bash. Разница не только косметическая.

Где одиночные скобки ломаются

Пустая переменная без кавычек это синтаксическая ошибка:
name=""

# [ ] — падает с "unary operator expected"
if [ $name = "admin" ]; then

# [[ ]] — работает корректно
if [[ $name == "admin" ]]; then


Строка с пробелами без кавычек:
file="my file.txt"

# [ ] — видит два аргумента, ломается
if [ -f $file ]; then

# [[ ]] — обрабатывает как одно значение
if [[ -f $file ]]; then


Что умеют только [[ ]]

Паттерн-матчинг без внешних утилит:
filename="access.log"

if [[ "$filename" == *.log ]]; then
echo "log file"
fi


Регулярные выражения через =~:
version="2.4.1"

if [[ "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "valid semver"
fi


Логические операторы && и || внутри скобок:
# [ ] — нельзя, нужно выносить наружу
if [ "$a" = "x" ] && [ "$b" = "y" ]; then

# [[ ]] — можно внутри
if [[ "$a" == "x" && "$b" == "y" ]]; then


Одно исключение

[ ] нужен для POSIX-совместимых скриптов с #!/bin/sh — там [[ ]] не работает. Если шебанг #!/bin/bash — используйте [[ ]] везде.

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека devops'a

#root_prompt
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6😢1
🔫 Не автоматизация, а русская рулетка

--auto-approve убирает единственную паузу, которую Terraform делает перед тем, как что-то сломать — подтверждение плана. Именно там человек видит «1 to destroy» и успевает остановиться. Без этой паузы план исполняется немедленно.

Разработчик переносит ресурс из инлайн-определения в shared module. Имя ресурса меняется. Terraform видит это как «уничтожить старый, создать новый» и это корректная логика. CI-пайплайн с --auto-approve не даёт никому это увидеть до того, как база уже удалена.

# Без --auto-approve вы бы увидели это и остановились:
~ aws_security_group.web # изменить — окей
+ aws_cloudwatch_alarm.cpu # добавить — окей
- aws_db_instance.primary # УДАЛИТЬ — стоп

# С --auto-approve это уже исполняется, пока вы читаете телегу


Что делать вместо этого

Разделить plan и apply на два шага:
# Шаг 1 — сохранить план
terraform plan -out=plan.tfplan

# Шаг 2 — проверить на деструктивные операции
terraform show -json plan.tfplan | \
jq '[.resource_changes[]? | select(.change.actions[] == "delete")]'

# Шаг 3 — применить именно этот план, без новых сюрпризов
terraform apply plan.tfplan


Добавить prevent_destroy для критичных ресурсов:
resource "aws_db_instance" "primary" {
# ...
lifecycle {
prevent_destroy = true
}
}


Terraform упадёт с ошибкой ещё на этапе плана до того, как что-либо будет удалено.

Когда --auto-approve допустим

Только для эфемерной инфраструктуры: тестовые окружения, которые поднимаются и сносятся в рамках одного CI-прогона, sandbox-окружения без реальных данных.

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека devops'a

#арсенал_инженера
Please open Telegram to view this post
VIEW IN TELEGRAM
2