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

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

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

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

РКН: https://gosuslugi.ru/snet/6798b4e4509aba56522d1787
Download 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
🛠 Куча папок за одну команду

Новичок в shell-скриптинге рассуждает логично: создам папку через mkdir. Просто же. Запускает:
mkdir /app/data/logs/2025/01/17


mkdir создаёт только последнюю папку в цепочке. Если пути не существует, то ничего не сработает. Нужно создавать по одной:
mkdir /app
mkdir /app/data
mkdir /app/data/logs
mkdir /app/data/logs/2025
mkdir /app/data/logs/2025/01
mkdir /app/data/logs/2025/01/17


Спасает один флаг:
mkdir -p /app/data/logs/2025/01/17


Все папки создаются сразу. Как по волшебству. Eсли какая-то из папок уже существует, mkdir -p не будет ругаться. Просто пропустит её.

Флаг -v выведет список всех созданных папок. Полезно при отладке:
mkdir -pv /app/data/logs


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

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

#root@prompt
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🥱2
🔒 Установка SSL сертификата с Certbot через Ansible

Безопасность веб-приложений начинается с правильной настройки SSL/TLS. Let’s Encrypt предлагает бесплатные сертификаты, а их развёртывание можно автоматизировать с помощью Certbot.

Пример простого плейбука для установки и настройки SSL на серверах с Nginx:
- name: Install and configure Let's Encrypt SSL
hosts: web_servers
become: yes
tasks:
- name: Install Certbot
apt:
name: certbot
state: present

- name: Obtain SSL certificate
shell: certbot certonly - standalone -d example.com -email admin@example.com -agree-tos -non-interactive

- name: Configure Nginx to use SSL
template:
src: nginx_ssl.conf.j2
dest: /etc/nginx/sites-available/default
notify:
- Restart Nginx

handlers:
- name: Restart Nginx
systemd:
name: nginx
state: restarted


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

• Устанавливает Certbot — инструмент для автоматической работы с сертификатами Let’s Encrypt.

• Получает SSL-сертификат для домена example.com в безголовом режиме non-interactive.

• Копирует шаблон конфигурации nginx_ssl.conf.j2 для включения SSL в настройках Nginx.

• Перезапускает Nginx, чтобы применить новые настройки.

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

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

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

#root@prompt
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
💿 Мониторинг использования диска с оповещением

Маленький скрипт на Python помогает быстро отслеживать заполненность диска и предупреждать, если она превышает критический порог.

Пример простого скрипта:
import shutil

def check_disk_usage(path="/"):
total, used, free = shutil.disk_usage(path)
usage_percentage = (used / total) * 100

if usage_percentage > 80:
print(f"Warning! Disk usage is {usage_percentage:.2f}%")

check_disk_usage()


Как это работает:

• Используется стандартный модуль shutil и функция disk_usage, возвращающая общий, использованный и свободный объем на диске по указанному пути.

• Рассчитывается процент использования диска.

• Если занято больше 80%, скрипт выводит предупреждение с текущим процентом.

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

Для более сложных сценариев можно адаптировать скрипт, добавив отправку уведомлений на email или в чат, хранение логов и периодический запуск через cron.

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

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

#root@prompt
Please open Telegram to view this post
VIEW IN TELEGRAM
🔒 Автоматизация усиления безопасности Linux серверов

Защита Linux серверов требует комплексного подхода: отключение входа под root через SSH, установка политики смены паролей и защита от брутфорс атак с помощью fail2ban — базовые меры, снижающие риски взлома и обеспечивающие контроль доступа

Пример базового playbook, реализующего эти меры:
- name: Apply Security Hardening
hosts: all
become: yes
tasks:
- name: Disable root SSH login
lineinfile:
path: /etc/ssh/sshd_config
regexp: '^PermitRootLogin'
line: 'PermitRootLogin no'
notify: Restart SSH

- name: Set password expiration policy
lineinfile:
path: /etc/login.defs
regexp: '^PASS_MAX_DAYS'
line: 'PASS_MAX_DAYS 90'

- name: Install fail2ban
apt:
name: fail2ban
state: present

handlers:
- name: Restart SSH
systemd:
name: ssh
state: restarted


В дальнейшем можно расширять playbook настройками firewall, аудитом и обновлениями, ограничением прав или внедрением систем шифрования.

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

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

#root@prompt
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5😁1
🛠 Ctrl + любая буква

Сохраняйте себе шпаргалку по всем командам с

Ctrl+A перемещает курсор в начало текущей строки.

Ctrl+E переносит курсор в конец строки.

Ctrl+R открывает поиск по истории команд, печатаете фрагмент и терминал подставляет совпадения.

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

Ctrl+стрелка влево двигает курсор на одно слово назад, удобно возвращаться к предыдущему параметру.

Ctrl+U вырезает все от текущей позиции курсора до начала строки и помещает в буфер, потом это можно вставить через Ctrl+Y.

Ctrl+F двигает курсор на один символ вперед, аналог обычной стрелки вправо.

Ctrl+B двигает курсор на один символ назад, аналог стрелки влево.

Ctrl+L очищает экран, как команда clear, оставляя текущую строку ввода внизу.

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

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

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

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

С этим поможет скрипт на Python:
import subprocess

SERVICE_NAME = "nginx"

def restart_service():
try:
status = subprocess.run(
["systemctl", "is-active", SERVICE_NAME],
capture_output=True,
text=True,
)

if "inactive" in status.stdout or "failed" in status.stdout:
print(f"{SERVICE_NAME} is down! Restarting...")
subprocess.run(["systemctl", "restart", SERVICE_NAME], check=True)
print(f"{SERVICE_NAME} restarted successfully.")
else:
print(f"{SERVICE_NAME} is running fine.")
except Exception as e:
print(f"Error checking service: {e}")

if __name__ == "__main__":
restart_service()


systemctl is-active возвращает состояние сервиса, по которому вы определяете, нужно ли его перезапускать.

При падении юнита скрипт выполняет systemctl restart nginx и сообщает в stdout об успешном запуске.

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

• Положите скрипт, например, в /usr/local/bin/check-nginx.py и сделайте его исполняемым.

• Добавьте cron‑задание * * * * * /usr/bin/python3 /usr/local/bin/check-nginx.py чтобы проверять сервис каждую минуту.

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

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

#root@prompt
Please open Telegram to view this post
VIEW IN TELEGRAM
2
⭐️ Terragrunt упрощает Terraform без дублирования

Terraform хорош для IaC, но в больших проектах код копируется по регионам и окружениям. Terragrunt решает это через terragrunt.hcl поверх main.tf.

В папке с main.tf добавьте terragrunt.hcl. Вместо terraform init && apply пишите terragrunt apply. Auto-init сам подтянет провайдеры, работает с Terraform/OpenTofu.

Пример:
# main.tf
variable "content" {}
resource "local_file" "file" { content = var.content; filename = "hi.txt" }


# terragrunt.hcl
inputs = { content = "from terragrunt" }


terragrunt apply создаст .terragrunt-cache (в .gitignore) и файл.

Вынесите логику в shared/main.tf с переменными. В env/ terragrunt.hcl:
terraform { source = "../shared" }
inputs = { content = "env-specific"; output_path = "${get_terragrunt_dir()}/hi.txt" }


Логика одна, запускайте из dev/prod. Backend/provider дубли не нужны — Terragrunt генерит.

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

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

#root@prompt
Please open Telegram to view this post
VIEW IN TELEGRAM
3🥱2