22
Истиный DevOps. Никита Борзых, Express Секрет

Истинный DevOps. Секрет 42

Embed Size (px)

Citation preview

Page 1: Истинный DevOps. Секрет 42

Истиный DevOps.

Никита Борзых, Express

Секрет

Page 2: Истинный DevOps. Секрет 42
Page 3: Истинный DevOps. Секрет 42

Клиент

Сервер как произведение искусства

Утеря знаний вместе с админом

Два вечера, чтобы узнать почему ничего не работает

Еще два вечера, чтобы понять как с этим дальше жить

Мониторинг присылает 100 email в день

Page 4: Истинный DevOps. Секрет 42

Управление конфигурацией

Весь опыт системного администратора в git репо

Вся информация о компонентах есть в git репо

Мониторинг как код =)

Без рук!

Page 5: Истинный DevOps. Секрет 42

Chef Workflow

1 клиент – 1 git репозиторий

Логическое деление кукбуков на слои

Chef-solo для локального развертывания

Развертывание  проекта  локально  –  три  команды:

bundle install, librarian-chef install, vagrant up

1 окружение – 1  chef server

Page 6: Истинный DevOps. Секрет 42

Слои кукбуков

Base

Services

Applications

Page 7: Истинный DevOps. Секрет 42

Слой base

lvm, sysctl, apt, ssh ...

# Add express42 public web repositoryapt_repository "express42-web" do action :add uri "http://repos.express42.com/web/precise/ ./" key "http://repos.express42.com/web/precise/Release.key"end

Сожержит кукбук с chef libraries

Выполняется на всех серверах

Page 8: Истинный DevOps. Секрет 42

Слой service

redis, postgresql, nginx ...

# Setup redis main databaseredis "main" do configuration( :bind => "0.0.0.0", :maxclients => 256 )end

Содержит кукбуки сервиcов, которые нужны для приложения

LWRP вызывается из кукбуков приложений

Page 9: Истинный DevOps. Секрет 42

Слой Application

app::redis, app::backend ...# Add express42 public web repositoryapt_repository "express42-web" do action :add uri "http://repos.express42.com/web/precise/ ./" key "http://repos.express42.com/web/precise/Release.key"end

#Create partition for rails applicationpartition redis_lvolume_name do group lvm_group size lvolume_size filesystem 'ext4' mount_point railsapp_application_directoryend

listen_address = net_get_private_ip()

# Setup redis main databaseredis "main" do configuration( :bind => listen_address, :maxclients => 256 )end

...

Page 10: Истинный DevOps. Секрет 42

Репозиторий

CheffileCheffile.lockGemfileGemfile.lockVagrantfilecookbooksdata_bagsenvironmentsinhouse-cookbooksroles

<-- результат работы librarian

<-- кукбуки проекта

<-- гемы для запуска проекта

<-- используемые в проекте кукбуки

Page 11: Истинный DevOps. Секрет 42

Управление репозиторием

Librarian Berkshelf

Управляют зависимостями like a pro bundler

Самостоятельно заливает кукбуки на chef-server

Могут интегрироваться с vagrant

Результатом работы является директория с актуальными версиями кукбуков.

управляет только кукбукамиЧто и когда заливать решаете вы

Page 12: Истинный DevOps. Секрет 42

Забивай молотком,руби топором.

librarian-chef installknife cookbook upload -a

Page 13: Истинный DevOps. Секрет 42

Chef Solo

Приходится тестировать проект в chef-client и chef-solo

Развертывание проекта локально занимаетминимум времени и усилий

Клиент может поднять свой проект без боли

Page 14: Истинный DevOps. Секрет 42

Chef Solo

if Chef::Config[:solo] Chef::Log.warn("This recipe uses search. Chef Solo does not support search. I will return current node") postgresql_master_node = [ node ] backend_node = [ node ]else postgresql_master_node = search(:node, "role:postgresql-master AND chef_environment:#{node.chef_environment}") backend_node = search(:node, "role:application-backend AND chef_environment:#{node.chef_environment}")end

Node search in solo mode

Databag search in solo mode

https://github.com/edelight/chef-solo-search

Page 15: Истинный DevOps. Секрет 42

Bugs in solo mode

Page 16: Истинный DevOps. Секрет 42

Роли это больНе версионируются,неотделимы от кукбука

Боль почти не чувствуется, если в одном chef сервереодно окружение

Проблемы с распространением кукбуков

Альтернативный путь: role cookbooks

Page 17: Истинный DevOps. Секрет 42

Role cookbooksroles/rails-backend.rb:name "rails-backend"description "Rails application backend"run_list("recipe[client::rails-backend]")

cookbooks/client/metadata.rb:name "client"description "Sets up applications for client"version "1.0.0"...depends "runit"depends "rvm"depends "lvm"depends "postgresql"depends "redis"

cookbooks/client/recipes/rails-backend.rb:

include_recipe "rvm"node.override['rvm']['rubies'] = [ 'ruby-1.9.3-p392' ]...

Page 18: Истинный DevOps. Секрет 42

Окружения

chef-run в vagrant дожен проходить с аттрибутами, которые прописаны в кукбуках

переопределение аттрибутов в файле окруженияenvironments/production.rb:name "production"description "Production environment"default_attributes( "postgresql" => { "volume_size" => "500G", "private_network" => "172.20.1.0/24", "databases" => { "main" => { "shared_buffers" => "3GB", "wal_keep_segments" => 128 } } })

Page 19: Истинный DevOps. Секрет 42

Мониторинг

Собираются базовые(io,net,os) метрики

Приложение присылает данные через zabbix trapper

Сервер добавляется в мониторинг после первого chef-run

Графики по всем метрикам

Page 20: Истинный DevOps. Секрет 42

Мониторинг::Примерzabbix_connect "connect to zabbix" do apiurl "http://<zabbix-server>/api_jsonrpc.php" databag "zabbix"end

zabbix_host node.fqdn do host_group "Rails-backend" use_ip true ip_address net_get_private_ip(node)end

zabbix_template 'Linux_Template'

zabbix_screen node.fqdn do screen_item "System: Load Average" do resource_type :graph width 900 height 200 y 0 end screen_item "System: CPU Utilization" do resource_type :graph width 900 height 200 y 1 end screen_item "Memory: Triggers" do resource_type :graph width 900 height 200 y 2 endend

<-- создание screen<-- zabbix шаблон с базовыми проверками

<-- добавление хоста в мониторинг

Page 21: Истинный DevOps. Секрет 42

Мониторинг::Результат

Page 22: Истинный DevOps. Секрет 42

Вопросы

@ex_sample

@express42_ru

Хотите кусочек девопса[email protected]