Админим с Буквой
5.52K subscribers
303 photos
8 videos
59 files
1.16K links
Канал о системном администрировании, DevOps и немного Инфобеза.

По всем вопросам обращаться к @bykva. Рекламу не размещаю.
Download Telegram
Именование VM в облаках это важно

Очень глупая история произошла со мной на днях. Есть система автоматизации выкатки новых образов(images) в облака, в частности это azure. Для того чтобы задачи сборки не конфликтовали друг с другом, если запущены они в одно время, я добавил в имя виртуальной машины build_id, т.е. номер сборки. Через точку. Azure из имени VM составляет hostname. As is. В итоге получилось имя вида test-instance.123 - что в свою очередь очень напоминает нам домен второго уровня (company.com). Как оказалось на такое имя не весь софт реагирует адекватно и по понятным причинам такое имя не резолвится. В частности это не перенес collectd, что привело к невозможности его запуска. Замена точки на дефис решила эту глупую и простую проблему.

#troubleshooting
Что это за странные буквы sda\hda и что они значат

Каждому линуксойду, который знаком с системой больше пары недель знакомо что такое sda - это первый диск, sdb - второй итд. Обычно мало кому есть дело, почему он так называется. ну sda, ну hda. Оказывается, название предельно логично и строго зависит от оборудования которое вы используете.

Так например sda:
S - SCSI driver, modern PATA/SATA driver, USB
SD - mass-storage driver
SDA - first registered device
SDA1 - first partition


Подробнее: https://en.wikipedia.org/wiki/Device_file#Naming_conventions

#junior
Или лыжи не едут, или я ебанутый

Последний месяц я мало что писал интренесного, потому что практически все время занимался автоматизацией выкатки софта на azure. Это адище адовое если честно. Одна из самых дурных поделок микрософта. Кроме кучи мелких абсолютно непонятных и недокументированных вещей до которых додумываться надо, я выделю две, которые меня особенно потрясли:

- у меня есть 2 аккаунта: name_surname@company.com и name_surname@company.com. Не пытайтесь найти разницу - они абсолютно одинаковые. Только один из них получился личный, а второй - корпоративный. Идентификаторы у них разные, а то что логины совпадают, ну, кому какое дело. Из-за этого так получилось, что на portal у меня права на корпоративном аккаунте, а на cloudpartner - на личном. Т.е. представьте себе ситуацию, да, когда владелец корпоративного аккаунта говорит что дал тебе права, а ты заходишь туда и видишь что прав то и нет. Знаете как переключиться между личным и корпоративным? Разлогиниться, да. Но, это еще не все. Услуждивый микрософт предложит вам список учетных записей, под которыми вы заходили. там будет и name_surname@company.com. пробуем-вводим пароль - попадаем в учетку. прав нет. Что-то сделали не так. Знаете как надо? Надо разлогиниться, сказать other(типа я введу новый аккаунт), ввести name_surname@company.com и только тогда он предложит выбрать, личная это или, мать ее, корпоративная учетная запись!

- вы создаете из приватного образа виртуальную машину. вас при этом спросят логин и пароль\публичный ключ. Зачем? ну логично же - под этими учетными данными мы зайдем на вновь созданную виртуальную машину. Правильно? Нихрена. Эти учетные данные пропишутся ровным счетом никуда. не будет никуда положен ключ, не будет такого пользователя в /etc/passwd

#гори_в_аду_микрософт
Bash shortcuts

Написал микро лабораторную работу для обучения хоткеям в bash. Все это доступно благодняря библиотеке readline. Все описанное ниже и более того - man readline

https://medium.com/@bykvaadm/bash-shortcuts-d6f275a6ce9d

#bash_tips_and_tricks #junior
Jenkins kill zombie job

Если ни тыкание на крестик, ни перезагрузка сервера не помогают дропнуть зависшую день-два-месяц назад задачу, то можно дропнуть ее через консоль (Manage Jenkins -> Script Console). И вам надо заполнить 2 переменные - имя задачи и ее номер.

Jenkins.instance.getItemByFullName("JOB_NAME")
.getBuildByNumber(JOB_ID)
.finish(
hudson.model.Result.ABORTED,
new java.io.IOException("Aborting build")
);

#jenkins #troubleshooting
Убитый контейнер докера не запускается

Ошибка:
endpoint with name XXXX already exists in network bridge.
Решение:
docker network disconnect --force bridge <Container ID or Endpoint ID or Container NAME>

Это не для тех, кто не умеет гуглить, а для того чтобы наоборот каждый раз не гуглить когда такое возникает=)

#docker #troubleshooting #networking
Запускаем задачу в background в докер контейнере через ansible

Особо ничего сложного, nohup да &, однако процесс все равно не отпускает консоль, посему ansible зависает. Чтобы этого не происходило, можно применить такую конструкцию:

- name: run bg job
shell: docker exec -i <container> sh -c 'nohup CMD &'
async: 45
poll: 0

#docker #ansible
ну да, я занимаюсь правками текста прямо в канале ¯\_(ツ)_/¯
RBAC on docker registry

