Библиотека девопса | DevOps, SRE, Sysadmin
10.3K subscribers
1.65K photos
75 videos
4 files
2.95K links
Все самое полезное для девопсера в одном канале.

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

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

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

РКН: https://gosuslugi.ru/snet/6798b4e4509aba56522d1787
Download Telegram
🖇 Ловим ошибки в логах по мере их появления

Когда на сервере что-то ломается, первое, что хочется сделать — открыть лог и посмотреть, что произошло. Но обычное чтение лога — это история. Нужно видеть ошибки в момент их возникновения.

Как ловить ошибки:
tail -f /var/log/syslog | grep --line-buffered "error"


tail -f — это как живая лента. Она подключается к логу и показывает новые строки по мере их добавления. Не закрывается, не переходит в историю.

grep --line-buffered "error" — выбирает из этого потока только строки, в которых есть слово error. Флаг --line-buffered важен: он говорит grep не накапливать вывод, а показывать каждую найденную строку сразу.

Вместе это работает так: лог добавляет новую строку — tail видит её — grep проверяет, нужна ли нам — если да, показывает на экран.

🤌 Бонусы для подписчиков:
Скидка 40% на все курсы Академии
Розыгрыш Apple MacBook
Бесплатный тест на знание математики

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

#root@prompt
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
⌨️ Раздаём SSH-ключи на все серверы автоматически

Представьте: у вас 50 серверов и новый разработчик в компании. Чтобы он мог подключиться ко всем серверам, нужно на каждый сервер залезть и добавить его публичный ключ в файл authorized_keys. Минут 20 монотонной работы.

Вот для этого и нужна автоматизация. Вместо ручного добавления ключей на каждый сервер, вы один раз пишете инструкцию — и она раскатывается везде одновременно.

Будем использовать Ansible. Вы описываете, что нужно сделать, и Ansible делает это на всех серверах сразу:
- name: Deploy SSH keys
hosts: all
become: yes
tasks:
- name: Add authorized key for user
authorized_key:
user: devops
key: "{{ lookup('file', 'devops.pub') }}"
state: present


Разберём по строкам:

hosts: all — команда выполнится на всех серверах, которые указаны в вашем инвентаре.

become: yes — нужны права администратора для добавления ключей. Ansible подключится с правами root или через sudo.

authorized_key — это модуль Ansible для работы с SSH-ключами. Он знает, где находится файл authorized_keys, как его редактировать, и не сломает формат.

user: devops — добавляем ключ именно для пользователя devops.

key: "{{ lookup('file', 'devops.pub') }}" — берём содержимое файла devops.pub (публичный ключ) и добавляем его. Переменная в двойных скобках — это синтаксис Ansible, он подставит содержимое файла.

state: present — значит, ключ должен быть в файле. Если его там нет, добавит. Если есть, оставит как есть.

Когда сотрудник уйдёт:
- name: Remove authorized key
authorized_key:
user: devops
key: "{{ lookup('file', 'devops.pub') }}"
state: absent


🤌 Бонусы для подписчиков:
Скидка 40% на все курсы Академии
Розыгрыш Apple MacBook
Бесплатный тест на знание математики

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

#root@prompt
Please open Telegram to view this post
VIEW IN TELEGRAM
🔄 Автоматически перезапускаем упавший сервис

Сервис упал ночью, никто не заметил, а клиенты уже час не могут подключиться. Или упал в выходной, когда все спят. Вручную проверять сервисы каждый день — это неправильно. Нужно, чтобы система сама заметила, что что-то не так, и исправила.

Вот эта команда делает ровно это: проверяет, работает ли критичный сервис, и если нет — перезапускает его
systemctl is-active --quiet nginx || systemctl restart nginx


Это одна логическая цепочка. Давайте разберёмся:

systemctl is-active --quiet nginx — проверяет, работает ли сервис nginx прямо сейчас. Флаг --quiet говорит не выводить никакую информацию на экран, просто вернуть результат: работает или не работает.

systemctl restart nginx — перезапускает сервис nginx. Остановит текущий процесс и запустит заново.

Как использовать

Самый простой способ — добавить эту команду в cron, чтобы она проверяла сервис каждую минуту:
* * * * * /usr/bin/systemctl is-active --quiet nginx || /usr/bin/systemctl restart nginx


Если используете systemd, есть более продвинутый способ — встроенный Restart в конфиге сервиса:
[Unit]
Description=Nginx Web Server

