этогик // DevOps, Infrastructure, Productivity
4.37K subscribers
110 photos
1 video
249 links
🚀Блог DevOps-инженера.

Вместе растем в хард- и софт скиллах, разбираемся как жить и работать продуктивно, ищем баланс во всем 🌿

📽 yt: https://www.youtube.com/@etogeek
🌍 site: https://etogeek.dev
🌿 chat: @etogeekchat

Подробнее в закрепе 🦾
Download Telegram
В 2020 году я участвовал в одной активности, которая, как мне кажется, максимально бустанула мою карьеру. В феврале случайно заметил рекламу на Хабре какого-то бесплатного SRE-квеста для студентов и новичков - заполните анкетку, пройдите тест на 50 вопросов и ждите.

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

Нашей задачей будет сделать чтоб всё работало 24/7/365. Ну а если с задачей не справились, то работаем мы 24/7/365.


Нам выдали по три виртуальных машины. Точнее VNC доступ к ним. Нужно было установить на них Ubuntu и две разных CentOS. Затем нужно было добыть на них интернет - злобные безопасники очень неохотно проделывали дырки в firewall. Дальше мы устанавливали Wordpress и после этого на все наши “сайты” повесили мониторинг доступности с ежесекундными проверками.

В виртуалках было два диска в RAID1 и две сетевушки в bonding (объединение, резервирование). Это тоже нужно было самим настроить. А мониторинг доступности уже подключен, если что.

Поразбирались с PXE и kickstart-установкой, научились устанавливать Wordpress через Ansible. Поизучали динамическую маршрутизацию на примере rip и ospf - получили доступ к вирталкам-соседей

🔥 Дальше - веселье:

🟢 В рандомное время каждый день у нас ломался один из дисков. Нужно было оставить заявку в дата-центр на замену конкретного диска. заменят не тот - проиграл
🟢 Регулярно ломался сетевой коммутатор в дата-центре и одна из сетевых карт переставала работать. Тут проверялся правильно настроенный bonding

И еще, все виртуалки крутились рядом друг с другом, и если при синхронизации RAID массива не уменьшить максимальную скорость, то лагать начинали все виртуалки на физическом сервере (нагрузку на диски никто не отменял). А это минус к проценту доступности.

etosamoe [23:15]
о, динамическую маршрутизацию настроил наконец-то!

tutor [23:29]
Друзья, помогите плз проверить
`ssh root@10.8.232.168`
пароль root
это дев тачка, можно сразу запускать rm -rf


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

💬 Немного статистики:

1800 - человек подали заявку на участие
60 - человек были на старте группы
15 - человек дошли до конца. не ценят бесплатное..
1 - человек, у кого на финал был 100% SLI (лол, это я)

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

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

Спустя время я уже полноценно занимался администрированием виртуалок и серверов. Учитывая наличие опыта работы с сетью, получился довольно мощный стек скиллов.

этогик | etogeek.ru | #техшортики #истории
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18👍104🤔2
💡 Давааайте немного поговорим про commit-ы!

А то так бывает, что без слез на git blame не посмотришь. Вот несколько рекомендаций по созданию коммитов.

➡️ Во-первых, commit message делится на две части:

Тема — содержит общую суть этого коммита, summary. Должно состоять не больше, чем из 50 символов, так как может обрезаться в некоторых случаях. Обычно это первая строка в commit message.
Тему пишем с большой буквы(тут могут возникнуть споры) и точку в конце не ставим.

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

🟢 Сообщение должно отвечать на вопрос "что сделает этот коммит?", а не "что было сделано?", поэтому пишите в повелительном наклонении (чиво?):

 Removed deprecated async function
 Added Grafana deployment
 Remove deprecated async function
 Add molecule test to monitoring role

➡️ Во-вторых, делайте коммиты атомарными. Это значит, что коммит должен делать что-то только по одной задаче, фиксить одну функцию. Не должно быть так, что в одном коммите у вас изменения в нескольких модулях проекта.

Например, по задаче вам нужно исправить код в двух Ansible-ролях. Сделайте два отдельных коммита:

Add nginx reload handler
Add alias to nginx config


