Автоматизация настройки рабочего окружения или как доставить Linux тем, у кого его нет

    Всем привет. В компании Convergent, где я работаю, в проектные команды часто входят несколько разработчиков: это могут быть специалисты по бэкенду, фронтенду и/или вёрстке. Проекты чаще всего разрабатываются на PHP, что обуславливает зависимости от различных внешних тулов вроде баз данных, систем полнотекстового поиска и прочего. И здесь кроется большая проблема: коллеги, работающие в Linux, который лежит в основе web-разработки, проблем не испытывают. А вот пользователи Windows получают головную боль.

    Как решить эту проблему? У себя в компании мы используем несколько вариантов. В этой статье я решил поделиться нашими наработками.

    • Вариант первый. Готовый набор инструментов вроде OSPanel или XAMPP. В большинстве проектов на Yii, где в основном используется только MySQL, — это очень хорошие решения.

    • Второй вариант — Docker. Он отлично подходит для автоматизации развертывания, в том числе legacy проектов. Но об этом нужно позаботиться. Сейчас, с выходом WSL 2, работать с Docker в Windows 10 (в т. ч. Домашнем издании) стало значительно удобнее, чем раньше. Об этом на Хабре есть множество статей.

    • Третий вариант — поставить Linux второй системой. Это достаточно муторный процесс, так что я автоматизировал его с помощью инструментов виртуализации и автоматизации VirtualBox, Vagrant и Ansible.

    На GitHub я выложил готовый проект. Вот что он умеет и из чего состоит:

    • Ubuntu 20.04 с графическим интерфейсом. Смысл в том, что разработчики используют систему ровно так, если бы они работали просто на Ubuntu, которая установлена второй.

    • С помощью Ansible при первом запуске устанавливается заданный набор софта (Git, Ansible, NVM, PHP, MC, Docker, Docker Compose, PhpStorm, Visual Code, DBeaver Community Edition). Набор при необходимости можно расширять с помощью создания новых ролей Ansible.

    Для работы потребуется установить VirtualBox и Vagrant. Перед установкой есть один важный момент — необходимо включить поддержку виртуализации. Обычно это настраивается через BIOS/UEFI, и в каждой реализации настройка может называться по-своему (например, VT).

    После установки всего необходимого открываем PowerShell правами администратора и с помощью Git клонируем проект:

    git clone https://github.com/s-mokrushin/ubuntu-development-box
    cd ubuntu-development-box
    cp .env.example .env

    Теперь интересный момент — нужно отредактировать файл .env под ваш компьютер. В целом, для работы Ubuntu в виртуальной машине даже 16 Гб оперативной памяти будет не лишним.

    • BOX_CPU_COUNT — количество используемых вычислительных ядер процессора. Рекомендуемое значение = Общее количество / 2. Оптимальное значение — 4. Минимальное — 1.

    • BOX_MEMORY_SIZE — объём выделяемой оперативной памяти в мегабайтах. Рекомендуемое значение = Общее количество / 2. Оптимальное значение — 8096. Минимальное — 2048.

    • BOX_DISK_SIZE — объём выделяемого дискового пространства. Рекомендуемое значение — 75GB. Данное значение определяет максимальное дисковое пространство, которое может быть использовано виртуальной машиной (для установки же потребуется около 12 Гб).

    • BOX_IP_ADDRESS — устанавливаемый локальный IP-адрес для виртуальной машины. Можно оставить по умолчанию.

    • BOX_HOSTNAME — локальный хостнейм для доступа к виртуальной машине. Также можно оставить значение по умолчанию.

    Т. к. чаще всего работа программистов в компании сводится к работе с Git, то нужно добавить свой приватный ключ SSH, скопировав его в корневую папку и переименовать файл в id_rsa. При запуске Ansible добавит его в директорию /home/vagrant/.ssh.

    Запускаем виртуальную машину:

    vagrant up

    При первом запуске Vagrant предложит установить необходимые плагины, после чего команду vagrant up нужно выполнить повторно. Также при первом запуске в фоновом режиме будут установлены все необходимые компоненты. Система загрузится быстрее, а весь набор софта будет установлен в процессе работы.

    Ubuntu 20.04
    Ubuntu 20.04

    После добавления изменений в конфигурацию Ansible, надо запускать команду vagrant provision (или vagrant up — provision, если виртуальная машина ещё не запущена).

    Процесс установки всего необходимого ПО происходит с помощью инструмента Ansible. Если интересно узнать про него подробнее, то на русском языке есть как минимум две книги “Полное руководство Ansible, 3 изд.” и “Запускаем Ansible”. Я постарался написать конфигурацию максимально простой и понятной.

    Заключение

    Есть множество способов использовать Linux окружение, оставив в качестве основной ОС Windows 10. Вариант с установкой ОС в виртуальную машину выглядит достаточно громоздким и ресурсоемким, но, с другой стороны, процесс автоматизации с помощью Ansible и Vagrant позволяет не устанавливать каждый раз весь необходимый софт для работы, а также с лёгкостью переносить все настроенные внутри виртуальной машины проекты с компьютера на компьютер.

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

    Полезные ссылки

    • OSPanel — локальный веб-сервер для Windows с большим количеством модулей (вроде MongoDB, Redis и т. д.).

    • XAMPP — Apache + MariaDB + PHP + Perl для Windows.

    • Ansible — система управлениям конфигурациями.

    • VirtualBox — наиболее популярная система виртуализации операционных систем для рабочих станций.

    • Vagrant — инструмент для конфигурирования виртуальной среды.

    Комментарии 11

      0

      Чем плох WSL?

        0
        Он хорош, особенно второй версии. А вариант с виртуалкой будет удобнее в плане переноса проектов с компьютера на компьютер.
          +3

          мне больше нравится вариант наоборот
          на хосте линукс а винда в виртуалке и вот почему:
          1) винда нужна (ну покрайней мере нам) крайне редко
          2) qemu/kvm доступный только в линуксе сильно лучше чем virtualbox (взять хотя бы virtio устройства) да и в целом виртуализация в линуксе работает лучше
          3) с хоста можно винде в виртуалке надавать по рукам чтобы не лезла куда не следует
          4) винда чаще помирает (бсоды там всякие, повисания..) и виртуалку рестартануть и/или откатить на снапшот быстрее и проще чем ось на железе


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

            0
            Лицензия MacOS запрещает на виртуалке крутить, но если очень надо то раз и два.
              0

              Да понятное дело что если очень хочется и никто не видит то можно.. Я говорил про легально решение.

            0
            Каждый строит инфраструктуру как хочет, но у меня два вопроса:
            1. Почему VirtualBox, а не Hyper-V, Vagrant же его поддерживает?
            Последний может и не умеет прокидывать флэшки, зато прекрасно справляется с менеджентом оперативы. Без приколов в духе «дал виртуалке 8 гигов, она использует 2. На хосте отожрано 8. 6 гигов в отпуске».

            2. Раз уж речь пошла про Hyper-V, то чем не устроил встроенный VM Gallery?
            Делаем базовый образ со всем что нужно и json файл галереи с конфигом. Оба лежат на сервере. На клиентских машинах ps скриптом или через Windows Admin Center включаем гипервшную роль и кидаем в реестр линк на json. Готово.
            Передача .ssh ключа делается через ps команду Copy-VMFile руками, но я бы потыкал темплейт галереи на предмет поддержки нужных опций.
              0
              Насчет памяти неплохая такая экономия выходит. Но Hyper-V отсутствует в Home издании Windows, что может быть проблемой.
              0
              Использование графического интерфейса в виртуалке — это достаточно дорого, за два гигабайта получается довольно слабое окружение, в котором нужно постоянно закрывать всё то, с чем не работаешь прямо сейчас.

              Так же вопрос к выбору графического окружения — почему для вируталки выбран GNOME 3?
                0
                Да, дорого. Один из наших проектов, где используется Elastic Search, 16 Гб уже едва хватает. Пробовал переносить на WSL2 — особо не сэкономил.

                Так же вопрос к выбору графического окружения — почему для вируталки выбран GNOME 3?

                В основном все работают с Ubuntu, поэтому и взял стандартное издание. Хорошая идея, есть же например Lubuntu и Xubuntu.
                0
                1. Почему виртуалка, а не установка 2й системой или даже 1й? Но это уже вопрос о фломастерах, поэтому будем считать, что так надо.

                2. Vagrant используется несколько для других целей: работа с виртуакой из хоста, например, развернули сервер автоматом и заливаем туда код, который пишем на хосте. У вас же подразумевается полноценная работа в графическом интерфейсе и ide внутри бокса, тогда хватит простого virtualbox.

                3. Если уже ide и весь софт в виртуалка, то почему бы не поставить убунту второй системой? Это я все ещё по поводу пункта 1 не успокоюсь.

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

                  0
                  На нескольких проектах мы применяли подход, про который вы говорите в пункте 2. Здесь есть ряд проблем: примонтированные директории (даже с помощью NFS) в Windows работают очень медленно, симлинки не всегда работают корректно, а права к файлам и папкам всегда 666 и 777. По этой причине проще работать в нативной файловой системе Linux (ext4). Еще эта проблема отпадает при использовании WSL2 (он наоборот прокидывает файлы из Linux в Windows).

                  Вторая система — однозначно лучше и производительнее, не отрицаю. Но если надо работать сразу с двумя ОС, тогда так или иначе потребуется виртуальная машина (либо вторая физическая).

                  По поводу 4 пункта: для самой Ubuntu у меня уже используется подготовленный box файл. Но вообще идея была в том, чтобы не тратить время на подготовку этого образа при каждом изменении конфигурации, поэтому Ansible и пригодился.

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                Самое читаемое