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

778 views

Published on

Published in: Technology
  • Be the first to comment

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

  1. 1. Истиный DevOps. Секрет Никита Борзых, Express
  2. 2. Клиент Сервер как произведение искусства Утеря знаний вместе с админомДва вечера, чтобы узнать почему ничего не работаетЕще два вечера, чтобы понять как с этим дальше жить Мониторинг присылает 100 email в день
  3. 3. Управление конфигурацией Весь опыт системного администратора в git репоВся информация о компонентах есть в git репо Мониторинг как код =) Без рук!
  4. 4. Chef Workflow 1 клиент – 1 git репозиторий Логическое деление кукбуков на слои Chef-solo для локального развертывания 1 окружение – 1  chef serverРазвертывание  проекта  локально  –  три  команды: bundle install, librarian-chef install, vagrant up
  5. 5. Слои кукбуков Base Services Applications
  6. 6. Слой base lvm, sysctl, apt, ssh ... Выполняется на всех серверах Сожержит кукбук с chef libraries# 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
  7. 7. Слой service redis, postgresql, nginx ... Содержит кукбуки сервиcов, которые нужны для приложенияLWRP вызывается из кукбуков приложений# Setup redis main databaseredis "main" do configuration( :bind => "0.0.0.0", :maxclients => 256 )end
  8. 8. Слой 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_directoryendlisten_address = net_get_private_ip()# Setup redis main databaseredis "main" do configuration( :bind => listen_address, :maxclients => 256 )end...
  9. 9. РепозиторийCheffile <-- используемые в проекте кукбукиCheffile.lockGemfile <-- гемы для запуска проектаGemfile.lockVagrantfilecookbooks <-- результат работы librariandata_bagsenvironmentsinhouse-cookbooks <-- кукбуки проектаroles
  10. 10. Управление репозиторием Librarian Berkshelf Могут интегрироваться с vagrant Управляют зависимостями like a pro bundlerРезультатом работы является директория с Самостоятельно заливает кукбуки на chef- актуальными версиями кукбуков. server Что и когда заливать решаете вы управляет только кукбуками
  11. 11. Забивай молотком, руби топором. librarian-chef installknife cookbook upload -a
  12. 12. Chef Solo Развертывание проекта локально занимает минимум времени и усилийКлиент может поднять свой проект без боли Приходится тестировать проект в chef-client и chef-solo
  13. 13. Chef Solo Node search in solo modeif 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 Databag search in solo mode https://github.com/edelight/chef-solo-search
  14. 14. Bugs in solo mode
  15. 15. Роли это боль Не версионируются, неотделимы от кукбука Проблемы с распространением кукбуковБоль почти не чувствуется, если в одном chef сервере одно окружение Альтернативный путь: role cookbooks
  16. 16. Role cookbooks roles/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 ] ...
  17. 17. Окружения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 } } } )
  18. 18. Мониторинг Собираются базовые(io,net,os) метрики Графики по всем метрикамПриложение присылает данные через zabbix trapper Сервер добавляется в мониторинг после первого chef-run
  19. 19. Мониторинг::Примерzabbix_connect "connect to zabbix" do apiurl "http://<zabbix-server>/api_jsonrpc.php" databag "zabbix"endzabbix_host node.fqdn do <-- добавление хоста в мониторинг host_group "Rails-backend" use_ip true ip_address net_get_private_ip(node)endzabbix_template Linux_Template <-- zabbix шаблон с базовыми проверкамиzabbix_screen node.fqdn do <-- создание screen 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
  20. 20. Мониторинг::Результат
  21. 21. Вопросы @express42_ru @ex_sampleХотите кусочек девопса?input@express42.com

×