- По таким коммитам понятно, что изменилось. Их даже не обязательно сливать в один (squash).
- Такие коммиты проще откатить.
- Такие коммиты проще вливать в другие ветки по отдельности.

➡️ Что еще можно добавить в commit message, чтобы сделать их удобнее и понятнее для текущих и будущих разработчиков?

🟠 Добавить номер задачи, к которой относится коммит. Зачастую между git-сервером и таск-трекером настроена интеграция - это “привяжет” коммит к задаче:

TASK-4352 Update documentation


🟠 Указать тип коммита, например feature, refactor, bugfix:

TASK-112 feature: add new function
(тут уже напрашивается маленькая буква в начале)


🟠 Указать scope — какая система проекта затронута этим коммитом, например backend, api, deploy:

TASK-4345 [d] Update Nexus URL
TASK-1532 backend: add unit test


Часто в командах уже есть некая договоренность по оформлению коммитов и PR(MR)-ов, стоит ей следовать. А если ее нет — предложить внедрить, например, продемонстрировав этот пост, который я подкреплю следующими ссылками: раз, два, три, четыре.

Как делаю я: разработку веду в отдельной ветке. Если коммитов получается много, особенно если есть “debug commits” вроде test 1, test 2, то перед слиянием просто сделаю squash, а правильный commit message напишу уже в merge commit-е.

А как вы оформляете свои коммиты? Пишете ли вы описание к ним или ограничиваетесь темой? Указываете тип коммита? Расскажите в комментариях как принято у вас в командах.

этогик | etogeek.ru | #техшортики
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14👎1🤔1
В дополнение к прошлому посту про git хотел поделиться софтом, которым я пользуюсь. А в конце пара полезных ссылок.

90% всей работы с git (уверен, что не только у меня) состоит из конвеера:

- создать ветку git switch -c branch-name
- внести изменения
- добавить изменения в индекс git add . или git add filename
- закоммитить изменения git commit -m ‘commit message’
- запушить коммиты в удаленный репозиторий git push origin branch-name
- создать PR (MR), дождаться ревью, автотестов, влить всё в основную ветку
- переключиться на основную ветку, и стянуть локально изменения git switch master && git pull origin master
-

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

Под часть команд у меня есть alias-ы — не знаю кто их добавил, кажется шли вмеcте с плагином к oh-my-zsh:

- ggpull — слить изменения из origin для текущей ветки
- gcam — добавить все измененные файлы в индекс и сделать коммит (git commit -a -m) Новые файлы добавлены не будут!
- ggpush — отправить изменения в origin в текущую ветку

Когда же приходится сделать что-то более редкое и лень вспоминать и искать команды, я перехожу к тяжелой артиллерии — Sublime Merge: разрешать конфликты, мержить ветки, черри-пикать коммиты мне намного проще видя ветки и изменения сразу перед глазами.

И еще несколько очень полезных сайтов:

- learngitbranching  — очень крутая интерактивная обучалка по веткам
- Dang It Git — полезные шпаргалки по некоторым популярным ситуациям в git. Есть более “правильная” версия.
- git-cheat-sheet-education.pdf — cheatsheet от GitHub по основным командам

А еще вот инструкция как перенести git-репозиторий из одного в другой.

Так же у меня в VSCode установлен плагин Git Lens — с ним работает git blame прямо в коде (история и авторство коммитов)

А чем вы пользуетесь в работе с git? Только командами в терминале? А может только git-клиентом в любимой IDE?
У меня, например, был коллега, который большую часть времени пользовался GitLab Web IDE. И это не упрек ¯\_(ツ)_/¯

этогик | etogeek.ru | #техшортики
👍9🔥4
🌎 SLI, SLO и SLA. В чем разница? И почему говорить везде SLA — неправильно?

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

➡️ SLI — Service Level Indicator

Это числовое значение какой-то конкретной характеристики, метрика: время отклика, задержка запросов, частота ошибок. Обычно берутся значения за период времени, усредняются и переводятся в проценты.

Это наша мера успеха.

