![Настройка среды разработки](https://habrastorage.org/webt/oe/rw/as/oerwasqjgphaf0-pip3b-7zokmg.png)
В этот раз я хочу поделиться своим результатом настройки персонального окружения для работы с различными PHP-based проектами с использованием Puppet. В данной статье описываются результаты, которые были получены в процессе изучения и написания Puppet конфигурации.
Данная статья написана с целью показать один из способов это сделать. Я не хочу призывать к действию, а только делюсь тем, с чем я столкнулся, что сделал и как использую.
Статья будет очень длинной с уклоном в техническую сторону. Прошу под «кат».
Какое-то время назад мною была написана статься «Настройка среды разработки: кружок рукоделия (Часть 1)», в которой я описал свои мучения при каждой смене проекта. При подготовке этой статьи были добавлены и убраны некоторые компоненты среды. В конце статьи будет ссылка на репозиторий с модулем, который вы можете
Цель: быстро настроить рабочую среду под текущий проект
Цель та же, но с небольшим дополнением: если можешь автоматизировать, то сделай это.
Puppet
Это хороший инструмент, которые поможет вам в управлении конфигурацией различных операционных систем.
Выбор пал именно на этот инструмент, так как этот инструмент используется в компании, а мне необходимо знать, что происходит за кулисами у DevOps / NetOps.
Таким образом в процессе описания конфигурации, я получил следующее:
— PHP (5.6, 7.x; pools для каждого проекта; расширения; composer)
— NGINX (PHP-FPM upstream для каждого проекта; Простая конфигурация vhost)
— OpenSSL
— MySQL
— Bind9
— NodeJS + NPM
— Memcached
— Redis
— Docker
— Дополнительное ПО: mc, htop, wget, curl
Конфигурация
Так как я храню реальную конфигурация в приватном репозитории, то вашему вниманию я предлагаю ознакомится с учебной версией, которую я буду описывать в этой статье.
Внимание: данные репозиторий поставляется как есть. Дальнейшая судьба проекта — стать более гибкой основой или умереть.
При разработке
Основой код, который отвечает за установку пакетов, создание файлов и перезапуск сервисов находится в ветке 'production'. Используя возможности Puppet Hiera я предоставил возможность настраивать конфигурацию текущего узла, которая определяется по FQDN рабочей машины. Таким образом один из примеров конфигурации можно найти по пути:
hieradata/nodes/dev.lo.yaml
---
# Node with all in one
classes:
- role::all
composer: true
projects:
warface:
- {name: 'www', php: php7.0}
- {name: 'imageproxy', php: php5.6}
cryengine:
- {name: www, php: php7.1}
- {name: shop, php: php7.1}
- {name: forum, php: php5.6}
php:
versions: [php5.6, php7.0, php7.1, php7.2]
packages: [
opcache, gd, bcmath, curl, intl, json, mbstring,
mysql, readline, soap, sqlite3, tidy, xml, zip,
codecoverage, codesniffer, igbinary, geoip, imagick,
memcache, memcached, redis, xdebug, ssh2
]
tools: [imagemagick]
bind9:
dns: ['8.8.8.8', '8.8.4.4']
которая будет объединена с
hieradata/common.yaml
---
# Puppet Server Tuning
puppet_enterprise::master::puppetserver::jruby_max_requests_per_instance: 0
classes:
- role::default
composer: true
nginx:
domain: "%{::fqdn}"
projects:
development:
- name: 'www'
php: 'php7.0'
php:
versions: [php7.0]
packages: [
curl, mbstring, xml, json, intl, xdebug
]
tools: [mc, htop, wget, curl]
db:
mysql:
root_password: root
remove_default_accounts: true
override_options: {}
bind9:
dns: ['8.8.8.8', '8.8.4.4']
zone: "%{::fqdn}"
В результате выполнения данной конфигурации будет установлен весь изначальный список компонентов, а так же на сервере будут следующие особенности:
1) Создана конфигурация для NGINX + PHP-FPM для следующих проектов:
— www.warface.lo (php7.0)
— imageproxy.warface.lo (php5.6)
— www.cryengine.lo (php7.1)
— shop.cryengine.lo (php7.1)
— forum.cryengine.lo (php5.6)
2) Установлены следующие версии PHP с соответствующими модулями: 5.6, 7.0, 7.1, 7.2
3) Будет установлен пакет imagemagick
4) Обновлен OpenSSL до последней доступной версии
5) MySQL root/root
6) Redis и Memcached сервисы
7) Последние версии Composer, NodeJS и NPM
8) Сервер bind9 + его конфигурация, которая позволяет «резолвить» запросы домена *.lo на текущий хост.
9) Docker
Структура
Структура репозитория объединяет в себе следующие понятия:
master branch — контрольный репозиторий (control-repo)
production branch — описание конфигурации 'production'
Установка
Процесс запуска сводится к нескольким простым шагам:
1) Установка git + puppet + r10k
2) Инициализация «control-repo»
2) Разворачивание конфигурации с помощью r10k
3) Запуск puppet apply
bash
#!/bin/bash
echo "Initialize"
# https://docs.puppet.com/puppet/5.1/install_linux.html
# https://docs.puppet.com/puppet/5.1/puppet_platform.html
wget --no-verbose https://apt.puppetlabs.com/puppet5-release-xenial.deb
dpkg -i --force-confdef puppet5-release-xenial.deb
rm -f puppet5-release-xenial.deb
echo "[APT]: ===="
apt-get update
sudo apt-get upgrade -y
apt install -o Dpkg::Options::="--force-confold" -y git puppet-agent r10k
echo "[APT]: Puppet"
export PATH=/opt/puppetlabs/bin:$PATH
echo "Puppet version is $(puppet --version)"
echo "[PUPPET]: Control Repo"
git clone https://github.com/OxCom/puppet-php-skeleton-dev.git
cp -rf ./puppet-php-skeleton-dev/* /etc/puppetlabs/puppet/
rm -rf ./puppet-php-skeleton-dev
echo "[SSH]: ===="
echo "[SSH]: Hosts"
ssh-keygen -R bitbucket.org
ssh-keyscan bitbucket.org >> ~/.ssh/known_hosts
ssh-keygen -R github.com
ssh-keyscan github.com >> ~/.ssh/known_hosts
echo "[PUPPET]: ===="
echo "[PUPPET]: Running R10K"
cd /etc/puppetlabs/puppet
r10k deploy environment -p -v
echo "[PUPPET]: Running puppet"
puppet apply /etc/puppetlabs/puppet/environments/production/manifests/site.pp --confdir=/etc/puppetlabs/puppet --environment=production --environmentpath=/etc/puppetlabs/puppet/environments/
Дальнейшая модификация
Ниже приведен список того, как можно улучшить текущую конфигурацию и сделать ее более гибкой:
— Добавить классы, описывающие процесс разворачивания проекта (git clone, специфические vhost, настройки приложения, разворачивание базы: пользователь + схема + данные)
— Добавить классы запуска контейнеров для docker
— Генерация сертификатов (NGINX + HTTPS)
Реализация далека от идеала и не всегда следует правилам, но вот что хотелось бы выделить:
— Всегда думайте о зависимостях, так как Puppet не гарантирует инициализацию классов в порядке их подключения;
— Описывайте с помощью hiera параметры, которые изменяют поведение класса;
— Не забывайте про параметры по умолчанию;
— Не изобретайте велосипед: возможно кто-то уже сделал тот функционал, который вам необходим.
Полезные ссылки
— Документация Puppet
— R10K
— Puppet Модули
— Puppet Cookbook
— Настройка среды разработки: кружок рукоделия (Часть 1)
P.S.: Если вы найдете какие-либо вещи в репозитории, которые можно улучшить, то напишите мне об этом и с примером или ссылкой, как это можно изменить.