Найти тему
Вадим Зырянов

Делаем тестовое задание на позицию DevOps Junior или путь становления как специалиста (часть-1)

Всех приветствую, кто заглянул сюда. Суть вообще в чем заключается... Я решил, а точнее мой коллега посоветовал, вести блог по DevOps'у.

Зовут меня Вадим, а сам я из маленького города Киров, скорей всего слышали про вятский квас, который рекламировал Тимати, а если не слышали, то вообще не важно) Забейте в гугл картах Киров - кировская область, если стало интересно)

На данный момент начну с того, какими знаниями я уже обладаю для входа:

  • Linux - в принципе сидеть с документацией и делать вещи не составляет труда, уходит много времени, но дело практики. Основную базу вроде как знаю.
  • Jenkins - повозился пару дней с ним и понял принцип - остальное дело практики
  • Ansible - та же история, как и с Jenkins
  • Docker - абсолютно не знакомился с данной технологией до начала тестового, по ходу статьи буду решать задачи и расписывать опыт

Что такое Docker, Jenkins и Ansible?

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

Docker - виртуальная среда/машина, предназначенная для быстрого развертывания и доставки приложения/сервера. Если вы имели дело с VirtualBox, то это практически тоже самое, только все настолько вырезано, что остается только самое базовое для работы. Зачем это нужно? Представьте ситуацию, что вам нужно скачать проект с репозитория github и там тонна информации, как развернуть приложение, куда что скопировать, как подрубить сервер, как настроить конфиги. Естественно не больно терпеливому обывателю после 1-2 ошибок вообще больше не захочется возиться с этим, а такое сплошь и рядом. В большинстве мелких контор никто не будет ставить docker и все оптимизировать, поэтому новые разработчики, приходя в такую контору, только неделю будут возиться с документацией и пытаться развернуть проект. Докер один раз сконфигурировал под приложение и можешь хоть на всех 65535 портах открыть его, и все 65535 серверов будут работать. Круто? Думаю да :)

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

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

А вот и тестовое задание, которое будем делать:

Репозиторий — проект на Django, который предоставляет API
Напишите для него Dockerfile, который можно будет запускать на продакшене(" - на главном сервере, еще именуют как master"). В качестве сервера приложений используйте UWSGI, в качестве базы данных — Postgres, который будет лежать в отдельном контейнере. Затем настройте CI в любом удобном сервисе.

Давайте начинать!

Я подготовил для этого Virtualbox и на нем создал сервер на базе
Debian 11. Про установку системы я не буду рассказывать, т.к. этого и так много в интернете.

Вот настройки VirtualBox

главное окно VirtualBox
главное окно VirtualBox
Тип подключения Адаптера должен быть СЕТЕВОЙ МОСТ, чтобы можно было играться с ней по локальной сети
Тип подключения Адаптера должен быть СЕТЕВОЙ МОСТ, чтобы можно было играться с ней по локальной сети

Для более удобного взаимодействия с системой я буду использовать MobaXterm через ssh к своему серверу.

IDE для сисадминов/devops'ов :)
IDE для сисадминов/devops'ов :)

Сначала я установлю БД postgresql. Сразу предупреждаю, что я это уже сделал и расскажу с какими проблемами я столкнулся с самого начала.

Но только установил!!! :-)

P.S. Чтобы приступить к работе нужно зайти в систему через root'а и установить парочку приложений:

  • apt install vim - удобный редактор для меня
  • apt install sudo - по умолчанию не стоит на дебиане. И чтобы не сидеть от рута, я даю права новому созданному пользователю
  • apt install gpg - тоже в стоке не установлено, а для подписания ключа при установке postgresql нужно

Еще зайдите в /etc/apt/sources.list и пропишите репозитории как сказано в документации к дебиану(новые правила безопасности)

deb http://deb.debian.org/debian/ bullseye main contrib non-free
deb-src http://deb.debian.org/debian/ bullseye main contrib non-free
deb http://security.debian.org/debian-security bullseye-security main contrib
deb-src http://security.debian.org/debian-security bullseye-security main contrib
deb http://deb.debian.org/debian/ bullseye-updates main
deb-src http://deb.debian.org/debian/ bullseye-updates main
sources.list
sources.list
Можно смело выходить из root'а и заходить через пользователя, которого указывали при установке. Не забудьте добавить пользователя в /etc/sudoers

Следуем инструкции из официальной документации postgresql и устанавливаем БД:

перед началом установки нужно подписать ключ и включить репозиторий sources.list
перед началом установки нужно подписать ключ и включить репозиторий sources.list
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get update

после шага "$ sudo apt-get update" я не рекомендую устанавливать postgresql без указания версии, лично у меня он ставит сразу две, а мне этого не надо, поэтому я прописал:

$ sudo apt install postgresql-14

Проверим, все ли у нас работает

Зайдите через пользователя postgresql и всегда работайте с БД от этого пользователя - безопасность как никак :)

$ sudo -i -u postgres

Создадим для теста БД

$ createdb mydb

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

$ dropdb mydb

Доступ к базе данных или начало конфигурирования

Чтобы запустить хоть как-то сервер БД из коробки, нужно прочитать man по pg_ctl утилите. И только в самом конце будет написано, что и где находится) На секундочку: в официальной документации я этого не нашел, возможно плохо искал, но там просят запускать через эту утилиту сервак, а оболочка посылает меня куда подальше, потому что не прописано в PATH.

pg_ctl не прописан в нашем глобальном окружении
pg_ctl не прописан в нашем глобальном окружении

И все, дальше что делать с этим не сказано, но благо man - наш бог

Вообще ни о чем не говорит, но в принципе дает понять, что оболочка не шарит где находится pg_ctl
Вообще ни о чем не говорит, но в принципе дает понять, что оболочка не шарит где находится pg_ctl

Пробуем запустить сервак без всяких флагов и ключей предварительно перейдя в директорию с postgresql:

$ cd /usr/lib/postgresql/14/bin

Опа, вот и чудо. Утилитка нашлась и даже запускается

Success!!!!
Success!!!!

Пробуем запустить сервер БД:

нет проинициализированного кластера - щас исправим
нет проинициализированного кластера - щас исправим

В доке написано так

инициализация кластера
инициализация кластера
/usr/lib/postgresql/14/b/usr/lib/postgresql/14/bin/pg_ctl -D ~/14/main initdb

  • /usr/lib/postgresql/14/b/usr/lib/postgresql/14/bin/pg_ctl - путь к утилите
  • ~/14/main - путь где нужно инициализировать кластер. Вы указываете свой

Я считаю это успех и маленькая победа :)
Я считаю это успех и маленькая победа :)

Идем внутрь кластера и открываем postgresql.conf. Там нужно будет указать свой адрес и порт.

listend_address и port
listend_address и port

Запускаем:

$ /usr/lib/postgresql/14/bin/pg_ctl -D ~/data start

старт бд сервера
старт бд сервера

Проверяем работает ли:)

ошибки иногда могут приносить радость, а это значит мы справились с базовым конфигурированием postgresql
ошибки иногда могут приносить радость, а это значит мы справились с базовым конфигурированием postgresql

В следующей части буду оборачивать postgresql в докер и развернем проект на сервере UWSGI, который тоже обернем в докер. Скоммуницируем их и посмотрим, что из этого выйдет.

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