Files
SimbirSoft-DevOps-testwork/README.md
T

9.2 KiB
Raw Blame History

Тестовое задание SimbirSoft DevOps

Note

Соловьев Руслан

Резюме - HH

Узнать поднобнее - https://ruslansoloviev.ru

Почему хочу девопсить

Мне нравится DevOps за сочетание разработки и системного администрирования. Мне интересно не только написать приложение, но и разобраться, как оно будет развёрнуто, как автоматизировать этот процесс, обеспечить его стабильную работу и понять, что происходит с сервисом после его запуска.

Именно поэтому со временем я стал больше заниматься инфраструктурной частью своих проектов: Docker, CI/CD, Kubernetes, мониторингом, сетями и автоматизацией. Особенно нравится автоматизировать повторяющиеся процессы и превращать ручную настройку в воспроизводимую конфигурацию.

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

Теоретическая часть

  1. Нужно обеспечить высокую доступность сервиса, как бы ее реализовал?
  • Так как у нас технически в данном задании nginx раздает только статику я бы вообще убрал сервер как точку отказа и вынес статическую страницу в объектное хранилище S3 и подключил CDN, таким образом высокая доступность будет обеспечена силами облачного провайдера, а CDN ускорит доставку контента до пользователей и сократит затраты на GET операции в хранилище.
  • Если же необходимо реализовать высокую доступность именно посредством серверов, то я бы поднял как минимум 2 экземпляра на разных ВМ в разных зонах доступности и повесил на них балансировщик с хелс чеками доступности каждой из ВМ что бы не слать трафик на заведомо мертвую ВМ, 2 AZ поскольку этого будет достаточно в большинстве случаем да и самому nginx не нужен кворум для работы
  1. Тебе надо создать и настроить 5 таких серверов, как бы это реализовал?
  • Так как я описал необходимое состояние ВМ в ansible плейбук то для настройки будет достаточно указать все ВМ в инвентаре плейбука, а для заказа смотря как управляется текущая инфраструктура - если там терраформ или что то похожее то в конфигурации описал бы необходимые 5 экземпляров, если ручками то заказываю в гипервизоре или панели клауд провайдера

Практическая часть

В данном тестовом задании я использовал Ansible и для его воспроизводимости понадобятся сам Ansible и некоторые его коллекции, установить которые можно следующими командами:

Debian/Ubuntu

sudo apt update && sudo apt install -y ansible

macOS

brew install ansible

Через pip

python3 -m pip install ansible
ansible-galaxy collection install community.general
ansible-galaxy collection install community.crypto
ansible-galaxy collection install community.docker
ansible-galaxy collection install ansible.posix

В файле hosts.yaml необходимо указать адрес ВМ и пользователя, например

all:
  hosts:
    nginx:
      ansible_host: 192.168.20.217
      ansible_user: rouxinol

Далее в файле secrets.yaml необходимо указать пароль для указаного ранее пользователя, а так же пароль для sudo для указаного пользователя, например:

ansible_password: "superpass123"
ansible_become_password: "superpass123"

Далее можно зашифровать этот файл:

ansible-vault encrypt secrets.yaml

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

ansible-playbook -i hosts.yaml playbook.yaml

Warning

Если был зашифрован secrets.yaml то необходимо так же добавить флаг --ask-vault-pass


Скриншоты работы сервиса:

HTTP

Страница Hello DevOps world по HTTP

HTTPS

Страница Hello DevOps world по HTTP


В качестве лабораторной работы я заказал ВМ с Ubuntu Server 24.04 с пользователем rouxinol в Proxmox VE, IP ВМ в локальной сети - 192.168.20.217

Логи выполнения плейбука можно посмотреть в логе выполнения Ansible

Логи повторного выполнения плейбука можно посмотреть в логе повторного выполнения Ansible

Ремарки к практическим заданиям

  1. Продемонстрировать блокировку портов

Конечная конфирукция ufw с ВМ

rouxinol@rouxinol-testserver:/opt/nginx$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp (OpenSSH)           ALLOW IN    Anywhere
80/tcp                     ALLOW IN    Anywhere
443/tcp                    ALLOW IN    Anywhere
22/tcp (OpenSSH (v6))      ALLOW IN    Anywhere (v6)
80/tcp (v6)                ALLOW IN    Anywhere (v6)
443/tcp (v6)               ALLOW IN    Anywhere (v6)

Nmap по привелигированным портам

 nmap 192.168.20.217
Starting Nmap 7.98 ( https://nmap.org ) at 2026-08-17 01:54 +0300
Nmap scan report for 192.168.20.217
Host is up (0.0029s latency).
Not shown: 997 filtered tcp ports (no-response)
PORT    STATE SERVICE
22/tcp  open  ssh
80/tcp  open  http
443/tcp open  https

Nmap done: 1 IP address (1 host up) scanned in 43.31 seconds
  1. Бекап каждый понедельник
root@rouxinol-testserver:/opt/nginx# crontab -l
CRON_TZ="UTC"
#Ansible: nginx configuration backup
0 1 * * 1 /opt/nginx/backup.sh
root@rouxinol-testserver:/opt/nginx# ./backup.sh
Successfully copied 25.1kB to /tmp/tmp.9hPGthi4R2/nginx
root@rouxinol-testserver:/opt/nginx# ls backups/
nginx_2026-08-16_23-01-36.tar.gz  nginx_2026-08-16_23-02-10.tar.gz
  1. В Dockerfile указано запускать master-процесс от пользователя nginx, а так же в nginx,conf указано запускать worker-процессы так же от nginx, однако для этого были выбраны непривелигированные порты 8080 и 8443, однако можно было использовать образ nginxinc/nginx-unprivileged и не указывать ничего из этого и в Dockerfile есть закомментированный FROM этого образа - однако он не был выбран так как в Docker Hub нет нужной 1.29.6 версии - я подобрал ближайшую

  2. При запуске плейбука в его корне автоматически создается ssh ed25519 ключ без фразы пароля, для подключения к ВМ будет достаточно именно для моего тестового окружения следующей команды:

ssh -i ./id_ed25519_simbirkey rouxinol@192.168.20.217
  1. Dockerfile тут