Upload
kamazee
View
120
Download
5
Embed Size (px)
Citation preview
Как приручить
проектное окружениеPHP User Group, Минск, Июнь’2014
Александр Курило, EPAM
«Приручить»?
Насколько окружение вам
подконтрольно?
Что будет, если сеть пропадет?
Что будет, если сервер исчезнет?
Что будет, если винчестер на рабочей
машине сдохнет?
Грустная история
Жил-был проект.
Жил-был сервер.
Всё было хорошо.
Пока не понадобился ещё один сервер.
Ещё один сервер?
2 часа!
alex@workstation:~$ ssh root@newserver
Linux EVBYMINSD234A 3.2.0-4-amd64 #1 SMP Debian 3.2.51-1 x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Tue Jun 17 14:39:08 2014 from workstation
root@newserver:~# apt-get install nginx-light php5-fpm php5-curl mysql-server
sudo
Reading package lists... Done
Building dependency tree
Reading state information... Done
sudo is already the newest version.
The following extra packages will be installed:
libaio1 libdbd-mysql-perl libdbi-perl libhtml-template-perl
libmysqlclient18 libnet-daemon-perl libonig2 libplrpc-perl libqdbm14 mysql-
client-5.5 mysql-common mysql-server-5.5 mysql-server-core-5.5 nginx-common
php5-common
The following NEW packages will be installed:
libaio1 libdbd-mysql-perl libdbi-perl libhtml-template-perl
libmysqlclient18 libnet-daemon-perl libonig2 libplrpc-perl libqdbm14 mysql-
client-5.5 mysql-common mysql-server mysql-server-5.5 mysql-server-core-5.5
nginx-common
nginx-light php5-common php5-curl php5-fpm
0 upgraded, 19 newly installed, 0 to remove and 0 not upgraded.
Need to get 13.7 MB of archives.
After this operation, 108 MB of additional disk space will be used.
Do you want to continue [Y/n]?
Поехали!
Приехали :(
PHP Fatal error:
Call to undefined function ldap_bind()
Тоже мне проблема
apt-get install php5-ldap
Поехали!
Бдыщь :(
PHP Fatal error:
Class 'SplEnum' not found
Class 'MarkdownDocument' not found
Что-то не так
Написать инструкцию?
Написать инструкцию?
Скрипт?
Скрипт?
Использовать мудрость поколений
Использовать мудрость поколений
Provisioning
«Подготовка к работе, инициализация»
Управление конфигурацией
Как это выглядит?
1. Playbook
$ cat ansible/env.yml
---
- hosts: all
roles:
- repo-mirror
- repo-update-cache
- packages-ansible
- repo-dotdeb
- packages-system-base
< … >
Как это выглядит?
2. Roles (tasks, handlers, files, templates, vars)
$ tree ansible/roles/repo-mirror
ansible/roles/repo-mirror
├── defaults
│ └── main.yml
├── handlers
│ ├── main.yml
│ └── update_cache.yml
├── tasks
│ └── main.yml
└── templates
└── etc
└── apt
└── sources.list.j2
$ cat ansible/roles/repo-mirror/tasks/main.yml
---
- name: Set sources.list
sudo: yes
template: src=etc/apt/sources.list.j2 dest=/etc/apt/sources.list
register: repo_mirror
- include: ../handlers/main.yml
when: repo_mirror.changed
Как это выглядит?
3. Inventory
$ cat ansible/inventory/dev
[api-dev]
myproject-api.dev api_hostname=myproject-api.example.org
Как это выглядит?
Всё вместе:
alex@workstation:~/projects/sample$ ansible-playbook -i qa env.yml
PLAY [all]
********************************************************************
GATHERING FACTS
***************************************************************
ok: [default]
TASK: [repo-mirror | Set sources.list]
****************************************
ok: [default]
TASK: [repo-mirror | Update apt cache]
****************************************
skipping: [default]
TASK: [repo-update-cache | Update apt cache]
**********************************
ok: [default]
SSH? apt-get? Нет, спасибо
Поход по SSH на сервер и установка
пакетов вручную (и тем более сборка
из исходников) — антипаттерн!
Возпроизводимое окружение
Версионированное окружение
Состояние окружения синхронизировано с
состоянием проекта
Ещё один сервер?
10 минут!
А можно так прямо у меня?
Конечно! Можно поднять виртуалку.
А если в команде больше одного
человека?
А если нужно проверить всё под новой
версией ОС?
Vagrant
$ vagrant up
Box — это готовая, минимально
конфигурируемая виртуалка. Свой box
сделать тоже несложно!
Немного магии
config.vm.provision "ansible" do |ansible|
ansible.playbook = "ansible/dev.yml"
ansible.groups = {
"dev" => ["default"],
}
end
$ ansible-playbook -i qa env.yml$ vagrant provision
Итого
У каждого разработчика свое окружение
Управляется двумя командами:
$ vagrant up
$ vagrant provision
QA, staging, production etc — под тем же
провиженингом
Переустановил винду?
10 минут!
Нет сети?
Пофиг
Поменял винду на мак?
10 минут
Спасибо
Майклу Дехану за ansible
Митчеллу Хашимото за Vagrant
Вам за внимание :-)
kamazee