суббота, 25 февраля 2017 г.

Удаленная переустановка Linux по ssh

Наткнулся тут на очень интересную статью на хабре.

Вот эту: https://habrahabr.ru/post/321696/.

Автор молодец, серьезно, не rocket science, но всё методично и последовательно логично изложено.

Но я таки заметил одну мелкую проблему не затронутую в статье.
Конечно не потому что я такой проницательный, в просто потому что уже въезжал в такие грабли однажды.

Итак, задача была такая, удаленный сервер без доступа, каким то затейник установлен так что нет там lvm, и это становится проблемой, потому как нужны снапшоты для бекапа бд.

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

Ну я вот вспомнив этот опыт, поднял чистый дебиан в вагранте, и решил прогнать сценарий автора.

Там всё идёт отлично до момента, когда нужно создавать lvm разделы.

Т.е. выполняем:


mkdir /target
mount none -t tmpfs -o size=1G /target/
apt-get -y install debootstrap
debootstrap jessie /target/ http://mirror.mephi.ru/debian/
echo "Killer_system" > /target/etc/debian_chroot
 
chroot /target
mount none -t proc /proc/
mount none -t sysfs /sys/
mount none -t devtmpfs /dev/
mount none -t devpts /dev/pts/

apt-get -y install lvm2 debootstrap
apt-get -y install openssh-server openssh-client openssh-blacklist openssh-blacklist-extra --no-install-recommends
sed -i 's/^Port .*$/Port 11122/' /etc/ssh/sshd_config
sed -i 's/^PermitRootLogin .*$/PermitRootLogin yes/' /etc/ssh/sshd_config
/etc/init.d/ssh restart
 
 
 ssh ... -l root -p 11122
 
 dd if=/dev/zero of=/dev/sda bs=1M count=100
 echo 1 > /sys/block/sda/device/delete
 for i in /sys/class/scsi_host/host?/scan ; do echo "- - -" > $i ; done
 
 fdisk /dev/sdb
n<CR> <CR> <CR> <CR>
t<RC> 8e<CR>
w<CR>
 
pvcreate /dev/sdb1
vgcreate vg_root /dev/sdb1
lvcreate -Zn -L500M -n lv_swap0 vg_root

И внезапно въезжаем вот в это:
 Когда исправить уже ничего нельзя.

А всего лишь забыли что lvm2 то на хост системе не было, и модуль не загружен.
Надо было этим на живой ещё хост системе озаботиться поставить lvm2.

Ещё мне кажется автор забыл инструкцию  
vgscan --mknodes
после создания lvm томов

Во всяком случае в моём прогоне на vagrant который я сегодня делал файлы устройств без неё не создавались.
Т.е. полный листинг должен быть такой:


lvcreate -Zn -L500M -n lv_swap0 vg_root
lvcreate -Zn -L1G -n lv_root vg_root
lvcreate -Zn -L2G -n lv_usr vg_root
lvcreate -Zn -L2G -n lv_var vg_root
lvcreate -Zn -L1G -n lv_var_log vg_root
lvcreate -Zn -L1G -n lv_home vg_root
 
vgscan --mknodes 
 
mkswap /dev/vg_root/lv_swap0
mkfs.ext4 /dev/mapper/vg_root-lv_root
mkfs.ext4 /dev/mapper/vg_root-lv_usr
mkfs.ext4 /dev/mapper/vg_root-lv_var
mkfs.ext4 /dev/mapper/vg_root-lv_var_log
mkfs.ext4 /dev/mapper/vg_root-lv_home

mkdir /target
mount /dev/mapper/vg_root-lv_root /target/
mkdir /target/usr /target/var /target/home
mount /dev/mapper/vg_root-lv_usr /target/usr
mount /dev/mapper/vg_root-lv_var /target/var
mkdir /target/var/log
mount /dev/mapper/vg_root-lv_var_log /target/var/log
mount /dev/mapper/vg_root-lv_home /target/home


Всё остальное в статье отлично, после ребута видим свеженькую систему с lvm

Ну а главная то мораль, прогоняйте всё на виртуалках и не один раз, не верьте статьям в интернетах.
А то будете как я, ночами искать способ добраться до испорченного сервера.

пятница, 10 февраля 2017 г.

Golang и воздух свободы

Спустя пяток проектов на golang, и учитывая тот факт что я теперь на нём пишу практически ежедневно, уже можно уверенно сказать что инструмент достойный.

Заходило сложновато, это да. Но зато прямо перелом сознания произошёл.

Я вдруг на кончиках пальцев понял что не в сложным абстракциях счастье.

Что не сделает теория категорий и монады тебя более счастливым котиком чем старый добрый си на современный лад.

Внезапно полюбил простоту и статическую компиляцию.