[Service]
Type=notify
Restart=on-failure
RestartSec=5s
ExecStart=/usr/sbin/nginx

[Install]
WantedBy=multi-user.target


🔹 Математика для разработки AI-моделей
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

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

#root@prompt
Please open Telegram to view this post
VIEW IN TELEGRAM
👾2
🐳 Ставим Docker одинаково на все сервера

Когда вы разворачиваете Docker на пяти серверах вручную, на каждом может получиться по-своему. На одном установилась одна версия, на другом — другая. На третьем забыли добавить репозиторий. На четвёртом пропустили зависимость.

Вот для этого и нужна автоматизация. Вы один раз описываете правильную установку Docker — и она раскатывается идентично на все серверы.

Используется всё тот же Ansible. Он подключается к каждому серверу и выполняет одни и те же команды по порядку:
- name: Install Docker
hosts: all
become: yes
tasks:
- name: Install required packages
apt:
name: "{{ item }}"
state: present
loop:
- apt-transport-https
- ca-certificates
- curl
- name: Install Docker
shell: curl -fsSL https://get.docker.com | bash


Разберём:

hosts: all — плейбук запустится на всех серверах из вашего инвентаря.

become: yes — нужны права администратора для установки пакетов.

apt: — модуль Ansible для управления пакетами в Debian/Ubuntu. Он знает, как работать с apt-get, и сделает это правильно.

loop: — устанавливает пакеты по одному: apt-transport-https, ca-certificates, curl. Они нужны, чтобы безопасно загрузить Docker.

shell: curl -fsSL https://get.docker.com | bash — официальный скрипт установки Docker от разработчиков. Он сделает все остальное: добавит репозиторий, установит Docker Engine, настроит сервис.

state: present — пакет должен быть установлен. Если его нет, установит. Если есть, проверит версию и обновит при необходимости.

После установки проверьте, что Docker работает:
- name: Verify Docker installation
shell: docker run hello-world
register: docker_test
failed_when: "'Hello from Docker!' not in docker_test.stdout"


Или добавьте проверку в конец плейбука:
- name: Check Docker status
systemd:
name: docker
state: started
enabled: yes


🔹 Программирование на языке Python
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

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

#root@prompt
Please open Telegram to view this post
VIEW IN TELEGRAM
4🌚1
💡 Linux 6.18 готов к использованию

Linux 6.18 — новый релиз ядра от Линуса Торвальдса. Несмотря на активное исправление багов в последние дни перед выпуском, разработчик считает, что ядро готово к использованию и не требует дополнительного времени на доработку.

Большинство исправлений касается драйверов, а также Bluetooth, Ceph и AFS.

➡️ Прочитать письмо Торвальдса

🔹 Математика для разработки AI-моделей
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

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

#root@prompt
Please open Telegram to view this post
VIEW IN TELEGRAM
🙏2
🖥 Смотрим загрузку CPU в реальном времени

Сервер тормозит, но вы не знаете, почему. Может, какой-то процесс сходит с ума и съедает все ресурсы? Или это просто пики нагрузки? Нужно быстро посмотреть, что происходит с процессором прямо сейчас.

Вот для этого и нужна команда, которая покажет текущую загрузку CPU:
top -b -n 1 | grep "Cpu(s)"


top — это команда, которая показывает, чем занимается система. Она выводит процессы, их загрузку, использование памяти, всё подряд.

-b — batch mode. Вместо интерактивного режима top просто выдаёт результат и завершается.

-n 1 — одна итерация. Без этого top обновлял бы данные каждую секунду.

grep "Cpu(s)" — выбирает из всего вывода только строку с информацией о CPU.

Если нужна более глубокая диагностика, есть другие команды:

Смотрим среднюю загрузку за 1, 5 и 15 минут:
uptime //14:35:22 up 10 days, 2:45, 1 user, load average: 0.45, 0.52, 0.48


Три числа в конце — это средняя нагрузка за последние 1, 5 и 15 минут.

Смотрим загрузку каждого ядра отдельно:
mpstat -P ALL 1 1


Смотрим, какой процесс больше всего грузит CPU:
ps aux --sort=-%cpu | head -10


Или используйте специализированные инструменты мониторинга вроде Prometheus или Grafana — они будут отслеживать метрики автоматически и хранить историю.