“Наш сайт был доступен 99% времени за прошлый месяц” — это SLI. Внезапно, это не SLA, как многие привыкли говорить.

➡️ SLO — Service Level Objective

Это наша цель. Числовое значение, которого мы хотим достичь и не проваливаться ниже этой границы. Измеряем через SLI. Задает уровень ожиданий от сервиса.
Например, SLO = среднее время отклика должно быть ≤100ms

“Мы стремимся, чтобы наш сайт был доступен 99% времени” — это SLO.

➡️ SLA — Service Level Agreement

Отвечает на вопрос «Что случится если SLO не соблюдаются?».

Это явный или неявный контракт с клиентами или пользователями системы в котором описаны последствия несоответствия SLO.

“Будет предоставлена компенсация в случае, если наш сайт будет доступен менее 99% времени” — это SLA

Зачастую используются внутренние SLO, более жесткие, чем те, что мы показываем пользователям. Например, мы утверждаем, что система доступна 99,9% времени, а инженерная команда стремится обеспечивать 99,99%, таким образом появляется некий буфер перед штрафами по SLA.

☝️ Помните, что SLI — это измерение, SLO — это цель, а SLA — это обязательство.

этогик | etogeek.ru | #техшортики
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19🔥4🤔2
🌃 Inside the Envoy (eng)

Это. Очень. Интересно. Смотреть.

Небольшой фильм-история про то как создавался Envoy — прокси для cloud native приложений.

Классно снятые интервью, истории про крупные факапы, и причины разработки Envoy.

Очень жду подобное видео от них про Prometheus.

👉 https://www.youtube.com/watch?v=uaksVVHDhYU

этогик | etogeek.ru | #нашел
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥3
🔑 Как подставить переменные в файл во время пайплайна?

Хранить чувствительные данные — токены, пароли — в git, особенно в публичном доступе, нельзя. GitHub, к примеру, автоматически сканирует репозитории на предмет всяких токенов и уведомляет партнеров (например AWS) о таких ситуациях, чтобы те быстро заблокировали доступ. Раз, два.

Значит нужно откуда-то их брать во время пайплайна.

Что сейчас является де-факто стандартом? Hashicorp Vault — он позволяет подключаться к нему из кода приложений, получать пароли, целые конфигурации, гибко управлять правами доступа. Процедура внедрения Волта довольно нетривиальна, поэтому вот еще хороший способ, подходящий для не очень больших проектов (идеально для пет-проектов).

В CI системах обычно есть раздел с переменными. В эти переменные мы можем положить наши пароли и они будут прокинуты в runner как переменные окружения. Мы можем ограничить доступ к этим переменным, и даже защитить их от вывода в логе пайплайна. Окей, мы получили переменную окружения в раннере, можем использовать ее в обычной shell-команде:

command --parameter=${VARIABLE}


➡️ А как подставить переменные в конфигурационный файл или в yaml-манифест?

В файл нужно положить “заглушку” нашего пароля, например:

> config.py
DB_CONN='sqlite:///database.db'
BACKEND_PORT='8080'
TLG_TOKEN='__TOKEN__'


Заглушка может быть любой, но лучше отделить её какими-нибудь символами, которые точно не встретятся в коде. Дальше в пайплайне заменяем заглушку на значение переменной с помощью sed:

sed -i "s/__VARIABLE__/${VARIABLE}/g" config.py

или перенаправляем вывод в другой файл:
sed "s/__VARIABLE__/${VARIABLE}/g" config.example > config.py

sed заменяет один текст на другой.

➡️ Окей, есть еще вариант. Можно в файл-шаблон положить переменные в shell-формате:

> config.py
DB_CONN='sqlite:///database.db'
BACKEND_PORT='8080'
TLG_TOKEN='${TOKEN}'


Затем мы направляем наш шаблон на вход (<) программе envsubst, а выход перенаправляем (>) в новый файл:

envsubst < config.example > config.py

envsubst, можно сказать, рендерит переменные во входящем потоке и выводит их в стандартный вывод (stdout).

➡️ А что в Ansible? Там можно использовать модуль ansible.builtin.env, например для создания факта:

ansible.builtin.set_fact:
tlg_token: "{{ lookup('ansible.builtin.env', 'TOKEN') }}"


Или прямо в jinja-шаблоне:

> config.py.j2
DB_CONN='sqlite:///database.db'
BACKEND_PORT='8080'
TLG_TOKEN='{{ lookup('ansible.builtin.env', 'TOKEN') }}'


этогик | etogeek.ru | #техшортики
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥3
🟥 Как закоммитить только часть файла?

🟠 TL;DR
git add -p

🟢 Чуть подробнее

Команда git add -p (или --patch) проходит по всем файлам и спрашивает по каждому изменению, что ты хочешь с ним сделать:

❯ git add -p
diff --git a/ansible/file.yml b/ansible/file.yml
index 73f6b4d..899610f 100644
--- a/ansible/file.yml
+++ b/ansible/file.yml
@@ -52,7 +52,8 @@
loop:
- - "service"
+ - "node_modules"
+ - "systemd_templates"

(1/1) Stage this hunk [y,n,q,a,d,e,?]?


А дальше интерактивный ввод. Ну, самое важное — "y" и "n" — добавить эти изменения в индекс или пропустить. Есть варианты с пропустить или добавить “до конца файла”. Можно использовать как git add -p filename.

👉 Напомню, индекс в git — это список файлов, которые будут закоммичены.

Важно, это действие добавляет наше изменение только в индекс. Его еще нужно закоммитить.

🟢 Как еще можно использовать?

Как писал вот здесь, я всегда пользовался либо git add ., либо git add <filename>. Но тут есть загвоздка:

при git add . в индекс, а затем и в коммит, могут попасть лишние файлы про редактирование которых ты мог и забыть уже

Вот git add -p позволит более осознанно (преисполненно) пройтись по файлам перед тем как добавить их в индекс.

Так же напомню, что для удаления файла из индекса можно воспользоваться командой git reset filename.

этогик | etogeek.ru | #техшортики
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍6
Ручная сортировка задач в Todoist

Свежее обновление Todoist притащило одну фичу, которой мне очень не хватало в работе с ним.

Раньше, если ты создавал задачу с привязкой ко времени, например:

Сходить в магазин сегодня 15:00

То эта задача будет в списке Today/Upcoming в самом верху, вместе с остальными задачами у которых установлено время. (при стандартной сортировке)

👉 Теперь можно включить режим сортировки Вручную и перетащить эту задачу хоть в середину списка, и даже смешивать приоритеты между собой.

Теперь думаю сделать себе новогодний подарок и купить наконец Pro-подписку в Todoist — там задачам можно добавлять не только время начала, но и длительность. При интеграции с Google Calendar (единственная двусторонняя) можно очень классно формировать Time Blocking календарь.

Но проблемс в том, что я пользуюсь Apple Calendar 😬 Придется и оттуда съезжать.

этогик | etogeek.ru
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥1🤔1
⚙️ В чем разница между $VAR и ${VAR}?

Это реально частый вопрос. Рассказываю в дополнение к посту про подстановку переменных в файл.

Тут нет никакого rocket-science и разница только в том, как командный интерпретатор (Bash, zsh, sh, тысячи их) определит границы названия переменной:

$VAR — можно использовать, когда название переменной отделено от другого текста неиспользуемыми символами, например пробелом, или backslash. А вот если переменную вставим в слово, то она будет интепретирована неверно:
VAR=eto
echo $VAR # Выведет eto
echo $VARgeek # Выведет значение VARgeek, если такое есть, иначе — пусто


${VAR} — надежнее. Помогает точно отделить название переменной от другого текста:
VAR=eto
echo ${VAR} # Выведет eto
echo ${VAR}geek # Выведет etogeek


этогик | etogeek.ru | #техшортики
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
Привет! На выходных сделал большую ручную работу — собрал ссылки на все интересные и полезные сообщения в телеграм-канале в один пост:

👉 Список постов Телеграм-канала 👈
🤯6👍3
🧙‍♂️ Бомбит с Hogwarts Legacy.

Cпойлеры? Может быть немного, совсем чуть-чуть.

