#интересныйфакт
А вы знали, что линуксовая утилита sed как разделитель для регулярных выражений может использовать не только "/"?
До недавнего времени я лепил вот такие штуки:
а оказалось, что можно делать все гораздно проще, например:
Опять же, не будь умных людей вокруг, так и мучался бы с конструкциями
тредик на стаковерфлоу:
https://stackoverflow.com/questions/5864146/using-different-delimiters-in-sed-commands-and-range-addresses
Мораль: читайте man <команда>
А вы знали, что линуксовая утилита sed как разделитель для регулярных выражений может использовать не только "/"?
До недавнего времени я лепил вот такие штуки:
sed -i 's/\/path\/to\/smth\//\/another\/path\/to\/smth\//g' filenameа оказалось, что можно делать все гораздно проще, например:
sed -i 's^/path/to/smth/^/another/path/to/smth/^g' filename
Опять же, не будь умных людей вокруг, так и мучался бы с конструкциями
\/тредик на стаковерфлоу:
https://stackoverflow.com/questions/5864146/using-different-delimiters-in-sed-commands-and-range-addresses
Мораль: читайте man <команда>
👍2❤1
И в догонку еще #интересныйфакт
Вместо того, чтобы открывать питон и через пандас найти уникальные значения какого-то стобца, либо через встроенный yaml-парсер перебирать данные, можно сделать
И получить то же самое, только быстрее и проще. А потом можно хвастаться, какие вы хацкеры:)
Вместо того, чтобы открывать питон и через пандас найти уникальные значения какого-то стобца, либо через встроенный yaml-парсер перебирать данные, можно сделать
cat filename.tsv | cut -f<номер столбца> | sort [аргументы, в зависимости от сортировки] | uniqcat filename.yaml | grep <нужное поле> | awk -F": " '{print $2}' | sort | uniqИ получить то же самое, только быстрее и проще. А потом можно хвастаться, какие вы хацкеры:)
❤1
Junior DevOps/SR engineer
И в догонку еще #интересныйфакт Вместо того, чтобы открывать питон и через пандас найти уникальные значения какого-то стобца, либо через встроенный yaml-парсер перебирать данные, можно сделать cat filename.tsv | cut -f<номер столбца> | sort [аргументы, в…
#держувкурсе
На работе надо было обновить api-версии для TLS сертификатов в k8s у аддона cert-manager c
Прошелся по полученным репам, поменял версии, выкатил - профит
На работе надо было обновить api-версии для TLS сертификатов в k8s у аддона cert-manager c
certmanager.k8s.io/v1alpha1 на cert-manager.io/v1 и чтобы понять, в каких репозиториях хранятся эти серты, просто сделал:kubectl get -A certificates.certmanager.k8s.io -l heritage!=deckhouse -o yaml | grep "project.werf.io/git" | awk -F ': ' '{print $2}' | sort -n | uniqПрошелся по полученным репам, поменял версии, выкатил - профит
❤1
#оффтоп
Вчера мне один хороший человек сказал, что писать на древнешумерском - не круто. Поэтому сегодня приехала пояснительная бригада из 7 "Б" и будет разбираться со всем вчера написанным (заодно и сам разберусь, хых)
Вчера мне один хороший человек сказал, что писать на древнешумерском - не круто. Поэтому сегодня приехала пояснительная бригада из 7 "Б" и будет разбираться со всем вчера написанным (заодно и сам разберусь, хых)
❤1
Junior DevOps/SR engineer
Кстати, начал совсем с оркестратора, а классную статью про контейнеры не скинул:)))) https://faun.pub/the-missing-introduction-to-containerization-de1fbb73efc5 И ее перевод: https://habr.com/ru/post/541288/ Для хорошего понимания, советую почитать еще вот…
И так, первое, что надо понять из #держувкурсе - это контейнеры. Это, фактически, просто изолированный процесс (с помощью различных технологий ядра операционной системы).
Docker - это волшебная утилита, которая позволила стандартизировать описание и запуск контейнеров (докер не первый, и не последний - но сейчас это стандарт)
Kubernetes - это ещё более крутая штука, которая вышла из Google. Если коротко, то это набор абстракций для управления, мониторинга и запуска большого количества контейнеров.
Но очень советую почитать статейки из сообщения выше и почитать overview документации kubernetes - все должно встать на свои места :)
Займет не больше часа на все, но очень круто для саморазвития
Docker - это волшебная утилита, которая позволила стандартизировать описание и запуск контейнеров (докер не первый, и не последний - но сейчас это стандарт)
Kubernetes - это ещё более крутая штука, которая вышла из Google. Если коротко, то это набор абстракций для управления, мониторинга и запуска большого количества контейнеров.
Но очень советую почитать статейки из сообщения выше и почитать overview документации kubernetes - все должно встать на свои места :)
Займет не больше часа на все, но очень круто для саморазвития
❤1
Junior DevOps/SR engineer
Рубрика #держувкурсе или истории из жизни: Поставили задачу - развернуть jmeter в кубах. Для тех, кто не знает, что это за зверь: jmeter - это десктопная утилита для нагрузочного тестирования приложений (У нее, конечно, есть CLI, но его функционал ограничен…
Теперь про jmeter.
Как вы поняли, контейнер - это процесс. Причем в данном посте говорится о контейнере в кластере k8s. Так вот, этот кластер развернут на нескольких серверах, и, что логично, физического доступа к серверам нет (ну, кроме, возможно пары человек). Поэтому возникает вопрос - как запустить приложение с UI без монитора на рабочей машине (сервере) удаленно?
И тут на помощь приходит VNC (Virtual Network Computing) - система удаленного доступа к рабочему столу. Фактически, репозиторий из сообщения выше, позволяет развернуть VNC сервер прямо в контейнере (там не все так просто, но я в этом не разбираюсь. Если кто-то знает, буду рад ликбезу:))
И таким образом, можно подключаться через специальные утилиты напрямую к контейнеру удаленно и спокойно им управлять прямо в UI.
Но, конечно, без костылей и танцев с бубнами не обойдется:)
Как вы поняли, контейнер - это процесс. Причем в данном посте говорится о контейнере в кластере k8s. Так вот, этот кластер развернут на нескольких серверах, и, что логично, физического доступа к серверам нет (ну, кроме, возможно пары человек). Поэтому возникает вопрос - как запустить приложение с UI без монитора на рабочей машине (сервере) удаленно?
И тут на помощь приходит VNC (Virtual Network Computing) - система удаленного доступа к рабочему столу. Фактически, репозиторий из сообщения выше, позволяет развернуть VNC сервер прямо в контейнере (там не все так просто, но я в этом не разбираюсь. Если кто-то знает, буду рад ликбезу:))
И таким образом, можно подключаться через специальные утилиты напрямую к контейнеру удаленно и спокойно им управлять прямо в UI.
Но, конечно, без костылей и танцев с бубнами не обойдется:)
❤1
Junior DevOps/SR engineer
#держувкурсе На работе надо было обновить api-версии для TLS сертификатов в k8s у аддона cert-manager c certmanager.k8s.io/v1alpha1 на cert-manager.io/v1 и чтобы понять, в каких репозиториях хранятся эти серты, просто сделал: kubectl get -A certificates.…
Теперь про сертификаты.
Для того, чтобы безопасно общаться в сети (прикольная статья от Касперского) - нужно иметь что-то, что будет шифровать, аутентифицировать пользователей и проверять целостность доставленных и полученных данных.
Для этого и был придуман протокол TLS. Чтобы вы могли им пользоваться, нужно что-то, что будет подтверждать вашу "личность" и шифровать данные - это и делают сертификаты.
У kubernetes есть дополнение cert-manager - этот аддон позволяет автоматизировать процесс получения и подписания сертификатов в кластере.
Так как kubernetes рабоатет как REST-api, то у него в описании его абстракций (манифестах) есть поле
Для того, чтобы безопасно общаться в сети (прикольная статья от Касперского) - нужно иметь что-то, что будет шифровать, аутентифицировать пользователей и проверять целостность доставленных и полученных данных.
Для этого и был придуман протокол TLS. Чтобы вы могли им пользоваться, нужно что-то, что будет подтверждать вашу "личность" и шифровать данные - это и делают сертификаты.
У kubernetes есть дополнение cert-manager - этот аддон позволяет автоматизировать процесс получения и подписания сертификатов в кластере.
Так как kubernetes рабоатет как REST-api, то у него в описании его абстракций (манифестах) есть поле
apiVersion, которое говорит кластеру, в какую версию смотреть. Но бывает так, что одна версия устаревает и появляется новая. Об этом пересланный пост:)❤1
#оффтоп
Если у вас есть вопросы по древнешумерскому и не очень - пожалуйста, пишите, буду рад помочь вам разобраться и самому подтянуть знания:)
Если у вас есть вопросы по древнешумерскому и не очень - пожалуйста, пишите, буду рад помочь вам разобраться и самому подтянуть знания:)
❤1
#оффтоп
В общем, сюда уже несколько дней ничего не выкладывал. Есть, что рассказать, но со временем сложно:(((
Может, у кого-то из вас есть какие-то интересные штуки?)
В общем, сюда уже несколько дней ничего не выкладывал. Есть, что рассказать, но со временем сложно:(((
Может, у кого-то из вас есть какие-то интересные штуки?)
❤1
#оффтоп
Сегодня в маршрутке девчушка лет 4-х спросила маму: «А если всем попросить Лёшу не бросать канал на первой неделе после создания, он сможет это сделать?» С мамой плакала половина маршрутки… Леша, как так?!!
Сегодня в маршрутке девчушка лет 4-х спросила маму: «А если всем попросить Лёшу не бросать канал на первой неделе после создания, он сможет это сделать?» С мамой плакала половина маршрутки… Леша, как так?!!
👍2❤1
Благодаря очень хорошему человеку, у нас появился сервачок, на котором можно делать всякое.
В общем, необязательно иметь белый ipшник, чтобы ходить на удалённую машину по ssh (или любому другому протоколу).
Берём самый дешёвый хостинг, разворачиваем на нем самую дешёвую виртуальную машину, ставим openvpn (или wireguard).
Подключаем сервер в любой сети с доступом в интернет к этому впну, заворачиваем через iptables проброс порта на тачке с впном до вашего сервера и профит:) (ещё надо не забыть сконфигурить в впне роут до подключенного устройства)
ssh из любой точки мира до вашего сервера дома без платы за белый IP у провайдера.
Подробный мануал, может быть, напишу, а может и нет:)
В общем, необязательно иметь белый ipшник, чтобы ходить на удалённую машину по ssh (или любому другому протоколу).
Берём самый дешёвый хостинг, разворачиваем на нем самую дешёвую виртуальную машину, ставим openvpn (или wireguard).
Подключаем сервер в любой сети с доступом в интернет к этому впну, заворачиваем через iptables проброс порта на тачке с впном до вашего сервера и профит:) (ещё надо не забыть сконфигурить в впне роут до подключенного устройства)
ssh из любой точки мира до вашего сервера дома без платы за белый IP у провайдера.
Подробный мануал, может быть, напишу, а может и нет:)
❤1
Как какать, когда ты тормоз.
Значится, как все было.
Развернули с одним очень хорошим человеком на новом сервере гитлаб в докере (по инструкции с офф сайта: https://docs.gitlab.com/ee/install/docker.html). Настроили бэкапы (в будущем планировали переехать из обычного докера в кубы), но не особо придали значения, что у гитлаба кучу разных вариантов бэкапов. Прожили так пару недель.
Затем зачесалось кое у кого кое-где (у вашего покорного слуги), снесли к чертовой бабушке докер и накатили кубик (не простой, а золотой https://deckhouse.io/en/). Конечно, и бэкапы, и маунты от гитлаба оставили.
Начали жить по-новому и все было хорошо, до момента осознания, что бэкапы были сделаны "неправильно" и их не получится без танцев с бубнами перенести в новый гитлаб (который теперь в кластере k8s). Поняв, что даже бубен племени майя и жертвоприношения не особо помогут с восстановлением бэкапа в новый инстанс гитлаба, решил запустить гитлаб у себя на ноуте (почему на ноуте - потому что куб работает на containerd и deckhouse (который не простой куб, а золотой) не любит containerd и docker на одной машине) и перенести все репы вручную.
Перенес на ноут маунты старого докерного гитлаба, начал запускать и столкнулся с ошибкой доступов. Провозившись часа полтора, нашел наконец решение: https://stackoverflow.com/a/48037595. Оказалось, что проблема во внутреннем устройстве файловой системы OSX и что нужно было запускать все из домашней директории, а не из /tmp, как хотел изначально.
В общем, потратив всего часа 3-4 на все эти манипуляции, получилось поднять локально гитлаб и достать старые репы. Дальше все пошло легче.
Первым делом, сделал себе acess token для доступа к api гитлаба (https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html)
Затем, вытащил все проекты, которые уже были в нем, и сохранил в файл их repo_url для клонирования (стоит упомянуть, что все требуемые к восстановлению репы были в одной группе (папке)):
Поменял url remote, чтобы можно было клонить локально (фикс от остатков конфигов от работающего гитлаба в докере) и нехитрыми манипуляциями склонировал все:
затем, поменял git remote url, так как он был направлен на 127.0.0.1, а нужно было на новый домен удаленного гитлаба:
создал группу(папку) в новом инстансе с тем же названием, что и в прошлом гитлабе.
Также сделал себе acess token в новом гитлабе и создал пустые проекты для всех, которые хотел пушнуть:
и затем пушнул все нехитрыми манипуляциями.
Профит, потрачено 5-6 часов на все, вместе с развертыванием гитлаба в кубы, но зато все восстановлено без потерь:)
Значится, как все было.
Развернули с одним очень хорошим человеком на новом сервере гитлаб в докере (по инструкции с офф сайта: https://docs.gitlab.com/ee/install/docker.html). Настроили бэкапы (в будущем планировали переехать из обычного докера в кубы), но не особо придали значения, что у гитлаба кучу разных вариантов бэкапов. Прожили так пару недель.
Затем зачесалось кое у кого кое-где (у вашего покорного слуги), снесли к чертовой бабушке докер и накатили кубик (не простой, а золотой https://deckhouse.io/en/). Конечно, и бэкапы, и маунты от гитлаба оставили.
Начали жить по-новому и все было хорошо, до момента осознания, что бэкапы были сделаны "неправильно" и их не получится без танцев с бубнами перенести в новый гитлаб (который теперь в кластере k8s). Поняв, что даже бубен племени майя и жертвоприношения не особо помогут с восстановлением бэкапа в новый инстанс гитлаба, решил запустить гитлаб у себя на ноуте (почему на ноуте - потому что куб работает на containerd и deckhouse (который не простой куб, а золотой) не любит containerd и docker на одной машине) и перенести все репы вручную.
Перенес на ноут маунты старого докерного гитлаба, начал запускать и столкнулся с ошибкой доступов. Провозившись часа полтора, нашел наконец решение: https://stackoverflow.com/a/48037595. Оказалось, что проблема во внутреннем устройстве файловой системы OSX и что нужно было запускать все из домашней директории, а не из /tmp, как хотел изначально.
В общем, потратив всего часа 3-4 на все эти манипуляции, получилось поднять локально гитлаб и достать старые репы. Дальше все пошло легче.
Первым делом, сделал себе acess token для доступа к api гитлаба (https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html)
Затем, вытащил все проекты, которые уже были в нем, и сохранил в файл их repo_url для клонирования (стоит упомянуть, что все требуемые к восстановлению репы были в одной группе (папке)):
curl -sSf -H "PRIVATE-TOKEN: $GITLAB_API_TOKEN" "http://127.0.0.1/api/v4/projects?per_page=1000" | jq -r '.[].http_url_to_repo )' | tee repos.txtПоменял url remote, чтобы можно было клонить локально (фикс от остатков конфигов от работающего гитлаба в докере) и нехитрыми манипуляциями склонировал все:
cat repos.txt | sed 's/gitlab.alexmakh.ru/127.0.0.1:20080/g' | xargs -I{} git clone {}затем, поменял git remote url, так как он был направлен на 127.0.0.1, а нужно было на новый домен удаленного гитлаба:
CURR_DIR=$(pwd)
for path in $(ls -d */); do cd $CURR_DIR/$path; git remote set-url origin $(git remote get-url origin | sed 's/127.0.0.1:20080/gitlab.alexmakh.ru/g'); done
создал группу(папку) в новом инстансе с тем же названием, что и в прошлом гитлабе.
Также сделал себе acess token в новом гитлабе и создал пустые проекты для всех, которые хотел пушнуть:
ls -d */ | tr -d '/' | xargs -I{} curl -H "PRIVATE-TOKEN: $GITLAB_API_TOKEN" --request POST -H "Content-Type: application/json" --data '{
"name": "{}", "description": "", "path": "{}",
"namespace_id": "8", "initialize_with_readme": "false"}' \
--url "https://gitlab.alexmakh.ru/api/v4/projects"и затем пушнул все нехитрыми манипуляциями.
CURR_DIR=$(pwd)
for path in $(ls -d */); do cd $CURR_DIR/$path; git push; done
Профит, потрачено 5-6 часов на все, вместе с развертыванием гитлаба в кубы, но зато все восстановлено без потерь:)
❤1👍1
И по просьбам трудящихся,
Wireguard vpn, локальная сеть и проброс портов для доступа из вне:
Оказывается, хороший человек, который все это делал - просто воспользовался мауналом (в этом ничего плохого нет, зачем пилить велосипеды?):
https://noostyche.ru/blog/2022/03/29/ispolzovanie-wireguard-klientami-s-serymi-ip/
Вводные: локальная сеть комнаты общежития, VPS на самом дешевом хостинге и туториал выше. Для проброса портов использовался скрипт с iptables таблицей nat (https://ru.wikipedia.org/wiki/NAT)
Сам скрипт добавления проброса порта:
где SRV_PORT - нужный порт для проброса (первый аргумент при вызове баш скрипта)
Также, для персистентности правил на впн сервере (так как они сбросятся после перезагрузки), стоит после отрабатывания скрипта сделать:
а после перезагрузки VPSки:
или сделать маленькый скрипт:
И засунуть его в крончик:
Wireguard vpn, локальная сеть и проброс портов для доступа из вне:
Оказывается, хороший человек, который все это делал - просто воспользовался мауналом (в этом ничего плохого нет, зачем пилить велосипеды?):
https://noostyche.ru/blog/2022/03/29/ispolzovanie-wireguard-klientami-s-serymi-ip/
Вводные: локальная сеть комнаты общежития, VPS на самом дешевом хостинге и туториал выше. Для проброса портов использовался скрипт с iptables таблицей nat (https://ru.wikipedia.org/wiki/NAT)
Сам скрипт добавления проброса порта:
#!/bin/bash
EXT_IP="белый IP вашей VPSки"
INT_IP="Внутренний адрес VPSки в сети ВПН"
EXT_IF=ens3 (интерфейс VPSки, на который приходит внешний трафик)
INT_IF=wg_ihor (интерфейс VPN)
LAN_IP="Адрес сервера внутри сети VPN, на который нужно отправлять трафик"
SRV_PORT=$1
iptables -t nat -A PREROUTING --dst $EXT_IP -p tcp --dport $SRV_PORT -j DNAT --to-destination $LAN_IP
iptables -t nat -A POSTROUTING --dst $LAN_IP -p tcp --dport $SRV_PORT -j SNAT --to-source $INT_IP
iptables -t nat -A OUTPUT --dst $EXT_IP -p tcp --dport $SRV_PORT -j DNAT --to-destination $LAN_IP
iptables -I FORWARD 1 -i $EXT_IF -o $INT_IF -d $LAN_IP -p tcp -m tcp --dport $SRV_PORT -j ACCEPT
где SRV_PORT - нужный порт для проброса (первый аргумент при вызове баш скрипта)
Также, для персистентности правил на впн сервере (так как они сбросятся после перезагрузки), стоит после отрабатывания скрипта сделать:
netfilter-persistent saveа после перезагрузки VPSки:
netfilter-persistent startили сделать маленькый скрипт:
#!/bin/sh
netfilter-persistent start
И засунуть его в крончик:
@reboot /path/to/script/netfilter-persist-start.sh#держувкурсе
Гошная библиотека для регулярных выражений не поддерживает опережающие и ретроспективные проверки (https://habr.com/ru/post/159483/), и вот почему: https://groups.google.com/g/golang-nuts/c/7qgSDWPIh_E/m/aKBGgoj8AAAJ
Если коротко: "тупые" кодеры не хотят их включать, так как не могут тогда гарантировать скорость O(n) при сопоставлении паттерна
Гошная библиотека для регулярных выражений не поддерживает опережающие и ретроспективные проверки (https://habr.com/ru/post/159483/), и вот почему: https://groups.google.com/g/golang-nuts/c/7qgSDWPIh_E/m/aKBGgoj8AAAJ
Если коротко: "тупые" кодеры не хотят их включать, так как не могут тогда гарантировать скорость O(n) при сопоставлении паттерна
❤1
Забыл похвастаться, у меня тут недавно вышла статейка на хабре про эти ваши кубернетисы и генту (древний дистрибутив линукса):
https://habr.com/ru/company/flant/blog/685616/
https://habr.com/ru/company/flant/blog/685616/
Хабр
Немного хардкора: как поднять Kubernetes на двух старых ноутбуках с Gentoo
Хочу рассказать об интересном эксперименте, суть которого заключалась в развертывании и настройке Kubernetes на двух старых ноутбуках — один из них, кроме того, был с процессором на архитектуре i386....
❤1
красивое и понятное о кубике:)
https://habr.com/ru/company/lanit/blog/688734/
https://habr.com/ru/company/lanit/blog/688734/
Хабр
«Папа, а кем ты работаешь?» Рассказываем про Kubernetes простым языком
Этот комикс – видение DevOps-команды «Онланты» Иллюстрированного детского путеводителя по Kubernetes от Cloud Native. На примере маленького приложения Фиппи разбираемся, что такое Kubernetes и в чем...
❤2
#оффтоп
Решили значит с корешом обновить бубунту с 20 до 22 на своем домашнем “серваке“.
Сделали все по правильному, обновили пакетики, сделали do-release-upgrade, система в ребут ушла и больше не поднялась.
Но суть не в этом, суть в том, как проиводился дебаг - была подключена видеокарта к серваку, видеокарта к конвертеру VGA на HDMI, далее по HDMI к карте видео захвата (монитора отдельного нет), а она к ноуту. Там был запущен OBS. После запуска, OBS решил, что он камера и вставил картинку с карты видео захвата (то есть, с сервера) прям в мит.
В итоге, дебаг производился под общажным хуевым интернетом через картинку с гугл мита на телефоне (так как на ноуте картинка была отзеркалена🤡) и клаву, подключенную к серверу. Картинка сетапа, конечно, прилагается
Решили значит с корешом обновить бубунту с 20 до 22 на своем домашнем “серваке“.
Сделали все по правильному, обновили пакетики, сделали do-release-upgrade, система в ребут ушла и больше не поднялась.
Но суть не в этом, суть в том, как проиводился дебаг - была подключена видеокарта к серваку, видеокарта к конвертеру VGA на HDMI, далее по HDMI к карте видео захвата (монитора отдельного нет), а она к ноуту. Там был запущен OBS. После запуска, OBS решил, что он камера и вставил картинку с карты видео захвата (то есть, с сервера) прям в мит.
В итоге, дебаг производился под общажным хуевым интернетом через картинку с гугл мита на телефоне (так как на ноуте картинка была отзеркалена🤡) и клаву, подключенную к серверу. Картинка сетапа, конечно, прилагается
👍3🔥3❤2😁1🤡1