3. Клиент
Сервер как произведение искусства
Утеря знаний вместе с админом
Два вечера, чтобы узнать почему ничего не работает
Еще два вечера, чтобы понять как с этим дальше жить
Мониторинг присылает 100 email в день
4. Управление
конфигурацией
Весь опыт системного администратора
в git репо
Вся информация о компонентах есть в git репо
Мониторинг как код =)
Без рук!
5. Chef Workflow
1 клиент – 1 git репозиторий
Логическое деление кукбуков на слои
Chef-solo для локального развертывания
1 окружение – 1
chef server
Развертывание
проекта
локально
–
три
команды:
bundle install, librarian-chef install, vagrant up
7. Слой base
lvm, sysctl, apt, ssh ...
Выполняется на всех серверах
Сожержит кукбук с chef libraries
# Add express42 public web repository
apt_repository "express42-web" do
action :add
uri "http://repos.express42.com/web/precise/ ./"
key "http://repos.express42.com/web/precise/Release.key"
end
8. Слой service
redis, postgresql, nginx ...
Содержит кукбуки сервиcов, которые
нужны для приложения
LWRP вызывается из кукбуков приложений
# Setup redis main database
redis "main" do
configuration(
:bind => "0.0.0.0",
:maxclients => 256
)
end
9. Слой Application
app::redis, app::backend ...
# Add express42 public web repository
apt_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 application
partition redis_lvolume_name do
group lvm_group
size lvolume_size
filesystem 'ext4'
mount_point railsapp_application_directory
end
listen_address = net_get_private_ip()
# Setup redis main database
redis "main" do
configuration(
:bind => listen_address,
:maxclients => 256
)
end
...
10. Репозиторий
Cheffile <-- используемые в проекте кукбуки
Cheffile.lock
Gemfile <-- гемы для запуска проекта
Gemfile.lock
Vagrantfile
cookbooks <-- результат работы librarian
data_bags
environments
inhouse-cookbooks <-- кукбуки проекта
roles
11. Управление
репозиторием
Librarian Berkshelf
Могут интегрироваться с vagrant
Управляют зависимостями like a pro bundler
Результатом работы является директория с Самостоятельно заливает кукбуки на chef-
актуальными версиями кукбуков. server
Что и когда заливать решаете вы управляет только кукбуками
13. Chef Solo
Развертывание проекта локально занимает
минимум времени и усилий
Клиент может поднять свой проект без боли
Приходится тестировать проект в
chef-client и chef-solo
14. Chef Solo
Node search in solo mode
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
Databag search in solo mode
https://github.com/edelight/chef-solo-search
16. Роли это боль
Не версионируются,
неотделимы от кукбука
Проблемы с распространением кукбуков
Боль почти не чувствуется, если в одном chef сервере
одно окружение
Альтернативный путь: role cookbooks
17. 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' ]
...
18. Окружения
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
}
}
}
)
19. Мониторинг
Собираются базовые(io,net,os) метрики
Графики по всем метрикам
Приложение присылает данные через zabbix trapper
Сервер добавляется в мониторинг после первого
chef-run
20. Мониторинг::Пример
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 шаблон с базовыми проверками
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
end
end