Я, конечно, слоупок тот еще — игра-то вышла почти год назад, но в свое оправдание скажу, что у меня нет ни консоли, ни ПК — ждал выхода на Nintendo Switch.

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

Интересная боёвка, хотя прицеливание ужасное. Сначала нужно привыкнуть переключать наборы скиллов, но в целом интересно. А главное — красиво, эффектно и весело.
🗺 Открытый и атмосферный мир. Здесь разработчики проделали огромную работу. Вчера начали новогодний пересмотр Гарри Поттеров, так вот — всё сделано очень близко к фильму.
📕 Если смотреть поверхностно и в целом - сюжет интересный.

😐 Теперь погнали прожарку:

👶 Детсадовские подсказки. Ну дайте мне время подумать немного, я же мастер квестов Клаустрофобии. Но нет, главный герой так мимо дела «Наверное нужно использовать Акцио, чтобы подтянуть эту платформу».

✈️ Управление в полете максимально всратое. Обычно во всех играх полеты управляются одним джойстиком: вверх-вниз, влево-вправо. Здесь же левый отвечает за повороты, а правый — за высоту.

🗺 Карта. Ну кто придумал сделать трехмерную карту замка, на которой сначала выбрать зону телепорта, а затем точку телепорта? Так и не привык. Как говорил Геральт «Ненавижу порталы»

🤦‍♂️ Дыры в сюжете. Ооо, с этого мы смеемся с самого начала игры. Начать стоит с того, что главный герой попадает сразу на пятый курс в Хогвартс, раньше не изучая магию вообще. Причины либо не рассказали, либо я пропустил.

Ученики пятого(!) курса. Урок полетов на метле:
— Кто помнит как нужно летать?
Тишина
— Хорошо, нужно встать рядом с метлой и сказать «Вверх»!


Урок магии:
Какое заклинание поднимает предмет в воздух? Не помните? Какие недотепы - за лето все забыли, давайте повторим: Левиоса!


🕷 Давай запряжем пятикурсницу подработать курьером. Да пусть она идет в опасную пещеру с пауками, норм же.

🦹‍♂️ Выходишь из Хогвартса — натыкаешься на браконьеров-темных магов, и это даже не в запретном лесу. Видимо сто лет назад министр магии особо не следил за правопорядком.

👥 У меня могут появиться одновременно два квеста с одним и тем же персонажем в совершенно разных местах.

😵‍💫 Тупейший главный герой.
— Никому не рассказывай про свою силу
— Ок
Пофиг, рассказал(а) всем.

Пересмотрев Философский камень понял, что это калька с Гарри Поттера, он тоже не отличается умом.

Я доставила зелье, как вы и просили… а еще я спёрла у продавщицы книгу рецептов, вот вам принесла

WTF мне даже выбора не дали, говорить это или нет.

Поведение ГГ в квесте с оборотным зельем - это вообще эталон кринжа. И я опять ничего не могу выбрать.

🦭 Животным в дикой природе угрожают браконьеры, поэтому давай собирать их в бездонную сумку (как у Ньюта) и выпускать в небольшой локации в Выручай-комнате.

Это точно RPG? Вроде должен быть хоть какой-то выбор в диалогах, а по факту он ни на что не влияет. А в некоторых местах мне прямо диктуют какие эмоции я должен испытывать. Я был не против напасть вместе с союзником на лагерь гоблинов, но главный герой после боя отчитал его за безрассудство.

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

По выходным отдыхаю от фейспалмов в No Man’s Sky. Вот этой игрой я крайне положительно удивлен. А что касаемо Хогвартса, думаю, что после прохождения сюжетки, я заброшу игру.

этогик | etogeek.ru | #шортики #игры
Please open Telegram to view this post
VIEW IN TELEGRAM
😁4👍3
🅰️ Одинарные и двойные кавычки в Bash?

После информации про фигурные скобки нельзя не сказать про кавычки — где использовать echo 'URL = https://$VAR.ru', а где echo "URL = https://$VAR.ru".

🟠 Одинарные кавычки ('some'):

