xargs: или как заставить одну команду работать с тысячей аргументов
Вывод
➤ Массовое удаление:
(Найди все .tmp файлы и передай их имена команде
➤ Параллельный запуск:
(
➤ Для сложных имен (с переносами и пробелами):
(
А вы используете xargs?
🌐 @helcode | #linux
Вывод
ls, find или grep часто нужно скормить другой команде (например, rm или mv). Но большинство утилит не принимают вход из пайпа. xargs — это мост между ними.➤ Массовое удаление:
find . -name "*.tmp" | xargs rm -f(Найди все .tmp файлы и передай их имена команде
rm)➤ Параллельный запуск:
cat urls.txt | xargs -P 5 -I {} curl -O {}(
-P 5 запустит 5 параллельных закачек curl)➤ Для сложных имен (с переносами и пробелами):
find . -name "*.log" -print0 | xargs -0 ls -la(
-print0 и -0 используют нулевой байт как разделитель — это безопасно)xargs берет элементы из стандартного ввода, формирует из них аргументы и подставляет в указанную команду.А вы используете xargs?
🌐 @helcode | #linux
👍5
Идемпотентность: почему ваш скрипт должен быть как кнопка лифта?
Представьте: Вы запускаете скрипт деплоя второй раз, потому что первый завис. А он вместо того, чтобы понять, что все уже готово, начинает все с начала и ломает систему. Знакомо? Этого избегают идемпотентные скрипты.
Идемпотентность — это свойство операции, позволяющее применять её многократно без изменения результата beyond the initial application. Проще: сколько бы раз вы не нажимали кнопку вызова лифта — он приедет только один раз.
Пример:
➤ НЕ идемпотентно:
➤ Идемпотентно:
➤ Идемпотентно в Ansible: пакетные менеджеры (apt, yum) или модули копирования файлов по умолчанию идемпотентны. Они проверяют текущее состояние и меняют его только если нужно.
А вы задумываетесь об идемпотентности своих скриптов? Какие трюки используете (проверка флагов, lock-файлы)? Делитесь лайфхаками!
🌐 @helcode
Представьте: Вы запускаете скрипт деплоя второй раз, потому что первый завис. А он вместо того, чтобы понять, что все уже готово, начинает все с начала и ломает систему. Знакомо? Этого избегают идемпотентные скрипты.
Идемпотентность — это свойство операции, позволяющее применять её многократно без изменения результата beyond the initial application. Проще: сколько бы раз вы не нажимали кнопку вызова лифта — он приедет только один раз.
Пример:
➤ НЕ идемпотентно:
echo "data" >> file.log (при каждом запуске в файл добавится новая строка)➤ Идемпотентно:
echo "data" > file.log (файл будет перезаписан одним и тем же содержимым)➤ Идемпотентно в Ansible: пакетные менеджеры (apt, yum) или модули копирования файлов по умолчанию идемпотентны. Они проверяют текущее состояние и меняют его только если нужно.
А вы задумываетесь об идемпотентности своих скриптов? Какие трюки используете (проверка флагов, lock-файлы)? Делитесь лайфхаками!
Идемпотентный скрипт — это как пес, который лает на почтальона каждый день с одинаковым энтузиазмом. Результат предсказуем.
🌐 @helcode
❤4🤔1
Grep: 5 флагов, которые вернут вам часы жизни
Ручной поиск по логам или коду — это адское занятие.
🛠 Пример:
Допустим, ищем упоминания
➤
➤
➤
➤
1)
2)
3)
Флаги
Какой ваш самый частый или самый сумасшедший grep-однострочник?
🌐 @helcode | #linux
Ручной поиск по логам или коду — это адское занятие.
grep — Ваш первый и главный друг в этой битве. Но знание всего пары флагов превращает его из молотка в целый "швейцарский нож".🛠 Пример:
Допустим, ищем упоминания
error в проекте:➤
-r (рекурсивно): grep -r "error" /path/to/project/ (обыщет все файлы во всех папках)➤
-i (игнорируй регистр): grep -i "connection" file.log (найдёт и Connection, и CONNECTION)➤
-c (покажи count): grep -c "404" access.log (не покажет строки, просто посчитает количество 404-ых ошибок)➤
-A, -B, -C (контекст):1)
grep -A 3 "Exception" log.txt (покажет строку с исключением и 3 строки после)2)
grep -B 2 "panic" log.txt (покажет строку с паникой и 2 строки до)3)
grep -C 1 "timeout" log.txt (покажет строку с таймаутом и по 1 строке до и после)Флаги
-A (After), -B (Before), -C (Context) — это спасение при чтении логов, где важно понять, что привело к ошибке и что было после.Какой ваш самый частый или самый сумасшедший grep-однострочник?
Grep без этих флагов — это как искать иголку в стоге сена без магнита. А с ними — у Вас есть магнит, металлоискатель и карта, где спрятана вторая иголка.
🌐 @helcode | #linux
🤝6❤1🔥1
Пишем на Python'е сторожа для важных задач
Запустили бэкап или сборку? Теперь можно пойти пить кофе и молиться, чтобы всё прошло well. Или написать простого бота-напоминалку, который отправит вам в Telegram сообщение о результате.
🛠 Пример:
1. Создаем бота у [@BotFather](https://t.me/BotFather), получаем
2. Узнаем ID чата: проще всего написать боту [@userinfobot](https://t.me/userinfobot), он его вам скажет.
3. Скрипт-напоминалка (
4. Вставляем в скрипт бэкапа:
Скрипт делает простой HTTP-запрос к Telegram API. Главное — не храните токен и chat_id в коде, если проект публичный! Используйте переменные окружения.
А вы куда получаете оповещения? Telegram, Slack, может быть, почта? И что мониторите? Расскажите о своем опыте автоматизации уведомлений!
🌐 @helcode | #python
Запустили бэкап или сборку? Теперь можно пойти пить кофе и молиться, чтобы всё прошло well. Или написать простого бота-напоминалку, который отправит вам в Telegram сообщение о результате.
🛠 Пример:
1. Создаем бота у [@BotFather](https://t.me/BotFather), получаем
TOKEN.2. Узнаем ID чата: проще всего написать боту [@userinfobot](https://t.me/userinfobot), он его вам скажет.
3. Скрипт-напоминалка (
notify.py):import requests
TOKEN = "YOUR_TELEGRAM_BOT_TOKEN"
CHAT_ID = "YOUR_CHAT_ID"
MESSAGE = "✅ Бэкап успешно завершен! Можно спать спокойно."
url = f"https://api.telegram.org/bot{TOKEN}/sendMessage"
params = {"chat_id": CHAT_ID, "text": MESSAGE}
requests.post(url, params=params).json()
4. Вставляем в скрипт бэкапа:
python3 notify.pyСкрипт делает простой HTTP-запрос к Telegram API. Главное — не храните токен и chat_id в коде, если проект публичный! Используйте переменные окружения.
А вы куда получаете оповещения? Telegram, Slack, может быть, почта? И что мониторите? Расскажите о своем опыте автоматизации уведомлений!
Этот скрипт — как тот друг, который всегда звонит проверить, добрался ли ты домой. Надоедливо, но чертовски полезно.
🌐 @helcode | #python
👍2
Makefile: а этот парень зачем в нашем автоматизационном проекте?
✍️ Вы написали 10 скриптов для деплоя. Один чистит кэш, другой собирает проект, третий заливает его на сервер. Запускать их все по отдельности и запоминать порядок — не наш путь. Makefile — это ваш сборочный менеджер команд.
🛠 Пример:
Вот простой
А вы используете Makefile не по назначению? Для деплоя, тестов, Docker-команд?
🌐 @helcode | #makefile
✍️ Вы написали 10 скриптов для деплоя. Один чистит кэш, другой собирает проект, третий заливает его на сервер. Запускать их все по отдельности и запоминать порядок — не наш путь. Makefile — это ваш сборочный менеджер команд.
make — это утилита для управления сборкой, но программисты приспособили её для любой автоматизации. Вы описываете цели (targets) и зависимости между ними. Makefile делает процесс запуска сложных цепочек команд простым и предсказуемым.🛠 Пример:
Вот простой
Makefile для веб-проекта:.PHONY: deploy clean build # Говорим, что это не реальные файлы, а команды
build: clean
npm run build
clean:
rm -rf ./dist
deploy: build
scp -r ./dist/* user@server:/path/to/app
# Теперь можно просто запустить:
# make deploy
# и make сделает clean -> build -> deploy
А вы используете Makefile не по назначению? Для деплоя, тестов, Docker-команд?
Makefile — это как шпаргалка с командами для самого себя, которую ты сделал вчера, чтобы сегодняшний ты ничего не забыл. Забота о будущем себе. 😉
🌐 @helcode | #makefile
👍8❤1
Коды HTTP: учим язык, на котором с нами разговаривают сервера
Ваш скрипт отправил запрос к API, а в ответ — тишина или ошибка. Чтобы не гадать на кофейной гуще, нужно знать базовые коды состояния HTTP. Это не роскошь, а необходимость для любого, кто работает с веб-автоматизацией.
Пример:
➤
➤
➤
➤
➤
➤
➤
➤
Коды 4xx — это ошибка клиента (Вашего скрипта). Коды 5xx — ошибка сервера (там, куда Вы стучитесь).
С какими самыми странными или редкими кодами вам приходилось сталкиваться?
🌐 @helcode | #http
Ваш скрипт отправил запрос к API, а в ответ — тишина или ошибка. Чтобы не гадать на кофейной гуще, нужно знать базовые коды состояния HTTP. Это не роскошь, а необходимость для любого, кто работает с веб-автоматизацией.
Пример:
➤
200 OK: всё хорошо, проходите. Запрос выполнен успешно.➤
201 Created: не просто "OK", а "Я только что создал новую сущность по твоей просьбе". Ответ на успешный POST-запрос.➤
400 Bad Request: "я тебя не понял". Сервер не смог разобрать запрос из-за неверного синтаксиса (например, невалидный JSON).➤
401 Unauthorized: "предъяви пропуск". Требуется аутентификация, а вы её не предоставили.➤
403 Forbidden: "у вас нет доступа". Пропуск есть, но в этот кабинет пройти нельзя.➤
404 Not Found: "здесь ничего нет". Ресурс не найден.➤
500 Internal Server Error: "у нас на сервере что-то сломалось, но мы не знаем что". Универсальная ошибка серверной части.➤
502 Bad Gateway: "проксируемый сервер отдал мне какую-то дичь". Частая ошибка в балансировщиках и прокся.Коды 4xx — это ошибка клиента (Вашего скрипта). Коды 5xx — ошибка сервера (там, куда Вы стучитесь).
С какими самыми странными или редкими кодами вам приходилось сталкиваться?
Если API отвечает вам кодом 200 — это как получить в ответ "да, слушаю". Код 500 — это молчаливый вздох и закатывание глаз. А 404 — это просто "Идинафиг ".
🌐 @helcode | #http
Shebang (#!): магическая строка, которая делает скрипт скриптом
Вы написали
Shebang — это первые два символа
🛠 Пример:
➤ Для Python:
(
➤ Для Bash:
➤ Для Node.js:
⚙️ Как это работает:
1. Вы делаете файл исполняемым:
2. Запускаете его прямо:
3. Система видит
А вы используете shebang?
🌐 @helcode
Вы написали
script.py, а система пытается запустить его через bash. Вы вручную пишете python3 script.py. Зачем? Достаточно добавить одну строку в начало файла, и система сама поймет, какой интерпретатор использовать.Shebang — это первые два символа
#! в самом начале исполняемого файла. После них указывается путь к интерпретатору.🛠 Пример:
➤ Для Python:
#!/usr/bin/env python3(
/usr/bin/env — это волшебная команда, которая ищет python3 в вашем PATH, что более универсально, чем жесткий путь)➤ Для Bash:
#!/bin/bash➤ Для Node.js:
#!/usr/bin/env node⚙️ Как это работает:
1. Вы делаете файл исполняемым:
chmod +x my_script.py2. Запускаете его прямо:
./my_script.py3. Система видит
#!, читает путь до интерпретатора и запускает /usr/bin/env python3 ./my_script.pyА вы используете shebang?
Shebang — это как паспорт для Вашего скрипта. Без него это просто текстовый файл, который никуда не пустят. С ним — полноправный гражданин системы.
🌐 @helcode
👍10
Grep, Sed, Awk: святая троица текстовых ниндзя. Кого и когда использовать?
Вам нужно обработать текст в терминале. Вы открываете мануал и теряетесь между этими тремя гигантами. У каждого своя суперсила, и главное — не таскать воду
➤
➤ Пример:
➤
➤ Пример:
➤
➤ Пример:
Пример (комбо):
Посмотреть процессы Python и оставить только их PID:
Какой инструмент из троицы ваш любимый и за что вы его любите?
🌐 @helcode | #linux
Вам нужно обработать текст в терминале. Вы открываете мануал и теряетесь между этими тремя гигантами. У каждого своя суперсила, и главное — не таскать воду
awk-ом, когда достаточно grep-сита.➤
grep — это сито. Его задача — фильтровать строки. Найти те, что подходят под шаблон, и пропустить их дальше. Идеален для простого поиска.➤ Пример:
grep "error" log.txt➤
sed — это скальпель. Его сила — точечное редактирование текста (замена, удаление строк). Работает построчно.➤ Пример:
sed 's/foo/bar/g' file.txt (заменить все "foo" на "bar")➤
awk — это комбайн. Целый язык для обработки данных. Мощь в работе со столбцами и сложной логикой.➤ Пример:
awk '{print $1}' file.txt (напечатать только первый столбец каждой строки)Пример (комбо):
Посмотреть процессы Python и оставить только их PID:
ps aux | grep python | awk '{print $2}'Какой инструмент из троицы ваш любимый и за что вы его любите?
🌐 @helcode | #linux
👍8
Tar: архивируем это немедленно! 🗄
Нужно срочно передать кучу файлов, сделать бэкап или положить что-то на долгое хранение?
🛠 Пример:
➤ Создать архив (c - create):
➤ Создать архив со сжатием gzip (z - gzip):
➤ Распаковать архив (x - extract):
➤ Распаковать в определенную директорию (C - change to directory):
➤ Просмотреть содержимое архива (t - list):
Объяснение:
➤
➤
➤
➤
➤
➤
➤
А вы какой алгоритм сжатия предпочитаете? Старый добрый gzip (-.gz), более жесткий bzip2 (-.bz2) или современный xz (-.xz)? И почему?
🌐 @helcode | #linux
Нужно срочно передать кучу файлов, сделать бэкап или положить что-то на долгое хранение?
tar — Ваш верный друг. Главное — не утонуть в его флагах. 🛠 Пример:
➤ Создать архив (c - create):
tar -cf archive.tar file1.txt dir/➤ Создать архив со сжатием gzip (z - gzip):
tar -czf project_backup.tar.gz project_dir/➤ Распаковать архив (x - extract):
tar -xf archive.tar➤ Распаковать в определенную директорию (C - change to directory):
tar -xf archive.tar -C /path/to/target/➤ Просмотреть содержимое архива (t - list):
tar -tf archive.tarОбъяснение:
➤
-c — создать.➤
-x — извлечь.➤
-t — посмотреть.➤
-f — указать имя файла (обязательный флаг!).➤
-z — работать с gzip (используйте для .tar.gz или .tgz).➤
-j — работать с bzip2 (для .tar.bz2).➤
-v — verbose (показывать процесс, но не используйте в скриптах!).А вы какой алгоритм сжатия предпочитаете? Старый добрый gzip (-.gz), более жесткий bzip2 (-.bz2) или современный xz (-.xz)? И почему?
Команда tar без флага -f — это как попытка заварить чай без чайника. Вода есть, чай есть, а результата нет. Система любезно напомнит Вам об этом. 😉
🌐 @helcode | #linux
👍8❤1
.gitignore: искусство скрывать лишнее от посторонних глаз 🕵️♂️
Вы только что сделали
Содержимое файла .gitignore для Python-проекта:
А какие самые странные или полезные шаблоны были в ваших файлах .gitignore? Делитесь находками, чтобы все могли сделать свои репозитории чище!
🌐 @helcode | #git
Вы только что сделали
git add . и увидели в коммите кучу мусора: кэши, логи, пароли, системные файлы. Паника! Как их убрать? Ответ — файл .gitignore. Он говорит Git'у, чем можно пренебречь..gitignore — это простой текстовый файл, в котором шаблонами перечисляются файлы и директории, которые не нужно отслеживать в Git.Содержимое файла .gitignore для Python-проекта:
# Игнорируем кэш Python
__pycache__/
*.py[cod]
# Игнорируем виртуальное окружение
venv/
.env/
# Игнорируем логи
*.log
# Игнорируем файлы с чувствительными данными (пароли, ключи)
secrets.yml
config.json
*.key
# Игнорируем системные файлы
.DS_Store
Thumbs.db
А какие самые странные или полезные шаблоны были в ваших файлах .gitignore? Делитесь находками, чтобы все могли сделать свои репозитории чище!
Коммит без .gitignore — это как вынести мусорное ведро на сцену во время важного выступления. Все видят не только вашу гениальную идею, но и все отходы процесса. 🗑
🌐 @helcode | #git
👍3
Ansible, Chef, Puppet: или как приручить стадо серверов 🐑
Вы написали десяток bash-скриптов для настройки серверов. Они работают. Но что, если серверов не один, а сто? Как быть уверенным, что везде одинаковая конфигурация? Здесь начинается магия управления конфигурациями.
Эти инструменты позволяют описывать желаемое состояние сервера (какие пакеты стоят, какие файлы лежат, какие службы запущены) кодом. Этот код можно применять многократно, получая предсказуемый результат на любом количестве машин.
➤ Ansible: работает по SSH, не требует установки агента на целевые серверы. Конфиги пишутся на простом YAML. Идеален для старта.
➤ Puppet/Chef: требуют установки агента на сервер. Используют свой собственный DSL (Domain-Specific Language) для описания конфигураций. Мощные, но более сложные для изучения.
Простой плейбук Ansible для установки nginx:
Вы уже используете подобные системы? Если да, то какую выбрали и почему?
🌐 @helcode | #yaml
Вы написали десяток bash-скриптов для настройки серверов. Они работают. Но что, если серверов не один, а сто? Как быть уверенным, что везде одинаковая конфигурация? Здесь начинается магия управления конфигурациями.
Эти инструменты позволяют описывать желаемое состояние сервера (какие пакеты стоят, какие файлы лежат, какие службы запущены) кодом. Этот код можно применять многократно, получая предсказуемый результат на любом количестве машин.
➤ Ansible: работает по SSH, не требует установки агента на целевые серверы. Конфиги пишутся на простом YAML. Идеален для старта.
➤ Puppet/Chef: требуют установки агента на сервер. Используют свой собственный DSL (Domain-Specific Language) для описания конфигураций. Мощные, но более сложные для изучения.
Простой плейбук Ansible для установки nginx:
- name: Install and start nginx
hosts: webservers
tasks:
- name: Install nginx
apt:
name: nginx
state: latest
- name: Start nginx service
systemd:
name: nginx
state: started
enabled: yes
Вы уже используете подобные системы? Если да, то какую выбрали и почему?
Если bash-скрипты — это ручное управление сервером с помощью рычагов и кнопок, то Ansible — это автопилот, который вы просто включаете и пьете кофе, пока он ведет самолет.
🌐 @helcode | #yaml
👍6👎1
Перенаправление потоков: >, >>, 2>, | и вот вы уже волшебник 🔮
Вывод команды мешает на экране? Нужно сохранить результат в файл или ошибки — в лог? Или скормить результат одной команды на вход другой? Вся магия Linux строится на управлении потоками.
У каждой программы есть три стандартных потока:
➤ stdin (0) — стандартный вход (куда программа читает данные).
➤ stdout (1) — стандартный вывод (куда программа пишет данные).
➤ stderr (2) — стандартный вывод ошибок (куда программа пишет ошибки).
Какую самую крутую или неочевидную цепочку из перенаправлений и пайпов вы собирали? Хвастайтесь в комментах, соберем сборник лучших практик!
🌐 @helcode
Вывод команды мешает на экране? Нужно сохранить результат в файл или ошибки — в лог? Или скормить результат одной команды на вход другой? Вся магия Linux строится на управлении потоками.
У каждой программы есть три стандартных потока:
➤ stdin (0) — стандартный вход (куда программа читает данные).
➤ stdout (1) — стандартный вывод (куда программа пишет данные).
➤ stderr (2) — стандартный вывод ошибок (куда программа пишет ошибки).
Какую самую крутую или неочевидную цепочку из перенаправлений и пайпов вы собирали? Хвастайтесь в комментах, соберем сборник лучших практик!
Оператор | (пайп) — это социальная сеть для Linux-команд. Одна команда постит свой вывод, а другая его лайкает и репостит, обрабатывая дальше.
🌐 @helcode
🔥6
Криптография на пальцах: симметричное vs асимметричное шифрование
🗣 Когда ваш скрипт передает пароли или ключи, он не должен кричать о них на всю сеть. Шифрование — это стетоскоп, который превращает этот крик в шепот. Но какой тип выбрать?
➤ Симметричное: один ключ и для шифрования, и для расшифровки. Как один ключ от замка. Быстро и эффективно, но нужно безопасно передать ключ второй стороне.
➤ Пример: AES
➤ Асимметричное: два ключа - публичный (для шифрования) и приватный (для расшифровки). Публичный ключ можно раздавать всем. Медленнее, но решает проблему передачи ключа.
➤ Пример: RSA
Пример (создание SSH-ключей - это асимметричное шифрование):
Вы больше доверяете симметричному или асимметричному шифрованию? В каких случаях что использовать?
🌐 @helcode
🗣 Когда ваш скрипт передает пароли или ключи, он не должен кричать о них на всю сеть. Шифрование — это стетоскоп, который превращает этот крик в шепот. Но какой тип выбрать?
➤ Симметричное: один ключ и для шифрования, и для расшифровки. Как один ключ от замка. Быстро и эффективно, но нужно безопасно передать ключ второй стороне.
➤ Пример: AES
➤ Асимметричное: два ключа - публичный (для шифрования) и приватный (для расшифровки). Публичный ключ можно раздавать всем. Медленнее, но решает проблему передачи ключа.
➤ Пример: RSA
Пример (создание SSH-ключей - это асимметричное шифрование):
ssh-keygen -t ed25519 -C "your_email@example.com"Вы больше доверяете симметричному или асимметричному шифрованию? В каких случаях что использовать?
Симметричное шифрование - это как один ключ на двоих: если Вы живете вместе, это удобно. Если вам нужно впустить курьера - придется делать дубликат и рисковать. Асимметричное - это кодовый замок: любой может положить посылку в ящик (зашифровать), но только у Вас есть ключ его открыть (расшифровать).
🌐 @helcode
👍3❤1
SSH: козыри для удаленной "магии"
Сидеть перед физическим сервером - это прошлый век. SSH - это твой телепорт в мир удаленного управления. Вот шпаргалка, чтобы не забыть самые мощные заклинания.
🛠 Пример:
➤ Подключение с определенным ключом:
➤ Запуск команды без входа на сервер:
➤ Проброс порта (туннелирование):
➤ Проброс GUI-приложения:
➤ Упрощение через ~/.ssh/config:
Теперь просто:
Файл
Какой ваш самый частый или самый хитрый сценарий использования SSH? Делитесь лайфхаками!
🌐 @helcode | #bash
Сидеть перед физическим сервером - это прошлый век. SSH - это твой телепорт в мир удаленного управления. Вот шпаргалка, чтобы не забыть самые мощные заклинания.
🛠 Пример:
➤ Подключение с определенным ключом:
ssh -i ~/.ssh/my_key user@host➤ Запуск команды без входа на сервер:
ssh user@host 'ls -la /tmp'➤ Проброс порта (туннелирование):
ssh -L 8080:localhost:80 user@host ➤ Проброс GUI-приложения:
ssh -X user@host firefox➤ Упрощение через ~/.ssh/config:
Host myserver
HostName 192.168.1.1
User myuser
IdentityFile ~/.ssh/my_key
Теперь просто:
ssh myserverФайл
~/.ssh/config - лучший друг. Он запоминает настройки для разных серверов, чтобы не вводить их каждый раз.Какой ваш самый частый или самый хитрый сценарий использования SSH? Делитесь лайфхаками!
SSH без ~/.ssh/config - это как звонить другу, каждый раз набирая полный номер с кодом страны. С конфигом - это добавление его в избранное.
🌐 @helcode | #bash
👍11
Cron + Ansible: Дуэт мечты для ежедневной рутины
Вы написали шикарный скрипт для бэкапа. Он работает. Один раз. А нужно, чтобы он запускался каждую ночь. Cron - это кукушка, которая будет будить ваш скрипт по расписанию. А Ansible - это дирижер, который расставит таких кукушек на всех серверах.
Пример (простой cron-файл):
Пример (задание cron через Ansible):
Ansible модуль
А Вы как предпочитаете настраивать крон? Вручную, через Ansible, или может быть есть инструменты покруче?
🌐 @helcode | #bash #yaml
Вы написали шикарный скрипт для бэкапа. Он работает. Один раз. А нужно, чтобы он запускался каждую ночь. Cron - это кукушка, которая будет будить ваш скрипт по расписанию. А Ansible - это дирижер, который расставит таких кукушек на всех серверах.
Пример (простой cron-файл):
# Пример crontab -e
# Минута Час День_месяца Месяц День_недели Команда
0 2 * * * /path/to/backup.sh # Каждый день в 2:00
*/5 * * * * /path/to/check_status.sh # Каждые 5 минут
Пример (задание cron через Ansible):
- name: Add backup cron job
cron:
name: "Daily Backup"
minute: "0"
hour: "2"
job: "/path/to/backup.sh"
user: "deploy"
Ansible модуль
cron - это идемпотентный способ управлять расписанием. Он сам проверит, существует ли такое задание, и добавит его только если нужно.А Вы как предпочитаете настраивать крон? Вручную, через Ansible, или может быть есть инструменты покруче?
Cron - это самый старый и надежный будильник в мире IT. Он разбудит ваш скрипт даже в выходной.
🌐 @helcode | #bash #yaml
👍4🤔2
Иммутабельные серверы: или почему перезапуск должен лечить, а не калечить
Вы подлатали сервер, перезапустили его, и он... сломался. Конфиги сбились, версии поплыли. Знакомо? Иммутабельные серверы (также известны как "сервер с неизменяемой инфраструктурой) - это некая философия, где сервер после развертывания становится "священной коровой": его нельзя менять, можно только убить и создать новый.
➤ Традиционный подход: каждый сервер - это питомец. У него есть имя, его лечат, о нем заботятся.
➤ Иммутабельный подход: серверы - это скот. У них нет имен, только номера. Если один заболел - его заменяют на нового из образа.
Плюсы иммутабельного подхода:
➤ Предсказуемость
➤ Воспроизводимость
➤ Упрощение отката
➤ Безопасность
🌐 @helcode
Вы подлатали сервер, перезапустили его, и он... сломался. Конфиги сбились, версии поплыли. Знакомо? Иммутабельные серверы (также известны как "сервер с неизменяемой инфраструктурой) - это некая философия, где сервер после развертывания становится "священной коровой": его нельзя менять, можно только убить и создать новый.
➤ Традиционный подход: каждый сервер - это питомец. У него есть имя, его лечат, о нем заботятся.
➤ Иммутабельный подход: серверы - это скот. У них нет имен, только номера. Если один заболел - его заменяют на нового из образа.
Плюсы иммутабельного подхода:
➤ Предсказуемость
➤ Воспроизводимость
➤ Упрощение отката
➤ Безопасность
Иммутабельный сервер - это как одноразовый стаканчик: использовал и выбросил, зная, что следующий будет точно таким же. Традиционный сервер - это как любимая кружка: ее нужно мыть, за ней нужно ухаживать, и если она разобьется - будет больно.
🌐 @helcode
👍6❤1
Systemd: как приручить демонов современности
Раньше демоны были простыми. Теперь у нас есть systemd - это и система инициализации, и менеджер служб. Вот шпаргалка по самым нужным командам.
Пример:
➤ Посмотреть статус службы:
➤ Запустить/остановить службу:
➤ Включить/выключить автозагрузку:
➤ Перечитать конфиги:
➤ Посмотреть логи службы:
Systemd использует "юниты" (unit files) для управления службами. Это конфиги в формате INI, которые говорят systemd, как управлять вашим демоном.
Вы уже писали свои .service файлы? Для каких демонов? Поделитесь опытом!
P.S. Если интересно углубиться - моя статья по теме на Хабр.
🌐 @helcode
Раньше демоны были простыми. Теперь у нас есть systemd - это и система инициализации, и менеджер служб. Вот шпаргалка по самым нужным командам.
Пример:
➤ Посмотреть статус службы:
systemctl status nginx➤ Запустить/остановить службу:
systemctl start nginxsystemctl stop nginx➤ Включить/выключить автозагрузку:
systemctl enable nginxsystemctl disable nginx➤ Перечитать конфиги:
systemctl daemon-reload➤ Посмотреть логи службы:
journalctl -u nginx -fSystemd использует "юниты" (unit files) для управления службами. Это конфиги в формате INI, которые говорят systemd, как управлять вашим демоном.
Вы уже писали свои .service файлы? Для каких демонов? Поделитесь опытом!
Systemd - это такой родитель, который знает о своих детях-демонах всё: где они, что делают, и почему плачут (пишут в логи).
P.S. Если интересно углубиться - моя статья по теме на Хабр.
🌐 @helcode
❤6👍2
Пишем свой systemd сервис для Python-скрипта
У Вас есть полезный Python-скрипт, который должен работать постоянно как демон. Держать его в
Пример (/etc/systemd/system/my_script.service):
Как использовать:
➤
➤
➤
А Вы уже перевели свои скрипты на systemd?
🌐 @helcode
У Вас есть полезный Python-скрипт, который должен работать постоянно как демон. Держать его в
screen или nohup это каменный век. Давайте сделаем его полноценным systemd-сервисом!Пример (/etc/systemd/system/my_script.service):
[Unit]
Description=My Awesome Python Script
After=network.target
[Service]
Type=simple
User=deploy
WorkingDirectory=/opt/my_script
ExecStart=/usr/bin/python3 /opt/my_script/main.py
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
Как использовать:
sudo systemctl daemon-reload
sudo systemctl enable my_script
sudo systemctl start my_script
➤
Restart=always - перезапускать скрипт, если он упал➤
RestartSec=5 - ждать 5 секунд перед перезапуском➤
User=deploy - от имени какого пользователя запускатьА Вы уже перевели свои скрипты на systemd?
Systemd-сервис для скрипта - это как получение гражданства для беженца-процесса. Теперь у него есть права, обязанности и защита государства (системы).
🌐 @helcode
👍9❤3
Git: не просто система контроля версий, а машина времени для вашего кода
"Это работало вчера!" - фраза, от которой стынет кровь. Git - это не просто способ хранить код, а полноценная машина времени, которая позволяет вернуться к любому моменту жизни проекта.
➤ Коммит - это слепок состояния файлов в определенный момент времени.
➤ Ветка- это указатель на конкретный коммит, который движется вперед.
➤ Слияние - это объединение изменений из разных веток.
Продвинутые концепции:
➤ Rebase vs Merge - два способа интегрировать изменения
➤ Interactive rebase - переписывание истории (осторожно!)
➤ Git hooks - автоматизация на события в Git
🌐 @helcode | #git
"Это работало вчера!" - фраза, от которой стынет кровь. Git - это не просто способ хранить код, а полноценная машина времени, которая позволяет вернуться к любому моменту жизни проекта.
➤ Коммит - это слепок состояния файлов в определенный момент времени.
➤ Ветка- это указатель на конкретный коммит, который движется вперед.
➤ Слияние - это объединение изменений из разных веток.
Продвинутые концепции:
➤ Rebase vs Merge - два способа интегрировать изменения
➤ Interactive rebase - переписывание истории (осторожно!)
➤ Git hooks - автоматизация на события в Git
Git - это самый дешевый и эффективный способ путешествовать во времени. Правда, в отличие от Делореана, он не может попасть в будущее, где ваш код уже написан.
🌐 @helcode | #git
🔥6
Docker: шпаргалка для тех, кто не хочет тонуть в контейнерах
"У меня на машине работает!" - самый страшный баг в истории. Docker решает это, упаковывая приложение со всем его окружением в контейнер. Вот шпаргалка, чтобы не запутаться в базовых командах.
Пример:
➤ Собрать образ:
➤ Запустить контейнер:
➤ Посмотреть запущенные контейнеры:
➤ Посмотреть все контейнеры:
➤ Остановить контейнер:
➤ Посмотреть логи:
➤ Зайти внутрь контейнера
Dockerfile - это инструкция по сборке образа. Образ - это шаблон. Контейнер - это запущенный экземпляр образа.
🌐 @helcode | #docker
"У меня на машине работает!" - самый страшный баг в истории. Docker решает это, упаковывая приложение со всем его окружением в контейнер. Вот шпаргалка, чтобы не запутаться в базовых командах.
Пример:
➤ Собрать образ:
docker build -t myapp:latest .➤ Запустить контейнер:
docker run -d -p 8080:80 myapp:latest➤ Посмотреть запущенные контейнеры:
docker ps➤ Посмотреть все контейнеры:
docker ps -a➤ Остановить контейнер:
docker stop <container_id>➤ Посмотреть логи:
docker logs <container_id>➤ Зайти внутрь контейнера
docker exec -it <container_id> bashDockerfile - это инструкция по сборке образа. Образ - это шаблон. Контейнер - это запущенный экземпляр образа.
Docker - это как виртуальная машина, только без лишнего веса. Если виртуальная машина - это целый дом, то Docker-контейнер - это студия с мебелью Икеа: всё необходимое, ничего лишнего.
🌐 @helcode | #docker
👍7