Skip to content

Instantly share code, notes, and snippets.

@the-teacher
Last active November 27, 2015 18:20
Show Gist options
  • Save the-teacher/780fe44410a197745474 to your computer and use it in GitHub Desktop.
Save the-teacher/780fe44410a197745474 to your computer and use it in GitHub Desktop.
Конфа
0
Vagrant И Chef. От Dev окружения до развертки Rails приложения.
1
Зыкин Илья.
github.com/the-teacher
2
Учитель информатики
В 2006 узнал о ruby
В 2008 сделал свой первый `rake db:migrate`
С 2011 пишу production код на Rails
3
Специализация:
Frontend / CMS / ECommerce
4
Я исповедую:
Простоту
Изоляцию
Управление сложностью
Business-driven development
5
Для кого
Разработчик, который сидит под WIN 0_o
Фрилинсер, переключающийся между разнородными проектами
Тимлид/Техдир, которому нужно избежать пробелмы "MacOS обновился - ничего не работает. Вернусь к работе дня через 3"
Разработчик, который хочет получить окружение сходное с production для дебага
СисАдмин, который хочет разобраться с Chef
6
Что делает Vagrant
1. Запускает процесс установки ОС (Debian Linux) в виртуальную машину (Virtual Box)
2. Устанавливает ssh соединение, прокидывает ключи
3. Устанавливает в ВМ софт по заданному сценарию (bash, chef, ansible ...)
4. Монтирует заданный каталог HOST машины в ВМ (GUEST)
5. Биндит порты между HOST и GUEST
7
Итого
Запуск приложения в ВМ (полная изоляция)
Редактирование кода в родной среде
Просмотр результата в родной среде
Готовность к запуску APP через час
8
Как этого добиться?
Установить VirtualBox
Установить Vagrant
Добавить в проект Vagrantfile + Cheffile
cd APP && vagrant up
9
Анатомия Vagrantfile
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/trusty64"
config.vm.provider :virtualbox do |vb|
vb.customize ["modifyvm", :id, "--memory", "2048"]
vb.cpus = 2
end
config.vm.network :forwarded_port, guest: 80, host: 3000
config.vm.synced_folder '.', '/vagrant', nfs: true
# Your recipes
end
10
Анатомия Cheffile
# encoding: utf-8
site 'http://community.opscode.com/api/v1'
cookbook 'apt', '~> 2.8.2'
cookbook 'build-essential', '~> 2.2.3'
cookbook 'git', '~> 4.3.4'
cookbook 'rvm', '~> 0.9.4'
cookbook 'nodejs', '~> 2.4.2'
cookbook 'mysql', '~> 6.1.0'
cookbook 'current_project',
path: './cookbooks_addons/current_project'
11
Использование
Vagrant.configure("2") do |config|
# your code
config.vm.provision :chef_solo do |chef|
chef.version = "11.18"
chef.cookbooks_path = ["cookbooks", "cookbooks_addons"]
chef.add_recipe 'apt'
chef.add_recipe 'build-essential'
chef.add_recipe 'git::source'
chef.json = {
git: {
version: '2.5.3',
url: 'https://nodeload.github.com/git/git/tar.gz/v2.5.3'
}
}
end
end
12
Подробнее о структуре Chef рецептов я рассказывал в видео:
https://goo.gl/RpyTtC
13
Отлаженные на локальной машине Chef рецепты можно использовать для поднятия реального сервера
14
Chef
Cистема управления конфигурациями
Де-факто:
Поднять сервер
Установить софт
Сконфигурировать софт
Получить статус
15
Сервера можно поднимать:
руками
автоматизированно скриптами
автоматизированно спец. средствами (chef, puppet, ansible etc.)
Инфраструктуры можно поднимать:
автоматизированно скриптами
автоматизированно спец. средствами (chef, puppet, ansible etc.)
16
О практиках
1) Суровые сисадмины предпочитают bash-like scripting
2) Capistrano тоже могёт!
Если добавить в Cap шаблонизацию конфигов и написать ряд рецептов,
то Cap тоже может настраивать сервера.
17
Чем отличается Chef от Capistrano
Cap подает много управляющих запросов (via shh) на сервер
Chef подает один управляющий запрос серверу
Cap рецепты хранятся на локальной машине
Chef рецепты хранятся на удаленной машине. Мы пишем их и загружаем в хранилище рецептов
Cap не имеет встроенной шаблонизации и системы управления параметрами
Chef имеет шаблонизацию из коробки и управление параметрами рецептов
18
О терминах
chef - целый комплекс инструментов
knife - утилита управления на рабочей машине
chef-server (chef-solo, chef-zero) - хранилище инструкций
chef-client - утилита на сервере, выполняющая инструкции с chef-server
19
Как работает Chef
1) Создать сервер и поставить на него chef-client
knife digital_ocean droplet create --bootstrap
=> 188.166.92.172
knife bootstrap 188.123.92.111 --sudo -x admin -P Password
2) Загрузить кукбуки в хранилище
knife cookbook upload --all
3) Попросить шефа для данной ноды запустить chef-client
knife ssh "name:node_server_name" "chef-client -l info" -x root -G 188.123.92.111
"name:node_server_name" -- имя набора инструкций и параметров к исполнению
20
Вопросы на входе
1) Как установить chef?
2) Где взять сервак для экспериментов?
3) Как запустить chef-server?
4) Что нужно, что бы это все заработало?
21
1) Как установить chef?
https://downloads.chef.io/chef-dk
2) Где взять сервак для экспериментов?
Например, DigitalOcean
3) Как запустить chef-server?
Не надо ничего запускать
Для пробы достаточно зарегистрироваться на сайте
До 5 серверов обслуживаются бесплатно
manage.chef.io
22
Что нужно, что бы это все заработало?
Gemfile
```
source "https://rubygems.org"
gem 'librarian-chef'
gem 'knife-digital_ocean'
```
Cheffile
```
site 'https://supermarket.getchef.com/api/v1'
cookbook 'git', '~> 4.3.4'
cookbook 'rvm', '~> 0.9.4'
cookbook 'nodejs', '~> 2.4.2'
```
23
Файлы из аккаутна chef.io
```
.chef/project-validator.pem
.chef/project.pem
.chef/knife.rb
```
24
.chef/knife.rb
```
current_dir = File.dirname(__FILE__)
log_level :info
log_location STDOUT
node_name "the_teacher"
client_key "#{current_dir}/the_teacher.pem"
validation_client_name "project-validator"
validation_key "#{current_dir}/project-validator.pem"
chef_server_url "https://api.chef.io/organizations/project"
cookbook_path ["#{current_dir}/../cookbooks"]
knife[:digital_ocean_access_token] = 'XXXXXXXXXXXXXXXXX'
```
25
knife digital_ocean sshkey create -n do_ssh_key -i ~/.ssh/id_rsa.pub
(librarian-chef update) && (knife cookbook upload --all)
knife digital_ocean droplet create \
--server-name example.com \
--image debian-8-x64 \
--location ams3 \
--size 512mb \
--ssh-keys 1519722 \
--run-list "recipe[project_recipe]" \
--bootstrap
26
Деплой
У chef есть свой DSL.
Набор процедур DEPLOY обеспечивает процесс деплоя аналогичный Capistrano
https://docs.chef.io/resource_deploy.html
ИТОГО
1) Ставим Vagrant для экспериментов в изолированной среде
2) Пробуем Chef, как инструмент развертки сервера на ВМ. Изучаем DSL. Учимся писать рецепты
3) Заводим себе аккаунт на chef.io и получаем там минимальный набор данных для старта
4) Заводим сервер на DO и пробуем наработать практику на боевой машине
... PROFIT!
27
Заметки из жизни
1) Не мешайте свои Vagrant файлы c файлами приложения
поместите все что связано с Vagrant в отдельный каталог
смонтируйте ВМ не к `.` а к `../`. Держите свое приложение чистым
2) Не сходите с ума по chef если в проекте меньше 10-ка серверов
Автоматизацию на bash скриптах поймет и сможет поддерживать каждый сисадмин.
bash + ruby + chef DSL -- очень затратная связка, которой владеют намного меньше людей.
Они знают об этом. Они просят много больше денег.
3) Многие говорят об универсальности chef рецептов. Говорят, что хороший cookbook делает все как надо на 100500 версиях ОС.
В жизни мало кто решится на содержание зоопарка ОС внутри одной инфраструктуры.
На практике выбирают один образ ОС и пишут рецепты под него.
Но стоит ли овчинка выделки? Может стоит реализовать бОльший кусок конфигурации в bash стиле?
Поддержка bash скриптов в разы проще и дешевле.
4) Я отказался от Vagrant при ежедневной разработке
Жрет батарею. Греет мас. Сейчас у меня нет нужды поддерживать разнородные проекты.
28
Думайте своей головой!
29
Спасибо!
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment