Как приручить проектное окружение. php ug minsk, июнь'2014

Post on 08-Jul-2015

125 Views

Category:

Software

5 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Как приручить

проектное окружение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

alex@kurilo.me

top related