Сама возможность закинуть бинарник, при необходимости завернув в докер, которая избавляет от необходимости думать про все эти чёртовы пакетные менеджеры, зависимость. адъ , боль и израиль просто шикарна.

Как человек измученный cpan, pip и прочим, как страдающих от огромного зоопарка оборудования, я полюбил это всем сердцем.
И это правда развязывает тебе руки не только как девопсу, но и как програмисту.
Чего толку беспокоится о том что ты притащил внешнюю зависимость если в этом больше нет боли. Прямо совсем нет.
Раньше я из за каждой зависимости мучительно страдал, смогу ли я обеспечить её на всех хостах, как это на что повлияет, дак ведь ещё и не угадаешь порой. Всё в прошлом. Алилуйя.

Все эти страдания по дебагерам, дженерикам и прочему попросту мернут на фоне этого.

Действительно дебажить принтами вполне себе можно.

То что язык прост, тоже плюс, да, меньше думаешь о do-нотации монад, зато берешь любой код, и сразу ясно что там.

go-vim прекрасен, почти полностью, линтеры, форматеры, и всякое разное присутствует.  Реюзабельность кода прекрасная, я ещё не дорос до генерации кода, прямо промышленной, но уже понимаю почему оно не так уж и плохо.

Каналы, горутины - просто прекрасно, даже хвалить не буду, надо просто брать и юзать их.

Компиляция, то что годами казалось мне не нужным, как же дескать файлик то поправить на сервере, вдруг раскрылась новыми красками как раз из за того что она
- быстрая
- безжалостная.
Да тебе не дадут лишний импорт и неиспользуемую переменную оставить, но сколько это вскрыло моих ошибок, у меня прямо как крылья появились. Начинаешь натурально верить в "более-лучший" код и меньше беспокоиться об этом.

Всё это вместе правда даёт мне ощущение полёта. Как по утюгу с каждой ноги сбросил.

И конечно это сказывается на производительности и общей довольности, аж волосы опять стали расти.

Жаль я не заметил его пару лет назад, стоило.


среда, 8 февраля 2017 г.

Приватный registry для docker с let's encrypt и http basic auth

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

Супер секретные, все дела.

Короткая шпаргалка.

1. Получаем сертификат от let's encrypt.

На этой неделе мой любимый способ это getssl на баше (https://github.com/srvrco/getssl).

Два чая это господину, а то его конкуренты пытаются 50 модулей питона использовать для этой задачи.

./getssl -c domain.com
Правим конфиг по подсказкам и
./getssl domain.com
В крон ставим
getssl -a -q -u 
раз в пару недель.

2. Качаем образ registry:2
 docker pull registry:2
3. Создаем пароли для наших юзеров

mkdir auth
docker run --entrypoint htpasswd registry:2 -Bbn testuser testpassword > auth/htpasswd
4. Запускаем всё вместе

docker run -d -p 5000:5000 --restart=always --name registry \
  -v `pwd`/auth:/auth \
  -e "REGISTRY_AUTH=htpasswd" \
  -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
  -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
  -v /path/.getssl/domain.com:/certs \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.com.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.com.key \
registry:2
5. Пробуем с клиентской машины
docker login domain.com
и оно не работает у меня потому как мне в дебиан не завезли ещё корневой сертификат от let's encrypt.
Чинится это просто
scp domain.com:.getssl/domain.com/chain.crt ./
sudo  mv chain.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
6. Тегируем образ
docker tag oldtag domain.com:5000/newtag
7. Заливаем
docker push domain.com:5000/newtag

Так как у меня образы все для хранения не предназначены а только для распространения, и я их из могу на build машине все пересоздать, я не волнуюсь о хранении образов в s3 или ещё где.
Но если вас это волнует. то обратите внимание что в этой инструкции о сохранности данных не побеспокоились.

воскресенье, 5 февраля 2017 г.

Чудеса на виражах, в этот раз lvm snapshot

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

Ну, с матерком и болью добрались, подцепили монитор, выпадает в rescue потому что не может подцепить одну точку монтирования вдруг.

Идиотизм конечно: ни рутовую, ни какую либо важную для сервисов, тем не менее загрузка невозможна.

Ну ладно начинаем разбираться а чего вдруг примонтировать то не может, и оказывается интересная штука.

Там lvm группа, конечно же, и один из snapshot оказался переполненным и как следствие inactive.

И это ломает каким то образом множество томов при загрузке, переводя их в inactive
и в том числе тот злополучный раздел.
Что особенно изумляет, что переполненный снапшот и тот раздел никак не связаны. Они на разных pv, не являются снимками друг друга, но тем не менее переполненность одного переводит другой в inactive.

Ну вот как это назвать приличным словом?

Будем сейчас специальным скриптом ansible перезагружать, который будет снапшоты проверять видимо.