Строки внутри таких кавычек будут считаться буквальными и переменные внутри не будут раскрыты. Все спецсимволы, кроме самой кавычки, трактуются буквально.
VAR=etogeek
echo 'URL = https://$VAR.ru'

URL = https://$VAR.ru


🟠 Двойные кавычки ("some"):

Переменные в строках в таких кавычках будут развернуты:
VAR=etogeek
echo "URL = https://$VAR.ru"

URL = https://etogeek.ru


🟠 Обработка спецсимволов:

- Внутри двойных кавычек некоторые спецсимволы (например, $, \) могут иметь специальное значение и будут интерпретироваться. Например, \n будет заменено на символ новой строки.
- Внутри одинарных кавычек спецсимволы трактуются буквально, и они не имеют особого значения.
- Спецсимволы можно экранировать (escape) с помощью backslash (\)

VAR=etogeek
echo "URL:\nhttps://$VAR.ru"

URL:
https://etogeek.ru


🟠 Тройные кавычки (""", '''):

Обычно тройные кавычки используются для создания многострочных строк (каламбур, но да). Так же в тройных кавычках можно использовать обычные не экранируя символы:

VAR=etogeek
echo """
This is my site '$VAR':
URL = https://$VAR.ru
Keep learning! "'$VAR'"
"""

This is my site 'etogeek':
URL = https://etogeek.ru
Keep learning! $VAR


этогик | etogeek.ru | #техшортики
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥8
🌃 Пока отдыхал от праздников обнаружил, что в открытый доступ выложили записи докладов с мартовского DevOpsConf. Много интересных тем!

Уверен, вы найдете и для себя что-нибудь интересное:

👉 https://www.youtube.com/@DevOpsChannel/videos

этогик | etogeek.ru | #нашел
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥1
🔊 Что я слушаю когда работаю?

Раньше у меня был такой пост, но даже ссылкой на него делиться не буду, потому что его нужно обновить! Всё с ссылками на плейлисты, наслаждайтесь.

На чем слушаю?

AirPods Pro 2 — мощная активная шумоизоляция, отлично держатся в ушах, все еще хорошо держат зарядку, правильно переключаются между девайсами. Им уже больше года, использую каждый день. Я плотно подсел на экосистему Apple и не думаю, что в обозримом будущем уйду к другому бренду наушников.

Что слушаю?

Всё очень зависит от настроения, задачи, уровня энергии, но вот основные плейлисты из закладок:

Открытие года — под хип-хоп круто работается, собрал такой плейлист в Spotify. А вот попробовал перенести его в Яндекс.Музыку - ссылка. Очевидно, что не все треки перенеслись, но рекомендательная система должна справиться с наполнением.

Если хочется чуть более спокойной музыки, то включаю lo-fi girl. Либо в Spotify, либо на Youtube.

Вечно угораю с того, что саундтрек от игры Stronghold Crusader второй год подряд оказывается в топе моего Spotify Wrapped, но это не отменяет того, что это очень классный 40-минутный плейлист. Spotify, Youtube.

Длиннющий, одновременно расслабляющий и держащий в фокусе плейлист с ambient-ремиксом саундтрека к фильму Dune.

Тоже длинный плейлист, повторяющийся, но более расслабленный — музыка из игры Witcher 3. Youtube.

Когда настроение повеселее, то могу включить мой retro-плейлист - Spotify, ЯндексМузыка.

Два плейлиста по 15-20 минут — две радиостанции из игры GTA 3 на Youtube: Game Radio, и Head Radio.

Довольно бодрая музыка, может отвлекать, подходит для менее сосредоточенной и рутинной работы — 40 минут, альбом группы The Medics (NL) Spotify, Youtube.

Скидывайте в комменты ваши любимые плейлисты под которые вы работаете!

этогик | etogeek.ru | #шортики
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥1👏1
Что ж, этот день настал — выложил первое видео на Youtube.

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

2024-ый год нарекаю годом контента, поэтому впереди море экспериментов и творчества.

Если вам близки темы освещаемые в этом канале, то обязательно подписывайтесь и на youtube-канал. А каждый лайк и реакция ускоряет выход и увеличивает качество нового ролика!

👉 https://www.youtube.com/watch?v=_rfYnaXXg3k

этогик | etogeek.ru | #видео
🔥23👍9🎉2
Наглядно о том, как работает Load Average.

Я уже писал об этом, но вот незапланированно попалась ситуация, которая классно демонстрирует всё это.

На скриншоте — дашборд в Grafana с железными метриками виртуальной машины. Как видно машинка имеет всего 2 ядра.

Я запустил на ней команду docker system prune -a, которая удаляет неиспользуемый докером мусор.

Из графиков можно понять, что команда выполняется в одном потоке, на одном ядре, так как загрузка процессора висит ровно на 50%.

На втором графике, где есть разбивка нагрузки про режимам, все эти 50% заняты под iowait. В этом режиме процессы ожидают времени для операций ввода-вывода.

Теперь к графику Load Average:

Если обобщить, эта метрика показывает среднее количество процессов и(!) операций ввода-вывода в очереди за этот промежуток времени.

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

Грубо, но на это можно ориентироваться при самом поверхностном траблшутинге: если на сервере без прошлой высокой нагрузки внезапно вырос показатель LA, явно что-то пошло не так.

Здесь мы наглядно видим, что загруженное на 100% одно ядро даёт LA = 1. Даже на многоядерной машине.

Так же на этом графике сразу выводится три линии - для LA 1, 5, 15 - усредненные значения за 1, 5 и 15 минут. По 15-минутному графику можно понять, что нагрузка на машину длительная или пиковая только сейчас на короткий промежуток времени.

этогик | etogeek.ru | #техшортики
👍14
🐮 Moo-nsible или как Ансибл заговорил на коровьем.

На выходных, уже не помню для какого прикола, установил себе пакет cowsay (который в терминал выводит сообщения от лица коровы).

А в понедельник на первом запущенном плейбуке оказалось, что Ansible по умолчанию начинает делать весь вывод через cowsay.

По умолчанию. Чтобы отключить, нужно явно указать это в конфигурации (nocows = True в ansible.cfg) или в переменной окружения (export ANSIBLE_NOCOWS=1)

Issue на Github, в котором просят сделать эту функцию не дефолтной, вообще поражает комментариями - https://github.com/ansible/ansible/issues/10530

Иногда это может быть даже весело, особенно с переменной ANSIBLE_COW_SELECTION=random, но в целом только мешает в работе.

этогик | etogeek.ru
Please open Telegram to view this post
VIEW IN TELEGRAM
😁12🔥1
Вот — обновочки, купил монитор. Надоело сидеть за 13-дюймовым экранчиком ноутбука, хоть он и очень качественный.

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

Что взял:
iiyama xub2792qsn — 27 дюймов и 2k разрешение (2560х1440). Не 4к, конечно, что было бы идеально для Macos, но всё же такой промежуточный вариант.

Самое главное преимущество — подключение через type-c. Теперь у меня в розетку воткнут только монитор, а макбук подключен к монитору по обычному толстому type-c. Через него - звук, зарядка, изображение, и даже сеть может идти 🤓

Раньше у меня был Samsung Odyssey G5, так вот у него были проблемы с цветовым профилем. Я не знаю как, но цвета на мониторе очень сильно отличались от того, что на экране мака. Я уже начал вручную править цветовые профили, потом плюнул и привык.

У этого с цветами все хорошо. Только трясется сильно. Монитор тяжелый, а ножка хлипкая. Еще и Икеевский стол ходуном любит ходить. Ну ничего.

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

Вот так вот. На картинке мой текущий сетап.

этогик | etogeek.ru
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥22👍9😁3🤔21
Новое видео на канале 🖥

Продолжаю экспериментировать с различными форматами, на этот раз — рассказываю историю своей работы на удаленке: начиная с офиса, проходя через разные гибриды и заканчивая полной удаленной работой. (люблю рассказывать истории)

Приятного просмотра!

👉 https://www.youtube.com/watch?v=Rd4iv8DV8sg

этогик | etogeek.ru | #видео
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🔥2
💡 Как GitHub готовят m1-раннеры для Actions

Что вообще такое раннер? Это некое приложение на сервере, которое выполняет команды, которые мы ему скажем.

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

Некоторые компании, например GitHub или Gitlab предоставляют так называемые cloud-раннеры: вы просто указываете на какой операционной системе нужно запустить ваши команды и не думаете как и где они запускаются.

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

А как быть, если нам нужно собрать приложение для MacOS или iOS? Такие штуки запускаются собственно только на MacOS.

Конечно, вы можете запускать self-hosted раннеры. Это которые вы сами устанавливаете куда хотите и подключаете к своим пайплайнам. И этим “куда хочешь” может быть MacBook. Да, можно установить в офисе несколько макбуков и собирать приложения на них.

GitHub, например, предлагает использовать их cloud-раннеры на базе m1 процессоров.

Вот попалось видео на видео показано, как буквально разбирают MacMini, достают из него железки, запихивают в более удобный корпус и собирают в большую стойку. На этих мак-ах и запускаются ваши джобы, в которых вы укажете runs-on: macos-latest.

👉 А вот и видео: https://www.youtube.com/watch?v=I2J2MzKjcqY, всего две минуты на англ.

Удивительно, что Apple до сих пор не продает какие-нибудь серверные варианты своих процессоров для подобных целей.

этогик | etogeek.ru | #нашел
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥4
Хэллоу, пипл! Вот и закончился небольшой отпуск и впереди довольно насыщенная неделя на задачи, но вот из новостей — перетащил свой сайт на новый домен и на новый движок. По порядку про сайт:

Купил новый домен
etogeek.dev. Он интересен тем, что top-level-domain (TLD) .dev, как и еще несколько десятков гугловых доменов (.page, .app) включен в список HSTS-доменов, и работает с принудительным HTTPS. То есть в браузере без https оно не откроется.

Да и вообще про сайт: там должны выходить посты, которые не влезают в формат Телеграма. Но давно ничего не было, потому что я хотел переехать на движок Hugo. Вот, закончил переезд.
Hugo — это генератор ст
атики, ты на вход подаешь ему конфигурационные файлы и посты-страницы в формате Markdown, а на выходе он отдает статические файлы, которые раздает веб-сервер, например Nginx. Никакой базы данных.

Столкнулся с другой схемой URL-ов в Ghost (старый движок) и Hugo: в Ghost ссылка на пост выглядела как
https://etogeek.dev/good-post
А в Hugo:
https://etogeek.dev/posts/good-post.
Да, там можно закинуть все посты в “корень”, но это поведет разделение на категории и некоторые ссылки. Короче, нет.

Мне хотелось сохранить некоторые ссылки, на которые уже издавна ведут поисковики, в итоге я выбрал десяток топ-постов и добавил для них в Nginx-конфиг редирект с кодом 301. Он говорит поисковикам, что страница окончательно переехала на новый адрес:

location ~ ^/(post1|..|postN) {
return 301 https://etogeek.dev/posts/$1;
}


Много проблем было с перетаскиванием постов со Ghost на Hugo. В основном из-за необходимости выкачать картинки, и поменять внутренние ссылки. Но так же пришлось вычищать некоторые shortcodes, которые остались от Ghost-а. По большей части — в ручную, но где-то и набросал скрипты.

Сделал ci/cd и два окружения. Да, у меня на сайте теперь есть dev и prod окружение, которые катятся из разных веток автоматически. Перебор? Да. Зачем? Прикольно же.
Думаю, что рано или поздно я сделаю этот репозиторий публичным, и запишу видео о том, как развернуть свой сайт или блог или cv-страничку на github pages.

Не стал добавлять yandex и google метрики, остановился на опенсорсном GoatCounter, только вот js-скрипт для сбора статистики блокируется некоторыми adblocker-ами.

В этой статье я писал о том, как добавить тему в Hugo путем скачивания репозитория с темой прямо в наш сайт, но я наконец-то разобрался с рекомендуемым разработчиками способом - через git submodules. Да, так в разы проще. Статья, получается, требует обновления 🙂

Вроде ничего не забыл. Желаю всем продуктивной недели, идем работать!
👍13🔥1