Истинный devops. Секрет 42
Post on 14-Jun-2015
547 Views
Preview:
TRANSCRIPT
Истиный DevOps.
Никита Борзых, Express
Секрет
Клиент
Сервер как произведение искусства
Утеря знаний вместе с админом
Два вечера, чтобы узнать почему ничего не работает
Еще два вечера, чтобы понять как с этим дальше жить
Мониторинг присылает 100 email в день
Управление конфигурацией
Весь опыт системного администратора в git репо
Вся информация о компонентах есть в git репо
Мониторинг как код =)
Без рук!
Chef Workflow
1 клиент – 1 git репозиторий
Логическое деление кукбуков на слои
Chef-solo для локального развертывания
Развертывание проекта локально – три команды:
bundle install, librarian-chef install, vagrant up
1 окружение – 1 chef server
Слои кукбуков
Base
Services
Applications
Слой 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
Выполняется на всех серверах
Слой service
redis, postgresql, nginx ...
# Setup redis main databaseredis "main" do configuration( :bind => "0.0.0.0", :maxclients => 256 )end
Содержит кукбуки сервиcов, которые нужны для приложения
LWRP вызывается из кукбуков приложений
Слой 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
...
Репозиторий
CheffileCheffile.lockGemfileGemfile.lockVagrantfilecookbooksdata_bagsenvironmentsinhouse-cookbooksroles
<-- результат работы librarian
<-- кукбуки проекта
<-- гемы для запуска проекта
<-- используемые в проекте кукбуки
Управление репозиторием
Librarian Berkshelf
Управляют зависимостями like a pro bundler
Самостоятельно заливает кукбуки на chef-server
Могут интегрироваться с vagrant
Результатом работы является директория с актуальными версиями кукбуков.
управляет только кукбукамиЧто и когда заливать решаете вы
Забивай молотком,руби топором.
librarian-chef installknife cookbook upload -a
Chef Solo
Приходится тестировать проект в chef-client и chef-solo
Развертывание проекта локально занимаетминимум времени и усилий
Клиент может поднять свой проект без боли
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
Bugs in solo mode
Роли это больНе версионируются,неотделимы от кукбука
Боль почти не чувствуется, если в одном chef сервереодно окружение
Проблемы с распространением кукбуков
Альтернативный путь: role cookbooks
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' ]...
Окружения
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 } } })
Мониторинг
Собираются базовые(io,net,os) метрики
Приложение присылает данные через zabbix trapper
Сервер добавляется в мониторинг после первого chef-run
Графики по всем метрикам
Мониторинг::Пример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 шаблон с базовыми проверками
<-- добавление хоста в мониторинг
Мониторинг::Результат
Вопросы
@ex_sample
@express42_ru
Хотите кусочек девопса?input@express42.com
top related