🔹 AI-агенты для DS-специалистов
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

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

#root@prompt
Please open Telegram to view this post
VIEW IN TELEGRAM
👏5
💻 Настраиваем узлы Kubernetes автоматически

Когда вы разворачиваете Kubernetes кластер вручную, нужно на каждый узел установить куча компонентов: kubeadm, kubelet, kubectl, добавить репозитории, настроить сеть, включить необходимые модули ядра.

На одном узле это полчаса работы. На десяти узлах — это часы монотонной, однообразной работы, где легко что-то забыть или неправильно сделать.

Подготовили для вас такой плейбук:
- name: Configure Kubernetes node
hosts: nodes
become: yes
tasks:
- name: Install kubeadm, kubelet, and kubectl
apt:
name: "{{ item }}"
state: present
loop:
- kubeadm
- kubelet
- kubectl


hosts: nodes — плейбук выполняется на всех серверах, которые помечены как узлы (nodes) в вашем инвентаре Ansible.

become: yes — нужны права администратора для установки пакетов и системных изменений.

apt: — модуль для управления пакетами в Debian/Ubuntu. Установит из стандартных репозиториев.

loop: — устанавливает три компонента:

• kubeadm — инструмент для инициализации и управления кластером
• kubelet — агент, который запускает контейнеры на узле
• kubectl — команда для управления Kubernetes кластером

state: present — пакеты должны быть установлены.

После установки этих компонентов узел будет готов присоединиться к кластеру Kubernetes.

🔹 Математика для разработки AI-моделей
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

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

#root@prompt
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🐳 Почему секреты в Dockerfile остаются навсегда

Хардкодить ключи и пароли в Dockerfile кажется быстрым решением, но в контейнерном мире это почти гарантированная утечка. Даже если потом удалить секрет, он уже может остаться в слоях образа, логах, кэше сборки и сторонних регистрах.

Docker строит образ послойно, и каждый слой можно просмотреть через docker history или инструменты анализа образов.

Если на каком то шаге в Dockerfile задать ENV с токеном или скопировать файл с секретами, этот слой останется в истории образа даже после последующих RUN rm и похожих команд. В результате любой, кто получил образ или доступ к реестру, может восстановить эти данные.

Надежное правило для повседневной работы простое — в Dockerfile никогда не должно быть токенов, паролей и ключей. Секреты передаются только в рантайме через env file или встроенные механизмы секретов платформы, а процесс сборки остается максимально слепым к конфиденциальным данным.

🔹 Алгоритмы и структуры данных
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

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

#root@prompt
Please open Telegram to view this post
VIEW IN TELEGRAM
🖇 Как быстро узнать публичный IP сервера

Узнать публичный айпи можно за одну строку:
curl -s ifconfig.me


Эта команда отправляет запрос к сервису ifconfig.me, который возвращает текущий внешний IP вашего сервера. Ключ -s отключает лишний вывод, чтобы показать только сам IP.

🔹 Программирование на языке Python
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

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

#root@prompt
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
👨‍💻 Как пережить переход Let’s Encrypt на 45 дней

Вот несколько вещей, которые стоит сделать уже сейчас, чтобы не ловить прод ночью без HTTPS.

1️⃣ Проверяйте срок сертификата из консоли

Для локального PEM‑файла:
openssl x509 -enddate -noout -in /path/to/cert.pem


Для сертификата, который уже стоит на сервере (через SNI):
echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null | openssl x509 -noout -enddate


Удобно обернуть это в скрипт и повесить на мониторинг, который будет ругаться, если до истечения меньше, скажем, 7 дней.

2️⃣ Автоматизируйте продление certbot

Если вы используете certbot, базовый cron может выглядеть так:
0 2 * * * /usr/bin/certbot renew --quiet --post-hook "systemctl reload nginx"


• Запускайте чаще, чем раз в 30 дней: certbot сам решит, нужно ли обновлять, но у него будет больше попыток.

• post-hook важен: Nginx (или другой веб‑сервер) должен перечитать новый сертификат.

3️⃣ Настройте acme.sh

Для тех, кто предпочитает acme.sh за лёгкость и поддержку разных провайдеров DNS:
0 0 * * * "/home/user/.acme.sh"/acme.sh --cron --home "/home/user/.acme.sh" > /dev/null


Обратите внимание

acme.sh сам следит за сроком и обновляет вовремя.

