Разбираемся с options и inputs в gitlab
ㅤ
Частенько ребята с LF стали приходить с такой проблемой:
Это кусокговна пайплайна, который при запуске формирует выпадающий список окружений, выбираешь окружение и деплой проходит в него.
Ошибок синтаксиса в ямликах нет, каких-то разумных сообщений и наводок от гитлаба тоже нет. Чё делать?
➡️ Решение
Идем:
Всё! Теперь выпадающие списки вновь начинают работать.
А еще людей смущает новая штука
Оно будет пиздеть во внутреннем редакторе -
А зачем нам этот input ведь с options и так всё работает?
Ну хотя бы из-за типизированных параметров:
То есть:
- можно сделать чекбокс (boolean)
- можно сделать список (array)
- можно сделать ограничение по диапазону (number)
- можно сделать строгие варианты (options)
- можно сделать regex-валидацию
А обычный
GitLab постепенно превращает CI в настоящий «Pipeline as Functions».
Например, в проекте А:
И проекте B можно вызвать:
Это как вызов функции с аргументом.
Что еще:
- Inputs работают даже при trigger-пайплайнах
- Inputs могут быть required
- Inputs отображаются отдельно и аккуратно в UI
- Inputs часть нового стандарта GitLab CI Components
Короче одни плюсы. Но есть большое НООООО!
Это пиздец усложняет процесс разработки и отладку пайплайна.
Да, стало удобнее и гибче, но всё это превращается в безумное ООП, где без базы и документации к проекту — ты хуй разберешься.
Пока тебе хватает обычных
Изучай!
Как говорится — и не такие метели в ебало летели!
🛠 #devops #cicd #linuxfactory
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
ㅤ
Частенько ребята с LF стали приходить с такой проблемой:
stages:
- deploy
variables:
ENVIRONMENT:
description: "Deployment environment"
value: "N/A"
options:
- "N/A"
- "STAGE"
- "PRODUCTION"
deploy:
stage: deploy
script:
- echo "Выбрано окружение:" "${ENVIRONMENT}"
rules:
- when: manual
Это кусок
НО — этот список перестал появляться. Причем избрано, у кого-то есть, у кого-то хуй с маслом.
Ошибок синтаксиса в ямликах нет, каких-то разумных сообщений и наводок от гитлаба тоже нет. Чё делать?
Идем:
Settings → CI/CD → Variables и кликаем в радио-батон — Developer.Всё! Теперь выпадающие списки вновь начинают работать.
А еще людей смущает новая штука
inputs, которая совсем недавно появилась. Работает она с 17й версии.spec:
inputs:
environment:
description: "Куда деплоим?"
type: string
default: "N/A"
options:
- "N/A"
- "STAGE"
- "PRODUCTION"
---
stages:
- deploy
deploy:
stage: deploy
rules:
- when: manual
script:
- echo "Выбрано окружение: $[[ inputs.environment ]]"
Оно будет пиздеть во внутреннем редакторе -
Incorrect type. Expected "string | array".yaml-schema, но будет работать если запустить пайплайн.Ошибка возникает, потому, что Pipeline Editor использует старый YAML-валидатор. Так что, не обращай внимание на этот пиздёж.
А зачем нам этот input ведь с options и так всё работает?
Ну хотя бы из-за типизированных параметров:
type: string | number | boolean | array
То есть:
- можно сделать чекбокс (boolean)
- можно сделать список (array)
- можно сделать ограничение по диапазону (number)
- можно сделать строгие варианты (options)
- можно сделать regex-валидацию
А обычный
variables такого не умеют.GitLab постепенно превращает CI в настоящий «Pipeline as Functions».
Например, в проекте А:
spec:
inputs:
env:
type: string
options: [stage, prod]
---
deploy-job:
script: deploy_to $[[ inputs.env ]]
И проекте B можно вызвать:
deploy:
trigger:
project: A
inputs:
env: prod
Это как вызов функции с аргументом.
Что еще:
- Inputs работают даже при trigger-пайплайнах
- Inputs могут быть required
- Inputs отображаются отдельно и аккуратно в UI
- Inputs часть нового стандарта GitLab CI Components
Короче одни плюсы. Но есть большое НООООО!
Это пиздец усложняет процесс разработки и отладку пайплайна.
Да, стало удобнее и гибче, но всё это превращается в безумное ООП, где без базы и документации к проекту — ты хуй разберешься.
Пока тебе хватает обычных
options используй их. Не лезь в это ООП, оно пока рано и избыточно, особенно если ты новичок.Изучай!
Как говорится — и не такие метели в ебало летели!
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
7 41
Надоел и приелся VirtualBox/VMWare? Хочется новенького?
Да легко, опять же эта новая херабора как-то мимо многих прошла, включая меня. Нет это не LXC, vagrant и даже не docker.
Короче, это — Multipass от Canonical. И да, полностью бесплатная и с мордой.
ㅤ
Выдумать ничего не буду, лови нативку с сайта:
Работает под Linux, Wiundows, Mac
Что же это за зверь?
Multipass использует доступный гипервизор в зависимости от платформы:
- Linux — KVM
- macOS — HyperKit или QEMU
- Windows — Hyper-V или VirtualBox (в новых версиях QEMU)
Можно управлять как через морду, так и через командную строку. Это развязывает руки. Например, можно накодить себе bash скрипт и через него поднимать виртуалки под лабы.
Чё прикольно, для него есть Terraform провайдер, ну прям не инструмент, а золото.
Работает элементарно, если через морду — выбираешь дистрибутив, накручиваешь ползунки и жмешь Launch, через 40 секунд у тебя готовая виртуалка.
Ну либо headless (через командную):
Основные команды:
Из дистрибутивов только Ubuntu, но этого достаточно чтобы что-то протестировать либо погонять. Ребята в LF активно этим инструментом пользуются и создают тестовые кубер-кластера, ну и ансибл оттачивают.
Настроек там жопой ешь, так что можно и статические айпишники мутить, выбирать сетевые режимы и многое другое.
В общем рекомендую, инструмент зачетный, никакой ёбли как VBox и VMWare.
🛠 #devops #vm #linux
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Да легко, опять же эта новая херабора как-то мимо многих прошла, включая меня. Нет это не LXC, vagrant и даже не docker.
Дело пахнет писюнами…
Короче, это — Multipass от Canonical. И да, полностью бесплатная и с мордой.
ㅤ
Выдумать ничего не буду, лови нативку с сайта:
Получитепо ебалумгновенную виртуальную машину Ubuntu с помощью одной команды. Multipass может запускать виртуальные машины и настраивать их с помощью cloud-init, как в общедоступном облаке. Прототип вашего облака запускается локально и бесплатно.
Работает под Linux, Wiundows, Mac
Что же это за зверь?
Multipass использует доступный гипервизор в зависимости от платформы:
- Linux — KVM
- macOS — HyperKit или QEMU
- Windows — Hyper-V или VirtualBox (в новых версиях QEMU)
Можно управлять как через морду, так и через командную строку. Это развязывает руки. Например, можно накодить себе bash скрипт и через него поднимать виртуалки под лабы.
Чё прикольно, для него есть Terraform провайдер, ну прям не инструмент, а золото.
terraform {
required_providers {
multipass = {
source = "larstobi/multipass"
version = "~> 1.4.2"
}
}
}Работает элементарно, если через морду — выбираешь дистрибутив, накручиваешь ползунки и жмешь Launch, через 40 секунд у тебя готовая виртуалка.
Ну либо headless (через командную):
Основные команды:
multipass launch --name foo
multipass exec foo -- lsb_release -a
multipass list
multipass stop foo bar
multipass start foo
multipass delete bar
multipass purge
multipass find
multipass launch -n bar --cloud-init cloud-config.yaml
multipass help
Из дистрибутивов только Ubuntu, но этого достаточно чтобы что-то протестировать либо погонять. Ребята в LF активно этим инструментом пользуются и создают тестовые кубер-кластера, ну и ансибл оттачивают.
Настроек там жопой ешь, так что можно и статические айпишники мутить, выбирать сетевые режимы и многое другое.
В общем рекомендую, инструмент зачетный, никакой ёбли как VBox и VMWare.
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
5 61
А вот это нам надо!
TUI админка для Proxmox. И да, ее можно поставить себе локально и цепануть к ней все твои Proxmox кластера, которые находятся где-то в сети.
ㅤ
Называется всё это добро — pvetui
Работает под всеми операционками, так как реализован на GO.
А зачем? Ну я заебался каждый раз лезть в браузер, чтобы сделать какие-то рутинные действия, да и айпишники я никогда не помню чтобы к ним по ssh подключиться. А через
Установка и запуск:
Под другие ОС:
При первом запуске утилита попросит сконфигурировать её. Жмем пару раз Enter, открывается редактор конфига, заполняем необходимые поля.
Я заполнил URL, логин и пароль от панели Proxmox. Чтобы оно не орало, нужно стереть данные в полях API, тогда оно даст сохранить конфигурационный файл.
Инициализация, закончена, видим сообщение:
Запускаем морду и смотрим что получилось.
Эту штуку можно повесить на alias либо прописать в PATH, чтобы полные пути до бинарника каждый раз не писать.
А получилось у нас прям заебись. Теперь я нажимаю ALT+2 и попадаю в список всех своих виртуальных машин. Стрелочками выбираю нужную мне машину и нажимаю букву «m», открывается менюшка.
В менюшке можно сразу провалиться в машину по SSH, что мне и нужно. Но это еще не всё, там и ребуты и миграции, даже VNC есть (нужен xdg). Короче базовый минимум поадминить присутствует.
Да, если нажать «ESC» то откроется еще одна глобальная менюшка для конфигурации самой утилиты, выбор профилей, управление плагинами и т.п.
Короче явки-ссылки я тебе дал, дальше сам смотри, всё там гибко конфигурируется и настраивается. И тем более TUI интерфейсы сейчас прям в трендах.
Хорошей тебе рабочей недели! Не болей!
🛠 #selfhosting #linux #devops
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
TUI админка для Proxmox. И да, ее можно поставить себе локально и цепануть к ней все твои Proxmox кластера, которые находятся где-то в сети.
ㅤ
Называется всё это добро — pvetui
Работает под всеми операционками, так как реализован на GO.
А зачем? Ну я заебался каждый раз лезть в браузер, чтобы сделать какие-то рутинные действия, да и айпишники я никогда не помню чтобы к ним по ssh подключиться. А через
pvetui такое можно провернуть в два счета.Ты скажешь — дак сделай алиасы для айпишников и цепляйся к нужным виртуалкам. Справедливо, но мне лень. Тем более виртуалки у меня постоянно создаются, удаляеются и я ебал каждый раз алиасы делать.
Установка и запуск:
go install github.com/devnullvoid/pvetui/cmd/pvetui@latest
/home/user/go/bin/pvetui
Под другие ОС:
yay -S pvetui-bin
yay -S pvetui-git
brew install --cask devnullvoid/pvetui/pvetui
scoop bucket add pvetui https://github.com/devnullvoid/scoop-pvetui
scoop install pvetui
# либо из исходников
git clone https://github.com/devnullvoid/pvetui.git
cd pvetui
make install
При первом запуске утилита попросит сконфигурировать её. Жмем пару раз Enter, открывается редактор конфига, заполняем необходимые поля.
Я заполнил URL, логин и пароль от панели Proxmox. Чтобы оно не орало, нужно стереть данные в полях API, тогда оно даст сохранить конфигурационный файл.
Но опять же если у тебя API ключ, делаешь под своё конфигурацию.
Инициализация, закончена, видим сообщение:
✅ Configuration is ready!
🔄 Please re-run 'pvetui' to start the application with your new configuration.
🚪 Exiting.
Запускаем морду и смотрим что получилось.
/home/user/go/bin/pvetui
Эту штуку можно повесить на alias либо прописать в PATH, чтобы полные пути до бинарника каждый раз не писать.
А получилось у нас прям заебись. Теперь я нажимаю ALT+2 и попадаю в список всех своих виртуальных машин. Стрелочками выбираю нужную мне машину и нажимаю букву «m», открывается менюшка.
В менюшке можно сразу провалиться в машину по SSH, что мне и нужно. Но это еще не всё, там и ребуты и миграции, даже VNC есть (нужен xdg). Короче базовый минимум поадминить присутствует.
Да, если нажать «ESC» то откроется еще одна глобальная менюшка для конфигурации самой утилиты, выбор профилей, управление плагинами и т.п.
Короче явки-ссылки я тебе дал, дальше сам смотри, всё там гибко конфигурируется и настраивается. И тем более TUI интерфейсы сейчас прям в трендах.
Хорошей тебе рабочей недели! Не болей!
—
Please open Telegram to view this post
VIEW IN TELEGRAM
7 68
Как я обновил Proxmox и остался жив
Здрасти, приехали. Сегодня будем обновлять proxmox 8 на 9.1 Оно в принципе и необязательно, но очень хотелось потыкать новую фичу с OCI.
А нахуя? Чтобы проще запускать приложения, которые уже существуют в виде Docker-образов. Теперь в LXC не нужно поднимать отдельно докер демон, все работает из коробки.
Ладно, отвлеклись. Про OCI отдельно распишу. Сегодня обновляем всю эту трихомудию до нужной версии.
Бекапить я ничего не буду, бекапы для слабаков. Но ты меня не слушай, делай правильно и подстилай соломку.
По классике сюда всё не влезло, поэтому гоу в блог читать продолжение 👇
🅰️ 🅰️ 🅰️ 🅰️ 🅰️ 🅰️ 🅰️ 🅰️
➡️ https://two.su/4ui2c
🅰️ 🅰️ 🅰️ 🅰️ 🅰️ 🅰️ 🅰️ 🅰️
🛠 #proxmox #devops #selfhosting
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Здрасти, приехали. Сегодня будем обновлять proxmox 8 на 9.1 Оно в принципе и необязательно, но очень хотелось потыкать новую фичу с OCI.
OCI это способ запускать контейнеры из Docker-образов. То есть proxmox теперь умеет скачивать Docker-образы (OCI-images) и превращать их в LXC-контейнеры.
А нахуя? Чтобы проще запускать приложения, которые уже существуют в виде Docker-образов. Теперь в LXC не нужно поднимать отдельно докер демон, все работает из коробки.
Ладно, отвлеклись. Про OCI отдельно распишу. Сегодня обновляем всю эту трихомудию до нужной версии.
Бекапить я ничего не буду, бекапы для слабаков. Но ты меня не слушай, делай правильно и подстилай соломку.
Даже если у меня всё пойдет по пиздец, это отличный кейс, чтобы отдебажить проблему и решить её.
По классике сюда всё не влезло, поэтому гоу в блог читать продолжение 👇
—
Please open Telegram to view this post
VIEW IN TELEGRAM
Bashdays
Обновляем Proxmox 8 до Proxmox 9 (OCI)
Подробная инструкция по переходу на новую ветку Debian Trixie в Proxmox. Фиксим репы, обновляем ключи, прогоняем pve8to9 и устанавливаем всё, что предлагает система. Даю комментарии по каждому этапу, чтобы апдейт не превратился в ад.
11 40
Техническое_задание_на_разработку_приложения.pdf
87.6 KB
Подработка на разработку!
Мой хороший товарищ попросил закинуть, закидываю.
ㅤ
Мож у кого-то команда разработчиков простаивает, ну либо договоритесь выполнить какую-то часть работ в плане инфраструктуры.
Короче, за подробностями пишите Марии, все расскажет и покажет 👇
@marysako_py
чтобы вопросов не было — публикация ТЗ и контактов согласованы
Мой хороший товарищ попросил закинуть, закидываю.
ㅤ
Мож у кого-то команда разработчиков простаивает, ну либо договоритесь выполнить какую-то часть работ в плане инфраструктуры.
Короче, за подробностями пишите Марии, все расскажет и покажет 👇
@marysako_py
чтобы вопросов не было — публикация ТЗ и контактов согласованы
Docker Privileged VS Non-privileged
Давай сразу к примерам:
➡️ Non-privileged
Ты ребёнок, тебя посадили в песочницу, дали совок и формочки, сказали — слышь еблан, играть можно только здесь!
Ты можешь:
— лепить куличики и кренделя
— копать ямки и могилки для жуков
— сыпать песочек в глаза другим детям
— строить свой маленький мир
Ты не можешь:
— вылазить из песочницы
— пойти на стройку и доебывать сторожа
— насрать в ладошку и кидаться этим в людей
— послать всех нахуй и сделать по своему
Ты работаешь строго в пределах песочницы. Безопасно, предсказуемо, контролируемо, изолировано. Ты бездушный non-privileged контейнер.
➡️ Privileged
Ты ребёнок, но всем на тебя поебать, ты сам выбираешь сидеть тебе в песочнице или кидаться с балкона кирпичами в пустые головы прохожих. У тебя развязаны руки, любые безумные поступки позволительны. У тебя есть ключи от всех дверей и тебе за это ничего не будет.
Всё это происходит, когда ты запускаешь:
Твой контейнер может:
— управлять сетевыми интерфейсами хоста
— лезть в
— монтировать что угодно куда угодно
— работать как полноценная виртуалка
— запускать systemd, модифицировать ядро, iptables, модули и т.п
То есть, это уже не ребёнок в песочнице, а ребёнок со швейцарским армейским ножом, запертый в серверной.
➡️ Non-privileged (обычный контейнер)
- Ограниченный доступ к Linux capabilities
- Нет доступа к аппаратным устройствам
- Нет прав на управление сетью хоста
- Запуск отдельных процессов, а не мини-ОС
- Работает в namespace'ах и cgroup'ах изоляции
Используется для:
- веб-сервисов
- приложений
- баз данных
- CI/CD runner’ов (если привилегия не нужна)
- всего, что «из коробки» работает в Docker
➡️ Privileged (контейнер-всевластия)
- Доступ ко всем Linux capabilities
- Может лезть в
- Может менять сетевые интерфейсы хоста
- Может работать как виртуалка
- Может запускать systemd
- Может cломать или убить сеть, firewall и модули ядра
Используется для:
- контейнеров, которым нужны реальные устройства
- low-level инструментов: tcpdump, wireshark, iptables
- Docker-in-Docker в особых сценариях
- Kubernetes kubelet / CNI плагины
- экспериментов, когда нужно «полный root над всем»
Что выбрать?
Мой алгоритм:
В большинстве случаев лучше выдать минимум необходимых прав, чем сразу открывать ящик пандоры.
Ну и для отладки
На днях продолжим…
🛠 #linuxfactory #linux #docker
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Как говорится — «Нам нужно досье на этого мисье»
Давай сразу к примерам:
Ты ребёнок, тебя посадили в песочницу, дали совок и формочки, сказали — слышь еблан, играть можно только здесь!
Ты можешь:
— лепить куличики и кренделя
— копать ямки и могилки для жуков
— сыпать песочек в глаза другим детям
— строить свой маленький мир
Ты не можешь:
— вылазить из песочницы
— пойти на стройку и доебывать сторожа
— насрать в ладошку и кидаться этим в людей
— послать всех нахуй и сделать по своему
Ты работаешь строго в пределах песочницы. Безопасно, предсказуемо, контролируемо, изолировано. Ты бездушный non-privileged контейнер.
Ты ребёнок, но всем на тебя поебать, ты сам выбираешь сидеть тебе в песочнице или кидаться с балкона кирпичами в пустые головы прохожих. У тебя развязаны руки, любые безумные поступки позволительны. У тебя есть ключи от всех дверей и тебе за это ничего не будет.
Всё это происходит, когда ты запускаешь:
docker run --privileged
Твой контейнер может:
— управлять сетевыми интерфейсами хоста
— лезть в
/dev— монтировать что угодно куда угодно
— работать как полноценная виртуалка
— запускать systemd, модифицировать ядро, iptables, модули и т.п
То есть, это уже не ребёнок в песочнице, а ребёнок со швейцарским армейским ножом, запертый в серверной.
- Ограниченный доступ к Linux capabilities
- Нет доступа к аппаратным устройствам
- Нет прав на управление сетью хоста
- Запуск отдельных процессов, а не мини-ОС
- Работает в namespace'ах и cgroup'ах изоляции
Используется для:
- веб-сервисов
- приложений
- баз данных
- CI/CD runner’ов (если привилегия не нужна)
- всего, что «из коробки» работает в Docker
- Доступ ко всем Linux capabilities
- Может лезть в
/dev, работать с устройствами- Может менять сетевые интерфейсы хоста
- Может работать как виртуалка
- Может запускать systemd
- Может cломать или убить сеть, firewall и модули ядра
Используется для:
- контейнеров, которым нужны реальные устройства
- low-level инструментов: tcpdump, wireshark, iptables
- Docker-in-Docker в особых сценариях
- Kubernetes kubelet / CNI плагины
- экспериментов, когда нужно «полный root над всем»
Что выбрать?
Мой алгоритм:
Задача не требует низкоуровневых операций?⚪ всегда non-privileged.
Нужно одно конкретное действие (например NET_ADMIN)?⚪ --cap-add вместо privileged.
Нужен доступ к устройству?⚪ --device вместо полного доступа.
Ничего из этого не помогает?⚪ тогда уже --privileged.
В большинстве случаев лучше выдать минимум необходимых прав, чем сразу открывать ящик пандоры.
Ну и для отладки
privileged прям мастхев, чтобы исключить какие-то внешние факторы, от которых могут лезть баги.На днях продолжим…
—
Please open Telegram to view this post
VIEW IN TELEGRAM
13 63
А у нас сегодня на повестке интересная «темка» — Автоматическая очистка tmp-файлов даже после SIGTERM.
ㅤ
Пишем подопытный скрипт:
Чмодим, запускаем, ага скрипт упал на
Код выходы проверить так:
Здесь я взял синтетику, показать наглядно этот случай. Суть «темки» — подчищать за собой, при любых обстоятельствах, даже если скрипт вернул ошибку, либо завершился успешно.
Снова изобретать велосипед? Неа! Всё это работает из коробки.
В этом случае скрипт также вернет код
Нихуя непонятно, но очень интересно.
Смотри —
Давай подключим
В выхлопе видим:
То есть Bash вызывает
Почему trap срабатывает?
Если скрипт упал или получил сигнал
— в обработчике сигнала вызывается registered trap
— затем Bash падает/выходит
—
Да банально при выполнении скрипта ты нажал
Вот такие пироги!
С пятницей и хороших тебе предстоящих выходных!
🛠 #bash #debug #strace
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
ㅤ
Как говорится — Волков бояться, в лесу не ебаться!
Пишем подопытный скрипт:
#!/usr/bin/env bash
set -e
temp=$(mktemp)
echo "Создал файл: $temp"
false
echo "Удаляю файл"
rm -f "$temp"
Чмодим, запускаем, ага скрипт упал на
false, но успел создать временный файл в папке /tmp == /tmp/tmp.oWQ0HiYxSV. И он не удалился. Скрипт вернул статус == 1;Код выходы проверить так:
echo "код: $?"
Здесь я взял синтетику, показать наглядно этот случай. Суть «темки» — подчищать за собой, при любых обстоятельствах, даже если скрипт вернул ошибку, либо завершился успешно.
Снова изобретать велосипед? Неа! Всё это работает из коробки.
#!/usr/bin/env bash
set -e
temp=$(mktemp)
echo "Создал файл: $temp"
trap 'echo "Удаляю $temp"; rm -f "$temp"' EXIT
false
В этом случае скрипт также вернет код
1, но временный файл будет удалён при любом раскладе.Нихуя непонятно, но очень интересно.
Смотри —
trap вызывает rm ПРИ ВЫХОДЕ ИЗ СКРИПТА. И похуй с каким статусом был завершен скрипт. Временный файл будет гарантированно удалён.Давай подключим
strace:strace -e trace=process,signal bash -c '
tmp=$(mktemp)
trap "rm -f $tmp" EXIT
echo "tmp=$tmp"
'
В выхлопе видим:
openat(AT_FDCWD, "/tmp/tmp.Dn2qG3uK9V", O_RDWR|O_CREAT|O_EXCL, 0600) = 3
rt_sigaction(SIGINT, {sa_handler=0x...}, NULL, 8) = 0
rt_sigaction(SIGTERM, {sa_handler=0x...}, NULL, 8) = 0
unlink("/tmp/tmp.Dn2qG3uK9V") = 0
exit_group(0) = ?
openat(... O_EXCL) — это mktemp, создающий файл атомарноrt_sigaction() — Bash ставит ловушки для сигналовunlink() — это и есть выполнение trapexit_group(0) = ? — завершает процессТо есть Bash вызывает
rm/unlink() ДО выхода из процесса.Почему trap срабатывает?
Если скрипт упал или получил сигнал
kill -TERM <pid>, то на уровне Bash:— в обработчике сигнала вызывается registered trap
— затем Bash падает/выходит
—
trap УЖЕ успел выполнить команду очисткиtrap выполняется ДО того, как процесс отдаст SIGTERM ядру, если только ловушка для этого сигнала была установлена.Да банально при выполнении скрипта ты нажал
CTRL+C, скрипт остановился, НО временные файлы сразу подчистились.➡️ Про exit codes (коды выхода) писал тут.➡️ Про сигналы писал ранее тут и тут и тут и тут.
Вот такие пироги!
С пятницей и хороших тебе предстоящих выходных!
—
Please open Telegram to view this post
VIEW IN TELEGRAM
5 55
В Proxmox 9.1 завезли OCI. В предыдущем посте про обновление с 8ки на 9ку я это уже упоминал, поэтому повторяться не буду.
Сегодня посмотрим как OCI работает на практике.
ㅤ
OCI это не какая-то отдельная сущность, это тот же самый LXC контейнер в котором будет запущен нужный тебе контейнер.
Тут важное замечание — тебе не нужно устанавливать руками docker демона в LXC и только затем запускать контейнер. OCI все сделает само. Это не какой-то встроенный docker или k8s. Всё так или иначе работает под управлением LXC.
К примеру возьмем заезженный образ nginx, который валяется в dockerhub:
Заходим в Proxmox и идем в раздел с шаблонами, там будет кнопка
➡️ ЧИТАТЬ ПРОДОЛЖЕНИЕ
🛠 #proxmox #devops #selfhosting
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
➡️ Как я обновлял Proxmox и остался жив
Сегодня посмотрим как OCI работает на практике.
ㅤ
OCI это не какая-то отдельная сущность, это тот же самый LXC контейнер в котором будет запущен нужный тебе контейнер.
Тут важное замечание — тебе не нужно устанавливать руками docker демона в LXC и только затем запускать контейнер. OCI все сделает само. Это не какой-то встроенный docker или k8s. Всё так или иначе работает под управлением LXC.
К примеру возьмем заезженный образ nginx, который валяется в dockerhub:
nginx:latest
Заходим в Proxmox и идем в раздел с шаблонами, там будет кнопка
Pull from OCI Registry.—
Please open Telegram to view this post
VIEW IN TELEGRAM
6 23
Бывает ли кибербезопасность удобной?
Как ускорить выдачу доступов, упростить расследование сбоев и забыть о постоянной смене паролей от уймы серверов? А заодно — защитить критичные ресурсы от взлома и случайных изменений?
Это возможно с PAM-системой, если она следит за балансом безопасности и удобства.
BI.ZONE PAM — решение, созданное с уважением к вашему пользовательскому опыту и основанное на концепции zero trust.
Смотрите короткие видео, чтобы самим оценить удобство ВI.ZONЕ PAM:
🔵 Подключение к защищаемым системам без паролей.
🔵 Кеширование MFA для ускорения массовых операций.
🔵 Подключение через терминальную ферму Linux.
🔵 Лицензии для старта и масштаба.
Как ускорить выдачу доступов, упростить расследование сбоев и забыть о постоянной смене паролей от уймы серверов? А заодно — защитить критичные ресурсы от взлома и случайных изменений?
Это возможно с PAM-системой, если она следит за балансом безопасности и удобства.
BI.ZONE PAM — решение, созданное с уважением к вашему пользовательскому опыту и основанное на концепции zero trust.
Смотрите короткие видео, чтобы самим оценить удобство ВI.ZONЕ PAM:
Please open Telegram to view this post
VIEW IN TELEGRAM
Чтоб тебе такого интересного рассказать… а давайка я научу тебя весьма полезной теме. Сегодня будем резать аппетиты.
Создаем синтетику
Чмодим и запускаем. По итогу твой проц начинает хуярить как не в себя, выжирая на 100500% все свободные ресурсы. Хуита!
ㅤ
Давай это исправим и разрешим скрипту хуячить лишь на 50%.
Для начала проверяем, сможем ли мы это сделать
Если получил выхлоп, то в большинстве случаев у тебя всё получится.
Создадим клетку «bashdays.slice»:
Здесь мы включаем нужные контроллеры для дочерних директорий, запихиваем туда текущий shell и в последней строчке выставляем 50% для CPU.
Снова запускаем первый скрипт-пожиратель и наблюдаем как проц перестал хуярить как не в себя и ограничен теперь половинкой (50%). Отличная работа!
Аналогично можно сделать и с RAM и с IO.
Создаем еще одну синтетику:
Жрём память пачками по 100 МБ. Сначала увидишь замедление (reclaim), потом — пиздец! Нас выкинет локальный OOM, но только внутри cgroup, а не всей системы.
Посмотреть статистику в реальном времени:
Ну и давай посмотрим IO (тормозим винт и превращаем его в флешку USB1.1). Цель — мы хотим, чтобы процесс читал с диска не быстрее 10 МБ/с:
Узнаем major:minor:
Допустим, диск —
И запускаем:
Теперь твой винт начинает работать как древняя флешка, хотя железо у тебя современное.
Короче такие вот приколы! Изучай!
🛠 #linux #cgroup #debug
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Тема крайне полезная, бери на вооружение, однажды в хозяйстве однозначно сгодится.
Создаем синтетику
#!/bin/bash
while :; do :; done
Чмодим и запускаем. По итогу твой проц начинает хуярить как не в себя, выжирая на 100500% все свободные ресурсы. Хуита!
ㅤ
Давай это исправим и разрешим скрипту хуячить лишь на 50%.
Для начала проверяем, сможем ли мы это сделать
mount | grep cgroup2
cat /sys/fs/cgroup/cgroup.controllers
Если получил выхлоп, то в большинстве случаев у тебя всё получится.
Создадим клетку «bashdays.slice»:
sudo su
cd /sys/fs/cgroup
mkdir bashdays.slice
echo "+cpu +memory +io" > cgroup.subtree_control
cd bashdays.slice
echo $$ > cgroup.procs
echo "50000 100000" > cpu.max
Здесь мы включаем нужные контроллеры для дочерних директорий, запихиваем туда текущий shell и в последней строчке выставляем 50% для CPU.
Снова запускаем первый скрипт-пожиратель и наблюдаем как проц перестал хуярить как не в себя и ограничен теперь половинкой (50%). Отличная работа!
Что такое cgroups — это такая комната наказаний в ядре Linux. Ты создаёшь группу процессов, ядро начинает следить за их CPU, памятью, диском, IO и карать, если они жрут больше положенного.
Аналогично можно сделать и с RAM и с IO.
echo $((512*1024*1024)) > memory.max
Создаем еще одну синтетику:
#!/bin/bash
blocks=()
while true; do
blocks+=("$(head -c 104857600 </dev/zero | tr '\0' 'A')")
echo "Allocated ${#blocks[@]}00 MB"
sleep 1
done
Жрём память пачками по 100 МБ. Сначала увидишь замедление (reclaim), потом — пиздец! Нас выкинет локальный OOM, но только внутри cgroup, а не всей системы.
Посмотреть статистику в реальном времени:
cat memory.current
cat memory.events
Ну и давай посмотрим IO (тормозим винт и превращаем его в флешку USB1.1). Цель — мы хотим, чтобы процесс читал с диска не быстрее 10 МБ/с:
Узнаем major:minor:
lsblk --output NAME,MAJ:MIN
Допустим, диск —
8:0 (типичное для /dev/sda).echo "8:0 rbps=10485760" > io.max
И запускаем:
#!/bin/bash
dd if=/dev/sda of=/dev/null bs=1M
Теперь твой винт начинает работать как древняя флешка, хотя железо у тебя современное.
Кстати это отличные способы заподлостроения либо как вариант подойдут для технических собеседований.
Например, говоришь кандидату — найди почему тормозит винт, либо — объясни почему скрипт жрет 50% процессора, а не 100%. Сразу вычислишь бродяг вайтишных, им даже ГПТ не поможет.
Короче такие вот приколы! Изучай!
—
Please open Telegram to view this post
VIEW IN TELEGRAM
26 93
Как создать эффективное REST API или оптимизировать его? Что сделать для ускорения Redis? Какие секреты скрываются под капотом Android? Что делать при конфликте стилей в микрофронтендах? Что поможет провести продуктивное кросс-ревью в команде?
Своим опытом в самых разных сферах делятся frontend-разработчики, системные аналитики, разработчики под Android и iOS из команды ПСБ.
Читайте в блоге ПСБ на Хабре, делитесь в комментариях своим мнением и опытом!
Своим опытом в самых разных сферах делятся frontend-разработчики, системные аналитики, разработчики под Android и iOS из команды ПСБ.
Читайте в блоге ПСБ на Хабре, делитесь в комментариях своим мнением и опытом!
Bash, Devops и Linux это конечно замечательно…
Хотел тебе сегодня про «Симулятор айтишника» рассказать, но по РФ законам такой контент оказывается запрещен. Облом.
Приведу лишь цитату из описания:
Если гуглить умеешь, сам найдешь всё необходимое. Дерзай. SIMS на максималках.
🛠 #linux #games #debug
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Хотел тебе сегодня про «Симулятор айтишника» рассказать, но по РФ законам такой контент оказывается запрещен. Облом.
Приведу лишь цитату из описания:
Добро пожаловать в третью часть лучшего симулятора. Наслаждайтесь незабываемыми ощущениями, воплощая в жизнь свои фантазии и получая при этом деньги на обустройство дома и своей жизни.
Если гуглить умеешь, сам найдешь всё необходимое. Дерзай. SIMS на максималках.
—
Please open Telegram to view this post
VIEW IN TELEGRAM
5 23
О бедном ТЗ замолвите слово
🔤 🔤 🔤 🔤 🔤 🔤 🔤
При любой задаче всегда необходимо составить ТЗ.
Если ТЗ составлено хорошо, то сразу определяются инструменты, которые будут необходимы для работы и сразу ограничивается область с которой будет проведена работа. Это значительно сокращает время на поиск решения.
ㅤ
Допустим вам нужно купить новый ноутбук.
Изначально у вас есть ограничение — бюджет.
Далее вы выделяете те характеристики которые вам необходимы.
При этом часть характеристик будут друг другу противопостовляться.
Если ТЗ было составлено правильно и выделены нужные параметры, то круг покупки сужается и выбрать ноутбук становится значительно легче.
При создании какого-то проекта, опять же чем детальнее и лучше ты опишешь что ты хочешь — тем легче тебе будет работать с проектом.
При проекте:
🔤 Все рисуем и документируем (чтобы было потом понятно куда и что ставить)
🔤 Схема сети (чем лучше проработана схема — тем проще потом будет создавать защиту на сетевом уровне)
🔤 Какие требования ты предъявляешь к проекту (ОТП, сертификаты, хранилище образов и конфигураций, dns, ntp, proxy для управления трафиком, где будет точки управления (mgmt segment) и как ты все это будешь защищать.)
🔤 Далее подбираются решения по каждому вопросу, описанному выше.
🔤 Проверяется во сколько обойдется данный проект (бюджетирование)
🔤 Описывается общая политика кому и что позволено в данном проекте.
🔤 На основе этих планов выискиваются узкие места, которые могут не справится с нагрузкой и продумывается возможность их масштабирования.
После подробного описания (в документации) можно начинать вообще что-то делать😲
Поэтому прежде чем задавать вопросы на форуме/чате сначала напишите:
🛠 #рабочиебудни #workflow
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Без внятного ТЗ — Результат ХЗ.
При любой задаче всегда необходимо составить ТЗ.
Если ТЗ составлено хорошо, то сразу определяются инструменты, которые будут необходимы для работы и сразу ограничивается область с которой будет проведена работа. Это значительно сокращает время на поиск решения.
ㅤ
Допустим вам нужно купить новый ноутбук.
Изначально у вас есть ограничение — бюджет.
Далее вы выделяете те характеристики которые вам необходимы.
При этом часть характеристик будут друг другу противопостовляться.
Ноутбук с 17 дюймовым экраном практически не может быть легче чем ноутбук с 12 дюймовым экраном.
Если ТЗ было составлено правильно и выделены нужные параметры, то круг покупки сужается и выбрать ноутбук становится значительно легче.
При создании какого-то проекта, опять же чем детальнее и лучше ты опишешь что ты хочешь — тем легче тебе будет работать с проектом.
При проекте:
После подробного описания (в документации) можно начинать вообще что-то делать
Поэтому прежде чем задавать вопросы на форуме/чате сначала напишите:
🤩 Что хотите получить.🤩 Приложите логи где ошибка.🤩 При сетевых вопросах — хотя бы схему от руки как минимум как вы хотите чтобы это работало.
—
Please open Telegram to view this post
VIEW IN TELEGRAM
2 32
Сегодня затронем довольно сложную тему bash: Использование групп в регулярных выражениях.
ㅤ
Обычно для регулярок используют
🔤 🔤 🔤 🔤 🔤 🔤 🔤
Приведу простой пример:
Первый
Второй
Разберем подробнее:
Обратите внимание — регулярку нельзя заключать в кавычки, иначе она превратиться втыкву строку.
Напомню:
Первая группа
Вторая группа
Третья и четвёртая группы
➡️ И теперь самое главное:
Если строка (в данном случае имя файла) соответствует
Все остальные группы помещаются в следующие элементы массива. Получаем что-то типа:
По итогу — с помощью одного
Ну, на всякий случай напомню, если вдруг решите дни или месяцы использовать в математических операциях — придется избавиться от ведущих нулей, поскольку числа, начинающиеся на «0» bash считает восьмеричными.
Для перфекционистов скажу, что данная регулярка не является строгой по отношению к датам, но в большинстве практических скриптов ее можно использовать.
Всем кода без багов.
🛠 #bash
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
ㅤ
Обычно для регулярок используют
grep. Он очень функциональный и быстрый, но иногда использование встроенных в bash регулярок может здорово упростить скрипты.Приведу простой пример:
#!/bin/bash
declare PREF="FILE"
#создаем 10 файлов с "плавающим" префиксом
for FILE in "202512"{01..10};do
touch ${PREF:$RANDOM%4}${FILE}".txt"
done
# Выбираем только файлы с префиксом из двух или трех символов и "даты"
for FILE in *;do
if [[ $FILE =~ (.{2,3})([0-9]{4})([0-9]{2})([0-9]{2}) ]];then
# echo $FILE
declare -p BASH_REMATCH
fi
done
Первый
for создает 10 тестовых файлов c «случайным» префиксом (1-4 последние буквы слова FILE).Второй
for — основной выбирает нужные нам файлы. А что именно нам нужно — задает регулярное выражение. Разберем подробнее:
(.{2,3})([0-9]{4})([0-9]{2})([0-9]{2})Обратите внимание — регулярку нельзя заключать в кавычки, иначе она превратиться в
Напомню:
. - заменяет любой символ, кроме перевода строки
{2,3} - определяет количество захватываемых символов
[0-9] - любой символ в диапазоне 0-9
() - захватываемая группа
Первая группа
(.{2,3}) — Захватывает от 2 до 3 любых символов {2,3} указывает минимальное и максимальное количество.Вторая группа
([0-9]{4}) — Захватывает ровно 4 цифры (0–9).Третья и четвёртая группы
([0-9]{2})([0-9]{2}): Каждая захватывает ровно 2 цифры.Если строка (в данном случае имя файла) соответствует
regexp - захваченный результат помещается в массив BASH_REMATCH с индексом 0Все остальные группы помещаются в следующие элементы массива. Получаем что-то типа:
declare -a BASH_REMATCH=([0]="LE20251204" [1]="LE" [2]="2025" [3]="12" [4]="04")
...
По итогу — с помощью одного
if мы получили: Префикс файла (1), год (2), месяц (3) и день (4).Ну, на всякий случай напомню, если вдруг решите дни или месяцы использовать в математических операциях — придется избавиться от ведущих нулей, поскольку числа, начинающиеся на «0» bash считает восьмеричными.
Для перфекционистов скажу, что данная регулярка не является строгой по отношению к датам, но в большинстве практических скриптов ее можно использовать.
Всем кода без багов.
—
Please open Telegram to view this post
VIEW IN TELEGRAM