Поигрался тут на днях с одним сервисом который позволяет использвать token-based аутентификацию пользователя с docker registry. Стандартный вариант логин-пароль уже не удовлетворяет потребностям и пришлось искать что-то другое. В итоге набрел на готовое решение от cesanta/docker_auth. Написано на go, легковестный token-сервис с поддержкой различных способов аутентификации пользователей и также, что самое главное - это ACL. С помощью acl можно задавать кто, и какие репозитории может пушить и пуллить, с точностью до регулярного выражения. В качестве базы хранения пользователей-acl можно выбрать статический файл, mongodb, ldap и некоторые другие. В том числе можно использовать и сторонний софт, хоть самопис. токен будет выдаваться в зависимости от кода ответа этого софта. И тут уже можно сделать все что угодно - хоть выдавать токены в зависимости от времени суток. Поковырявшись в этом собрал готовое решение, запускаемое через docker-compose. Оно содержит набор из 3 контейнеров: docker_auth, docker registry и mongo. После старта docker-compose все что нужно сделать - загрузить список правил и пользователей в mongo через простейший shell-скрипт.

https://github.com/bykvaadm/docker_auth

#docker #auth
progit_v2.1.3.epub
5.7 MB
Книга про гит на русском. Это для тех людей, кто вдруг ее еще не видел. Или вдруг еще даже не пользовался никогда гитом. Самое время начать!

#git
Выпуск Debian 9.5

Доступно пятое корректирующее обновление дистрибутива Debian 9, в которое включены накопившиеся обновления пакетов и устранены недоработки в инсталляторе. Выпуск включает 91 обновление с устранением проблем со стабильностью и 100 обновлений с устранением уязвимостей.
Kubernetes restart all pods

kubectl -n NS get po --show-labels
## pickup necessary labels
kubectl -n NS delete po -l app=xxxx


#kubernetes
Лулз

#include <stdlib.h>
#include <stdio.h>
#include <cerr.h>
#include <bash.h>

#define INFINITE ~0u

int main(int argc, char *argv[]) {
printf("Hello world!\n");
while(INFINITE) {
printf("login: ");
char login[8];
scanf("%s", login);//buffer overflow, i have no beer for fix it
printf("passsword: ");
char pwd[8];
scanf("%s", pwd);//wtf?! beer! beer! beer!
if(0.25 > rand() / (float)RAND_MAX) {
startBash(login);
} else {
printf("Login is incorrect!\n");
}
if(0.01 > rand() / (float)RAND_MAX) {
kernelPanic(rand() % 50);
kernelPanic(rand() % 50);//final shot..DIE! or beer..
}
}
return 0;
}


источник: http://absurdopedia.wikia.com/wiki/Linux#.D0.A4.D0.B0.D0.B1.D1.80.D0.B8.D0.BA.D0.B0_.D0.BF.D0.B8.D0.BD.D0.B3.D0.B2.D0.B8.D0.BD.D0.BE.D0.B2?li_source=LI&li_medium=wikia-footer-wiki-rec
Cleanup docker registry

Проверено для версии 2.6.2

1. добавить в конфиг registry эти строки и перезапустить:

storage:
delete:
enabled: true


2. получаем список тегов для репозитория и выбираем список на удаление

curl -u <user>:<password> https://<registry_host>/v2/<repo_name>/tags/list


3. помечаем объекты на удаление через api

repo="REPO_PATH"
tag_list='TAG LIST separated by space'
user="USER"
pwd="PASSWORD"
registry_host="<registry_host>"
header="Accept: application/vnd.docker.distribution.manifest.v2+json"

for tag in ${tag_list}; do
digest=$(curl -I -u $user:$pwd -H "$header" "https://${registry_host}/v2/${repo}/manifests/${tag}" 2>/dev/null| awk '$1 == "docker-content-digest:" {print $2}'| tr -dc '[[:print:]]')
curl -XDELETE -u $user:$pwd -H "$header" "https://${registry_host}/v2/${repo}/manifests/${digest}"
done


4. заходим внутрь контейнера и запускаем garbage-collector.

registry garbage-collect /etc/docker/registry/config.yml


Итого наша задача - получить список тегов, выбрать нужные на удаление. На каждый тег получить sha256 манифеста (docker-content-digest в заголовке ответа), а затем пометить этот заголовок на удаление. К концу 3-го пункта никакие данные еще не удалены. Удаление происходит не вручную, а с помощью нативного сборщика мусора. согласно помеченным манифестам будут удалены выбранные теги.

#docker #registry
Curl resolve w\o dns

Иногда нужно протестировать какой-то домен здесь и сейчас (особенно когда он работает через прокси и\или https), лезть при этом делать dns неохото, прописывать в hosts - тоже долго, поскольку это можно сделать не отходя далеко от курла:

curl --resolve foo.example.com:443:127.0.0.1 https://foo.example.com:443/

#curl
.bashrc vs .bash_profile

разница между ними в том что .bash_profile исполняется при прямом логине в shell, тогда как .bashrc выполняется для non-login shells. Таким образом если вы например хотите настроить алиасы для работы в консоли на удаленном сервере - ваш файл bash_profile, если это будет отличный от прямого входа в shell - тогда настраиваем bashrc.

But, if you’ve already logged into your machine and open a new terminal window (xterm) then .bashrc is executed before the window command prompt. .bashrc is also run when you start a new bash instance by typing /bin/bash in a terminal.

#bash_tips_and_tricks
Смотрим какое правило маршрутизации применится к ip адресу

ip r g x.x.x.x