• После выпуска не забудьте один раз прописать перезагрузку сервиса, например:
/home/user/.acme.sh/acme.sh --install-cert -d example.com
--key-file /etc/ssl/example.com.key
--fullchain-file /etc/ssl/example.com.fullchain.pem
--reloadcmd "systemctl reload nginx"


4️⃣ Добавьте алерты

Даже при настроенном cron бывает, что что‑то ломается: права, DNS, лимиты CA. Хорошая практика

• В мониторинг (Prometheus, Zabbix, Grafana Agent, любой другой) добавить проверку срока сертификата.

• Завести оповещение, если осталось меньше N дней или срок истёк.

Избегайте жёстких «обновлять раз в 60 дней»

При 45‑дневных сертификатах такая логика приведёт к просрочке. Без ARI или «умных» клиентов используйте правило: обновлять примерно на 2/3 срока жизни сертификата. Для 45 дней это где‑то на 30‑й день.

Если у вас уже есть боевой контур на Let’s Encrypt, самое важное сейчас — убедиться, что:

• продление полностью автоматизировано
• веб‑сервер корректно перечитывает новые сертификаты
• есть мониторинг и алерты на срок действия

Тогда переход на более короткий срок будет почти незаметен для вас и ваших пользователей.

🔹 Математика для Data Science
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

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

#root@prompt
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍1
🌐 Как найти все открытые сетевые порты

Чтобы понять, какие порты на вашем компьютере сейчас прослушиваются и ждут подключения, можно быстро проверить все активные сетевые точки с помощью команды:
netstat -tulnp | grep LISTEN


Она показывает все открытые порты и процессы, которые их используют.

netstat -tulnp выводит список TCP и UDP портов, которые прослушиваются, а также PID соответствующих процессов.

grep LISTEN отфильтровывает этот список, показывая только порты, которые на самом деле слушают входящие соединения.

🔹 Специалист по ИИ
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

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

#root@prompt
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🖥 Автоматизация установки Jenkins

Пример плейбука для Ansible, который устанавливает Jenkins на группу серверов:
- name: Install Jenkins
hosts: cicd_servers
become: yes
tasks:
- name: Install Java
apt:
name: openjdk-11-jdk
state: present

- name: Add Jenkins repository and install
shell: |
wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
echo "deb http://pkg.jenkins.io/debian-stable binary/" | sudo tee /etc/apt/sources.list.d/jenkins.list
apt update && apt install -y jenkins


Что делает этот плейбук:

• Устанавливает нужную версию Java, обязательную для работы Jenkins.

• Добавляет официальный репозиторий Jenkins и его ключ для безопасной установки.

• Обновляет списки пакетов и устанавливает Jenkins.

🔹 ML для старта в Data Science
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

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

#root@prompt
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31
💡 Почему поды жрут друг-друга

Самая частая ошибка в K8s: Pods без CPU/memory requests/limits конкурируют несправедливо. Без лимитов один Pod может сожрать все ресурсы ноды, вызывая голодание или вытеснение других подов под нагрузкой.

Реальный кейс: Java-приложение без limits во время GC жрёт 4GB и выкидывает важные сервисы.

Плохо (нет ресурсов):
containers:
- name: app
image: myapp:latest
# а где...


Правильно. Requests для планирования, limits для защиты:
resources:
requests:
memory: "256Mi" # минимум для scheduler
cpu: "250m" # 0.25 CPU
limits:
memory: "512Mi" # максимум памяти
cpu: "500m" # максимум CPU


Ставьте ресурсы везде. Это спасёт от 90% проблем с нестабильностью кластера.

🔹 AI-агенты для DS-специалистов
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

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

#root@prompt
Please open Telegram to view this post
VIEW IN TELEGRAM
🔄 Автоматическое резервное копирование с cron

Автоматизация рутинных задач — ключ к стабильной работе серверов. Один из популярных способов — запустить задачу по расписанию с помощью cron.

Пример:
echo "0 2 * * * tar -czf /backup.tar.gz /important/data" | crontab -


Здесь:
0 2 * * * — расписание, указывающее запуск в 2:00 каждый день.
tar -czf /backup.tar.gz /important/data — создание сжатого архива с папкой /important/data.

Такой подход позволит автоматически сохранять резервные копии без вашего вмешательства.

🔹 Основы IT для непрограммистов
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

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

#root@prompt
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2😢1
⚡️ Автоматизация ротации логов и их очистки

