Admin Future
239 subscribers
50 photos
1 video
4 files
87 links
Превращаем эникейщиков в System Architects.
🚀 Твой навигатор в мире IT-инфраструктуры:

▪️ Hard Skills: Linux, Windows, Network, Security
▪️ Tools: Лучший софт и скрытые фишки
▪️ Mindset: Как думать, чтобы платили много


Админ - @maksimshap
Download Telegram
🧠 Skills: Метод USE — священный грааль диагностики

Когда сервер «ложится», паника заставляет админа тыкать во все команды подряд: top , free , ping . Остановитесь. Брендан Грегг (гуру производительности) придумал метод USE, который работает для любой системы, будь то Linux, Windows, SQL или микроволновка.

Для каждого ресурса (CPU, Диск, Память, Сеть) вы должны проверить три параметра:

1. Utilization (Утилизация): Насколько ресурс занят? (в 😵
* Пример: Диск занят на 90%.
2. Saturation (Насыщение): Есть ли очередь из тех, кто не может получить ресурс?
* Пример: Очередь диска (await) выросла.
3. Errors (Ошибки): Есть ли аппаратные или логические сбои?
* Пример: I/O errors в логах контроллера.

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

#skills #troubleshooting #brendangregg #performance #methodology #admin #career
🐚 Bash: Шаблон «Пуленепробиваемого» скрипта

90% админских скриптов падают молча.
Например, cd /wrong/path не сработал, а следующая команда rm -rf * удалила всё в корне (утрирую, но суть ясна). В 2026 году мы используем Bash Strict Mode и Traps.

Код для начала любого скрипта:

#!/bin/bash
set -euo pipefail
IFS=$'\n\t'

# Функция очистки при выходе (даже аварийном)
cleanup() {
echo "🧹 Убираем мусор..."
rm -f /tmp/temp_*.txt
}

# Trap ловит сигналы выхода (EXIT, ошибка, Ctrl+C)
trap cleanup EXIT

echo "🚀 Начинаем работу..."
# Ваш код

Разбор магии:

1. set -e: Скрипт умрет сразу, если любая команда вернет ошибку.
2. set -u: Запрещает использовать пустые переменные (спасает от rm -rf /$UNDEFINED_VAR).
3. set -o pipefail: Ловит ошибки даже в середине конвейера (grep | awk).
4. trap: Гарантированно выполнит функцию cleanup, даже если скрипт упадет с ошибкой.

Это база. Не пишите в прод без этого хедера.

#linux #bash #scripting #devops #bestpractices #automation
PowerShell: Настоящая многопоточность с -Parallel

В старых версиях PowerShell (5.1) мы страдали с Start-Job (медленно) или Runspaces (сложно).
В PowerShell 7+ (который к 2026 году должен стоять везде) циклы ускоряются в 10-50 раз одной опцией.

Задача: Пингaнуть 100 серверов или проверить службу.
Обычный foreach будет делать это последовательно 5 минут.

Решение 2026 года:

$servers = 1..100 | ForEach-Object { "Server-$_" }

# Запускаем в 10 потоков одновременно
$results = $servers | ForEach-Object -Parallel {
# Внутри этого блока - отдельный поток
$s = $_
$check = Test-NetConnection -ComputerName $s -Port 443 -WarningAction SilentlyContinue

# Возвращаем объект (а не текст!)
[PSCustomObject]@{
Server = $s
Port443 = $check.TcpTestSucceeded
Time = (Get-Date).ToString("HH:mm:ss")
}
} -ThrottleLimit 10

# Красивый вывод
$results | Format-Table -AutoSize

Фишка: Параметр -ThrottleLimit регулирует нагрузку на вашу машину.
Это самый простой способ ускорить рутину админа.

#windows #powershell #scripting #performance #automation #sysadmin
🧠 Skill: JSON — универсальный клей админа

Раньше мы грепали текст (grep | awk).
В 2026 году, когда вокруг Docker, Kubernetes и REST API, вывод почти всегда можно получить в JSON.
Парсить JSON как текст — это путь к ошибкам.

Учимся работать с объектами, а не строками:

🐧 Linux (jq): Не делайте grep "status", делайте:

curl -s https://api.site.com/health | jq '.services[] | select(.status=="down") | .name'

(Выведет имена только упавших сервисов).

🪟 PowerShell: Здесь JSON становится родным объектом .NET автоматически:

$data = curl https://api.site.com/health | ConvertFrom-Json $data.services | Where-Object { $_.status -eq 'down' } | Select-Object name

Совет: Если консольная утилита имеет флаг --json (как kubectl, aws cli, docker), всегда используйте его для скриптов. Это делает вашу автоматизацию неубиваемой при смене форматирования вывода разработчиками.

#skills #json #jq #powershell #bash #devops #api
👍2🔥2👏1
🐧 Bash: Умная очистка логов без риска убить систему

Частая ошибка админа — удалять логи командой rm. Если сервис продолжает писать в файл, место на диске не освободится (файл останется "призраком"), пока сервис не рестартанут. 👻 Правильный путь — обнуление через перенаправление.

Скрипт-однострочник для безопасной очистки:

#!/bin/bash
# Находим все логи больше 500Мб в /var/log и обнуляем их содержимое
find /var/log -type f -name "*.log" -size +500M -exec sh -c '> "{}"' \;

echo " Тяжелые логи обнулены, дескрипторы сохранены!"

Почему это OK:

1. > "{}" — очищает содержимое файла, но оставляет сам файл на месте.
2. Сервис (nginx, mysql) не теряет связь с файлом и продолжает писать в него без рестарта.
3. Система мгновенно видит свободное место. 📦

#linux #bash #sysadmin #automation #storage #server_cleanup 🛠️
1
🧠 Skill: MTR — "Швейцарский нож" сетевой диагностики

Забудь про обычный ping или traceroute.
Когда клиент говорит "интернет тормозит", тебе нужен MTR (My Traceroute).
Он объединяет пинг и трассировку, показывая потери пакетов на каждом прыжке (hop) в динамике. 📈

Как читать вывод mtr:

Запусти:

mtr -rw google.com

Смотри на колонку Loss %:

* Если потери только на 1-2 прыжке — проблема в локалке или у провайдера.
* Если потери только в середине и дальше пропадают — это ICMP rate limiting (не страшно).
* Если потери начались на 5-м прыжке и идут до самого конца — ты нашел проблемный узел. 🎯
* Команда для Linux: sudo apt install mtr -y && mtr 8.8.8.8 Для Windows: Рекомендую форк WinMTR-Redux.

Умение читать графики MTR — это навык, который отделяет админа-новичка от сетевого инженера. 👨‍💻

#networking #mtr #troubleshooting #skills #sysadmin #devops 🌐
2🔥2👍1
🐧 Bash: Параллельный запуск задач без боли и GNU Parallel

Многие админы не знают, что для параллельного выполнения задач в скриптах не обязательно ставить тяжелые утилиты. В Bash есть встроенный механизм управления фоновыми процессами через wait. Это маст-хэв, когда нужно, например, одновременно проверить доступность 50 хостов или сжать 20 папок с логами. 📦

Пример «умного» скрипта:

#!/bin/bash

targets=("192.168.1.1" "192.168.1.2" "192.168.1.3") # и так далее

for ip in "${targets[@]}"; do
(
if ping -c 1 -W 1 "$ip" > /dev/null; then
echo " $ip доступен"
else
echo " $ip лежит"
fi
) & # Запуск в фоне
done

wait # Ждем завершения всех фоновых задач
echo "🎯 Все проверки завершены!"

Почему это OK:

1. Скорость: Скрипт выполняется за время самого долгого пинга, а не по очереди.
2. Простота: Никаких лишних зависимостей.
3. Контроль: Команда wait гарантирует, что скрипт не пойдет дальше, пока все «хвосты» не закроются.

#linux #bash #automation #sysadmin #performance #scripting 🛠️
PowerShell: Ищем «тяжелые» файлы быстрее, чем проводник

Когда на диске Windows Server внезапно заканчивается место, стандартный поиск Windows — это мучение. 🐌 Через PowerShell можно выудить список самых больших файлов за считанные секунды и сразу отсортировать их.

Полезный скрипт для поиска ТОП-10 тяжеловесов:

# Ищем файлы больше 500Мб в папке C:\Shares
$path = "C:\Shares"
Get-ChildItem -Path $path -Recurse -File -ErrorAction SilentlyContinue |
Sort-Object Length -Descending |
Select-Object Name, @{Name="Size(GB)";Expression={$_.Length / 1GB}}, Directory |
Select-Object -First 10 |
Format-Table -AutoSize

Write-Host "📊 Сканирование завершено. Время чистить диски!" -ForegroundColor Cyan

Фишка: Параметр -ErrorAction SilentlyContinue позволяет скрипту не спотыкаться на системных папках, куда у админа нет доступа, и продолжать поиск. Вывод в гигабайтах сразу дает понять масштаб бедствия. 📈

#windows #powershell #sysadmin #storage #cleanup #automation 🧹
1👍1🔥1👏1
🌐 Networking: DNS-over-HTTPS (DoH) в Linux — приватность уровня 2026

В 2026 году обычный DNS-трафик (порт 53) — это открытая книга для любого, кто сидит на транзите. Если хочешь скрыть свои запросы от посторонних глаз и защититься от подмены DNS, пора переходить на DoH. В современных дистрибутивах (Ubuntu 24.04+/Debian 13+) это настраивается через systemd-resolved. 🔐

Как включить за 1 минуту:

Отредактируй конфиг: sudo nano /etc/systemd/resolved.conf

Добавь или измени строки:

[Resolve]
DNS=1.1.1.1#cloudflare-dns.com
DNSOverHTTPS=yes

Перезапусти службу: sudo systemctl restart systemd-resolved

Как проверить: resolvectl status — в строке "Protocols" должно появиться +DoH.

Теперь твои DNS-запросы зашифрованы внутри обычного HTTPS-трафика. Провайдер видит, что ты куда-то ходишь, но не знает, на какие именно домены. 🕵️‍♂️

#networking #security #linux #doh #privacy #sysadmin #dns 🛡️
🔥1
🐧 Bash: Проверка SSL-сертификатов до того, как они «протухнут»

Пятница — идеальный день, чтобы проверить, не отвалится ли какой-нибудь домен в субботу утром. 📉 Вместо того чтобы заходить на сайты руками, напишем скрипт, который массово проверяет даты истечения через openssl.

Полезный скрипт для списка доменов:

#!/bin/bash
# Список доменов для проверки
DOMAINS=("google.com" "github.com" "my-company.ru")

echo " Проверка сертификатов..."
for domain in "${DOMAINS[@]}"; do
expiration_date=$(echo | openssl s_client -servername "$domain" -connect "$domain":443 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2)

# Переводим в формат timestamp для сравнения
exp_epoch=$(date -d "$expiration_date" +%s)
now_epoch=$(date +%s)
days_left=$(( ($exp_epoch - $now_epoch) / 86400 ))

if [ $days_left -lt 7 ]; then
echo "🚨 $domain: ОСТАЛОСЬ ВСЕГО $days_left ДНЕЙ!"
else
echo " $domain: еще $days_left дней"
fi
done

Почему это маст-хэв: Этот скрипт можно легко обернуть в телеграм-бота, чтобы получать алерты, если до истечения осталось меньше 10 дней. Безопасность — это когда всё работает тихо. 🤫

#linux #bash #ssl #security #automation #sysadmin #devops 🔐
PowerShell: Как узнать, кто удалил файл на сетевом диске?

«Я ничего не трогал, оно само исчезло!» — классика. 🤡 Если в Active Directory включен аудит доступа к объектам, PowerShell поможет быстро найти виновника без долгого копания в Event Viewer.

Скрипт для поиска события удаления (Event ID 4660):

# Укажите время, за которое ищем логи (последние 24 часа)
$TimeFilter = (Get-Date).AddDays(-1)

$Events = Get-WinEvent -FilterHashtable @{
LogName = 'Security'
ID = 4660
StartTime = $TimeFilter
} -ErrorAction SilentlyContinue

foreach ($Event in $Events) {
[xml]$EventXml = $Event.ToXml()
$User = $EventXml.Event.EventData.Data | Where-Object { $_.Name -eq 'SubjectUserName' } | Select-Object -ExpandProperty '#text'
$Time = $Event.TimeCreated

Write-Host "🗑️ Файл был удален пользователем: $User в $Time" -ForegroundColor Red
}

Нюанс: Чтобы это работало, на нужной папке в свойствах безопасности (вкладка «Аудит») должен быть включен аудит на удаление.

#windows #powershell #security #audit #active_directory #sysadmin 📂
🧠 Skill: Протокол SSH Multiplexing — ускоряем работу в 10 раз

Если ты часто прыгаешь по одним и тем же серверам, то знаешь, как бесит ждать 2-3 секунды, пока SSH установит соединение. В 2026 году админы используют Multiplexing, чтобы переиспользовать уже открытое TCP-соединение для новых сессий. 🚀

Как настроить в своем ~/.ssh/config:

Host *
ControlMaster auto
ControlPath ~/.ssh/sockets/%r@%h-%p
ControlPersist 10m

Что это дает:
1. Первое подключение: Обычное (ввод пароля/ключа).
2. Второе и последующие: Мгновенное открытие консоли (0.1 сек).
3. ControlPersist 10m: Соединение будет висеть в фоне 10 минут после закрытия последней сессии, чтобы ты мог вернуться мгновенно.

Это критически ускоряет работу Ansible и твоих собственных Bash-скриптов, которые ходят по серверам. 🏎️

#skills #ssh #linux #performance #sysadmin #productivity #automation 🌐
🏛️ Пятничный лонгрид: Искусство «ленивого» админа или почему твоя документация — это код

Все мы знаем классику: админ, который работает 24/7, постоянно в мыле и с красными глазами, считается «героем». Но в 2026 году настоящий герой — это тот, кто в пятницу вечером спокойно пьёт кофе, потому что его инфраструктура умеет «лечить» сама себя. 🧘‍♂️

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

1. Документация в стиле README.md
Забудь про Word-файлы в папке «Общее». Если инструкции нет в Git-репозитории рядом с кодом или скриптами — её не существует.

Правило: Любое изменение в системе = коммит в репозиторий с описанием.

Инструмент: Изучи Obsidian или Logseq для личной базы знаний (Zettelkasten). Это позволяет связывать ошибки (например, «Падение БД») с их решениями графами связей.

2. Bash/PowerShell как «внешняя память»
Если ты ввел команду в консоли дважды — запиши её в скрипт. Если трижды — параметризируй её (сделай переменные).

Bash: Используй history | grep "что-то_сложное", чтобы вспомнить тот самый длинный конвейер из awk и sed, который ты мучил в прошлый вторник.

PowerShell: Создай свой модуль MyCompany.Utils.psm1 и храни там функции для сброса паролей, очистки квот и выгрузки отчетов.

3. Сетевая топология — карта твоего мира
Самый быстрый способ найти проблему в сети — взглянуть на актуальную схему. Но рисовать её в Visio руками — это ад. В 2026-м мы используем Diagrams as Code.

Попробуй Mermaid.js: Ты просто пишешь текст, а Git-лаборатория или Obsidian рисуют схему:

graph TD
User-->Internet
Internet-->Firewall[pfsense]
Firewall-->Switch(L3 Switch)
Switch-->Server1[Proxmox Node 1]
Switch-->Server2[Proxmox Node 2]
Server1-->VM1[Nginx Proxy]

🚀 Пятничный совет «на миллион»:
Прежде чем уйти домой, проверь три вещи:

* Бэкапы: Зайди и посмотри глазами, что сегодняшний бэкап весит не 0 байт.

* Snapshot-ы: Удали старые снапшоты виртуалок. В понедельник они превратятся в «тормоза» дисковой подсистемы.

* Уведомления: Убедись, что телефон не в режиме «Не беспокоить» для критических алертов от Zabbix/Grafana.

Помни: Лучший сисадмин — это тот, чьего имени в компании не знают, потому что «всё просто работает».

Хороших выходных, коллеги! И пусть ваш uptime стремится к бесконечности. 📈

#friday #longread #sysadmin #lifehack #documentation #automation #admin_future #it_culture
💿 Windows Storage: Как вычислить «паршивую овцу» в дисковом массиве?

Бывает, что сервер или кластер (S2D) начинает безбожно тупить, но все статусы светятся зеленым «Healthy». В 90% случаев проблема в одном диске, который еще не сдох, но уже «тормозит» весь массив огромными задержками (latency). 🐌

Стандартный мониторинг это часто пропускает, поэтому лезем под капот к счетчикам надежности (Reliability Counters).

🛠 Скрипт для поиска проблемных дисков:

Get-PhysicalDisk | ForEach-Object {
$disk = $_
$stats = $disk | Get-StorageReliabilityCounter

# Пытаемся выцепить имя узла (актуально для кластеров)
$NodeName = "Unknown"
if ($disk.FriendlyName -like "*.*") {
$NodeName = $disk.FriendlyName.Split(".")[1]
}

[PSCustomObject]@{
Node = $NodeName
Model = $disk.Model
MediaType = $disk.MediaType
SerialNumber = $disk.SerialNumber

# Конвертация: 100 наносекунд -> миллисекунды
ReadLatMax_ms = [math]::Round($stats.ReadLatencyMax / 10000, 2)
WriteLatMax_ms = [math]::Round($stats.WriteLatencyMax / 10000, 2)

ReadErrors = $stats.ReadErrorsTotal
WriteErrors = $stats.WriteErrorsTotal
}
} | Sort-Object WriteErrors, WriteLatMax_ms -Descending | Format-Table -AutoSize


📊 Как читать результат (нормативы):

1. Read/WriteLatMax_ms: Это пиковая задержка в миллисекундах.
* SSD: Норма до 20ms. Пики > 50ms — повод напрячься.
* HDD: Норма до 200ms. Пики > 1000ms (1 сек) — диск «умирает» или перегружен. 🐢

2. Read/WriteErrors: В идеальном мире здесь должен быть 0. Любое число больше нуля — это ошибки чтения/записи. Пора проверять кабели, бэкплейн или готовить замену диску. 🛠

💡 Когда запускать?

* Когда SQL или 1С начинают «фризить» без видимых причин. 📉
* При регламентном объезде серверов раз в месяц.
* Если диск периодически отваливается из RAID-массива.

Этот скрипт — твой рентген для дисковой подсистемы. Сохраняй в шпаргалки! 📝

#windows #powershell #storage #sysadmin #troubleshooting #s2d #hardware 🛡
👍3🔥1👏1
🐧 Linux: Спасаем базу данных от OOM Killer

Бывало такое?
Серверу не хватило памяти, пришел OOM Killer (Out of Memory) и убил... нет, не зависший PHP-скрипт, а твой основной PostgreSQL.
💀 Почему? Потому что БД потребляет больше всего памяти, и для ядра она выглядит как самый "жирный" кандидат на расстрел.

Решение: Настроить oom_score_adj. Это число от -1000 (бессмертный) до +1000 (убить первым).

Как защитить критический процесс: Находим PID процесса (например, postgres):

pgrep -f postgres | head -1

Запрещаем OOM Killer'у трогать его (ставим -1000):

echo -1000 > /proc/[PID]/oom_score_adj

Как сделать это вечным (в systemd): Добавьте в unit-файл сервиса (systemctl edit postgresql):

[Service]
OOMScoreAdjust=-900

Теперь, когда память кончится, Linux убьет веб-сервер, кэш, SSH-сессию, но база данных останется стоять до последнего.

#linux #kernel #oom #postgresql #sysadmin #reliability #systemd 🛡️
🪟 Windows: Кто «стучит» в интернет? Ловим malware без Wireshark

Подозрение, что сервер соединяется с C&C-сервером хакеров или майнинг-пулом? Wireshark ставить нельзя, а Firewall логи слишком объемные. В Windows есть скрытый журнал, который пишет только DNS-запросы.

Как включить «черный ящик» DNS: По умолчанию этот лог выключен, чтобы не тратить ресурс.

Открываем Event Viewer (eventvwr.msc).

Идем: Applications and Services Logs -> Microsoft -> Windows -> DNS Client Events -> Operational.

Правой кнопкой -> Enable Log.

Что мы увидим: Теперь каждое разрешение имени (хост -> IP) будет падать в событие ID 3008.
QueryOptions: 100000000 QueryName: bad-hacker-site.com

Это лучший способ найти скрытые майнеры или «маячки» внутри корпоративной сети, не перехватывая гигабайты трафика.

#windows #security #forensics #dns #sysadmin #troubleshooting #blueteam 🕵️‍♂️
🔥32👍2
🌐 Networking: Headscale — свой Mesh-VPN без чужих облаков

Классические VPN (OpenVPN/IPsec) с их "звездой" и единой точкой отказа в 2026 году выглядят архаично.
Все переходят на Tailscale (Mesh-сеть на базе WireGuard), но админы боятся использовать чужие контроллеры управления.

Твой выбор: Headscale.
Это Open Source реализация контроллера Tailscale, которую ты хостишь у себя.

В чем соль:

NAT Traversal: Тебе не нужно открывать порты. Устройства находят друг друга за любыми NAT-ами (используя STUN/DERP).

Mesh:
Трафик идет от сервера А к серверу Б напрямую (P2P), а не через центральный шлюз.

ACL:
Ты управляешь доступом через JSON-правила (кто кого видит).

Команда для регистрации клиента: tailscale up --login-server https://vpn.tvoja-kompaniya.ru --authkey [KEY]

Это идеальная замена корпоративному VPN для удаленщиков и связи между серверами в разных облаках.

#networking #vpn #wireguard #headscale #opensource #devops #privacy 🕸️
👍3🔥1👏1
🐧 Linux: Ошибка "Read-only file system"? Спасаем данные без ребута 🛠️

Страшный сон админа: файловая система внезапно ушла в read-only из-за ошибок в логах или сбоя питания.
Сервисы встали, база упала. Прежде чем бежать за новым диском, можно попробовать «пересобрать» её на лету.

Шаг 1: Проверяем, что случилось

dmesg | grep -i "error|jbd2"

тут будет причина (обычно битые блоки или сбой журнала).

Шаг 2: Магия перемонтирования Если диск физически жив, можно принудительно вернуть ему режим записи:

mount -o remount,rw /

Шаг 3: Исправление «на ходу» (для ext4) fsck -n /dev/sda1 — только проверка (без правок). Если ошибок много, используем debugfs для вытаскивания критичных конфигов, пока диск окончательно не «отвалился».

Совет: Если такое случилось на виртуалке, проверь задержки (latency) на СХД — часто диск уходит в RO, если гипервизор не ответил вовремя. 📡

#linux #filesystem #troubleshooting #sysadmin #ext4 #storage
🪟 Windows: Отключаем "Search Highlights" и лишний мусор через реестр 🧹

Заметили, как поиск в Windows 11/Server 2025 стал забиваться картинками, новостями и рекламой ("Search Highlights")? Это не только бесит, но и жрет ресурсы процесса SearchHost.exe. Для админской машины это лишний мусор.

Убираем всё лишнее одной командой в PowerShell:

# Отключаем интернет-результаты в поиске и "интересные факты"
$path = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Search"
Set-ItemProperty -Path $path -Name "BingSearchEnabled" -Value 0
Set-ItemProperty -Path $path -Name "SearchboxTaskbarMode" -Value 0

# Отключаем Search Highlights (те самые картинки в поиске)
$path2 = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\Windows Search"
if (!(Test-Path $path2)) { New-Item $path2 -Force }
Set-ItemProperty -Path $path2 -Name "EnableAllowedDaysCondition" -Value 0

Результат: Чистый, быстрый поиск только по локальным файлам и приложениям. Минимум сетевого трафика в сторону Bing.

#windows #registry #powershell #optimization #sysadmin #clean #windows11
4
🧠 Skill: "Terraform Drift Detection" — навык №1 в 2026 году ☁️

В эпоху IaC (Infrastructure as Code) самая большая проблема — это Drift (отклонение).
Это когда кто-то зашел в консоль AWS/Azure/Yandex руками и поменял тип инстанса или открыл порт, а в коде Terraform осталось старое значение.

Почему это опасно: При следующем запуске terraform apply твои ручные правки либо затрутся, либо всё упадет с ошибкой.

Что учить:

1. Terraform Plan Automation: Настрой запуск terraform plan в CI/CD раз в час.

2. Инструменты: Посмотри в сторону Driftctl или встроенного режима --refresh-only.

3. Команда для проверки "разрыва" между кодом и реальностью: terraform plan -refresh-only

Умение находить и устранять такие расхождения без даунтайма — это то, за что сегодня платят Senior DevOps инженерам. 🚀

#devops #terraform #iac #cloud #skills #automation #gitops