Лог-файлы растут со временем и могут быстро заполнить дисковое пространство, если их не контролировать. Ротация логов — простой способ автоматически управлять старыми записями, сжимая и удаляя устаревшие файлы.

Пример Ansible плейбука для настройки ротации логов:
- name: Set up log rotation
hosts: all
become: yes
tasks:
- name: Configure logrotate
copy:
dest: /etc/logrotate.d/custom_logs
content: |
/var/log/*.log {
daily
rotate 7
compress
missingok
notifempty
}


Этот плейбук создаёт конфигурационный файл для logrotate с правилами:

• Логи из /var/log/ с расширением .log обрабатываются ежедневно
• Хранятся только последние 7 архивов, чтобы не захламлять диск
• Логи сжимаются для экономии пространства
• Если файлы отсутствуют, ошибок не возникает
• Пустые файлы не обрабатываются

🔹 Практический интенсив «Архитектуры и шаблоны проектирования»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

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

#root@prompt
Please open Telegram to view this post
VIEW IN TELEGRAM
💻 Проверка доступности порта на удалённом хосте

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

Используйте команду:
nc -zv example.com 443


nc (netcat) с ключами -zv проверяет открытость порта без передачи данных.

-z означает «сканировать без отправки данных».

-v включает подробный вывод, чтобы видеть результат проверки.

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

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

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

#root@prompt
Please open Telegram to view this post
VIEW IN TELEGRAM
👨‍💻 Автоматизация настройки балансировщика нагрузки HAProxy

Настройка балансировщика нагрузки — важная задача для любого масштабируемого сервиса. Автоматизация с помощью Playbook помогает быстро и без ошибок развернуть HAProxy на нужных серверах.

Пример Ansible плейбука для установки и настройки HAProxy:
- name: Install and configure HAProxy
hosts: lb_servers
become: yes
tasks:
- name: Install HAProxy
apt:
name: haproxy
state: present

- name: Configure HAProxy
template:
src: haproxy.cfg.j2
dest: /etc/haproxy/haproxy.cfg


Пример шаблона haproxy.cfg.j2 с базовыми настройками:
    log /dev/log local0
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
user haproxy
group haproxy
daemon

defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms

frontend http_front
bind *:80
default_backend http_back

backend http_back
balance roundrobin
server web1 192.168.1.101:80 check
server web2 192.168.1.102:80 check


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

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

#root@prompt
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21
📎 Простой скрипт для мониторинга ресурсов системы

Для девопсов важно оперативно отслеживать загрузку CPU и использование памяти, чтобы вовремя реагировать на проблемы с производительностью.

Небольшой Python-скрипт с библиотекой psutil поможет быстро контролировать эти показатели:
import psutil

def check_system_resources():
cpu_usage = psutil.cpu_percent(interval=1)
memory_usage = psutil.virtual_memory().percent

if cpu_usage > 80:
print(f"High CPU usage: {cpu_usage}%")
if memory_usage > 80:
print(f"High Memory usage: {memory_usage}%")

check_system_resources()


Что делает скрипт:

• Измеряет загрузку процессора за 1 секунду
• Проверяет процент занятой оперативной памяти
• При использовании CPU или памяти выше 80% выводит предупреждение

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

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

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

#root@prompt
Please open Telegram to view this post
VIEW IN TELEGRAM
3😁3🌚1
🌐 Cтандартизация правил файрвола

Защита серверов — обязательный элемент работы любой инфраструктуры. Настройка правил файрвола с помощью Ansible Playbook помогает быстро и единообразно обезопасить все серверы.

Пример плейбука для конфигурации UFW:
- name: Configure UFW Firewall Rules
hosts: all
become: yes
tasks:
- name: Allow SSH
ufw:
rule: allow
port: '22'
proto: tcp

- name: Allow HTTP and HTTPS
ufw:
rule: allow
port: '{{ item }}'
proto: tcp
loop:
- 80
- 443

- name: Enable UFW
ufw:
state: enabled
policy: deny


Что делает этот плейбук:

• Разрешает входящие соединения по SSH (порт 22)
• Открывает HTTP (80) и HTTPS (443) для веб-трафика
• Включает UFW с политикой блокировки всех остальных подключений по умолчанию

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

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

#root@prompt
Please open Telegram to view this post
VIEW IN TELEGRAM
5😁1