Chef объявлен «Системой интеграции систем, созданной для того, чтобы использовать преимущества управления конфигурациями для всей вашей инфраструктуры». Неважно, сколько раз я это читаю, я все еще слышу свист над головой. Проще говоря, мы можем управлять конфигурациями сервера через старый добрый знакомый Ruby.
Суть Chef в том, что мы создаем кулинарные книги, эти кулинарные книги используют DSL Chef для установки и настройки пакетов, которые требуются для наших серверов. Сколько раз вы просматривали один и тот же учебник по установке и настройке чего-то вроде MySQL? С Chef у нас есть кулинарная книга под контролем исходного кода, которую мы можем поддерживать и использовать для раскрутки новой среды в кратчайшие сроки. Если вам когда-либо приходилось создавать свои собственные промежуточные и производственные среды и поддерживать согласованность по мере развития вашего приложения, это уже должно звучать как хорошие новости.
Шеф-повар поставляется в нескольких вкусов. Сегодня речь пойдет о Chef Solo, в отличие от Chef Server, Chef Solo работает со всем «на диске». Кулинарные книги и все остальное, что нам нужно (что мы рассмотрим через минуту), должны находиться на сервере, который мы настраиваем.
Основы шеф-повара Соло
Прежде чем идти дальше, вероятно, лучше всего установить компоненты, доступные нам при создании сценариев Chef, ранее мы называли это «всем, что нам нужно».
Рецепты для Ресурсов
Просто ресурс — это то, что мы пытаемся настроить на сервере. На примере MySQL мы напишем рецепт для этого ресурса. Рецепт написан на Ruby и устанавливает, как мы хотим сконфигурировать ресурс, используя синтаксис стиля блока.
package "mysql-client" do
package_name value_for_platform("default" => "mysql-client")
action :install
end
Приведенный выше источник является усеченным примером рецепта Opscode для MySQL . Хотя это имеет смысл читать как есть, вы можете задаться вопросом о методе value_for_platform
Он просто выбирает правильное имя пакета ресурса, который вы пытаетесь настроить, основываясь на платформе. Я сократил это для систем на основе Debian, но мы можем передать простой старый Ruby Hash, чтобы Chef использовал правильный пакет. Если вы еще не перешли к первоисточнику:
package_name value_for_platform(
[ "centos", "redhat", "suse", "fedora", "scientific", "amazon"] => { "default" => "mysql" },
"default" => "mysql-client"
)
Откуда Chef знает, на какой платформе мы работаем? Ответ на этот вопрос красиво ведет в Узлы.
Вершины
Узел — это наш сервер. Наша кулинарная книга рецептов применяется к узлу. Мы могли бы закончить это здесь, но недавно мне показалось удобным откинуть занавеску на Узлах.
Чтобы узнать все, что нужно знать о нашем узле / сервере, Chef использует гем с именем Ohai . Вы можете проверить, как шеф-повар делает это самостоятельно.
require 'ohai'
o = Ohai::System.new
o.all_plugins
puts o[:platform] # => "linuxmint"
Так же, как мама делала это
Этого вполне достаточно, теперь пришло время запачкать руки. Возьмите ваш любимый серверный дистрибутив (я собираюсь использовать Ubuntu на VirtualBox ). Я считаю, что VirtualBox отлично подходит для его функций моментальных снимков, позволяя нам протестировать запуск Chef и откатить его, если что-то пойдет не так.
Структура каталогов проекта довольно проста. У нас будет кулинарная книга, рецепты и файлы поддержки.
mkdir cookbooks cookbooks/main cookbooks/main/recipes
touch solo.rb cookbooks/main/recipes/default.rb node.json
Следующий шаг — открыть наш файл solo.rb
cookbook_path File.join(File.dirname(File.expand_path(__FILE__)), "cookbooks")
json_attribs File.join(File.dirname(File.expand_path(__FILE__)), "node.json")
Как вы, наверное, догадались, все, что мы делаем в первой строке — это рассказываем Chef, где найти наши кулинарные книги. Затем мы передаем местоположение node.json
json_attribs
В нашем файле node.json
Ранее я показал, что Chef создаст много информации о нашей среде. Некоторые из этих атрибутов могут быть перезаписаны нашими рецептами. Существует приоритет для этих атрибутов. В этом примере все, что передано в json_attribs
Настало время взглянуть на наш файл node.json
Одна вещь, которую мне нравится использовать, — это обычный временный каталог, это удобное место для загрузки пакетов, файлов и т. Д. Chef не дает нам этого, поэтому мы можем начать с добавления этого. Пока мы это делаем, нам лучше настроить наш основной рецепт. Это будет просто включать другие рецепты для нашего сервера, и станет хорошей отправной точкой, если нам понадобится добавить / удалить какие-либо рецепты.
{
"temp_dir":"/tmp",
"run_list":["recipe[main]"]
}
Теперь, когда у нас есть некоторые базовые настройки, давайте посмотрим, что мы хотим, чтобы наш шеф-повар выполнял. Для этого примера мы будем держать его довольно коротким и приятным. Уже есть множество кулинарных книг, чтобы вы могли получить хорошую отправную точку. Вместо этого мы рассмотрим установку пакета с использованием доступных кулинарных книг (Apache) и установим RVM .
Первая задача для apache — это просто скопировать существующую кулинарную книгу в наш каталог cookbooks
RVM, с другой стороны, нам придется сделать немного больше работы. Прежде всего, мы создаем каталог rvm
mkdir cookbooks/rvm cookbooks/rvm/recipes
touch cookbooks/rvm/default.rb
Если мы посмотрим на заметки о выпуске RVM, то увидим, что существует ряд зависимостей. Работа № 1 для нашего рецепта RVM состоит в том, чтобы встретить их.
%w(build-essential openssl libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-0 libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev ncurses-dev automake libtool bison subversion).each do |pkg|
package pkg
end
Я знаю, что некоторые из них уже могут быть в нашей системе, но мне нравится рассматривать каждый рецепт отдельно. Если пакет уже есть, что за эй? Используя метод package
Следующим шагом является установка самого RVM. Я предполагаю, что вы уже сделали это раньше и узнаете о замечательном установщике бина. Ну, Chef поддерживает такие установки, используя своего поставщика bash
Это по существу оценивает блок как команду bash.
bash "install RVM" do
user node[:user]
code "sudo bash < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer )"
end
Шеф-повар DSL просто замечателен, я настроил bash-скрипт для запуска в качестве текущего пользователя в системе и выполнил скрипт установки RVM. Не попадайтесь в ловушку выполнения этого от имени user "root"
Следуя документации RVM , есть разница.
Гарнир и Сезон
Теперь, когда у нас есть пара рецептов, пришло время отсортировать порядок выполнения и то, как мы получаем скрипт Chef на блок / узел. Первый прост: в cookbooks/main/recipes/default.rb
include_recipe "apache2"
include_recipe "rvm"
Это просто Ruby, поэтому мы можем добавлять новые поваренные книги, комментировать строки или все, что вы привыкли делать в своих файлах ruby. Теперь мы должны взглянуть на получение кода на интересующую нас коробку. Лучший способ, который я видел, это использовать скрипт bash. Первоначально на это указал мне мой уважаемый колледж Колин Геммелл , который выполнил основную часть работы над сценарием bash. Мне? Я просто немного подправил.
#!/bin/bash
sudo apt-get update
sudo apt-get install git-core -y -q
sudo apt-get install build-essential -y -q
sudo apt-get install ruby -y -q
sudo apt-get install ruby-dev -y -q
sudo apt-get install libopenssl-ruby -y -q
sudo apt-get install rubygems -y -q
sudo apt-get install irb -y -q
sudo apt-get install rake -y -q
sudo apt-get install curl -y -q
sudo gem install chef --no-ri --no-rdoc
git clone git://github.com/bangline/demo_cookbooks.git /tmp/chef_run
cd /tmp/chef_run
sudo /var/lib/gems/1.8/bin/chef-solo -c /tmp/chef_run/solo.rb -j /tmp/chef_run/node.json
Это довольно просто. Все зависимости, которые мне нужны, сначала настраиваются (отключены, поэтому я не спрашиваю «Это нормально? [Y / N]» для каждого пакета) перед тем, как клонировать проект и запустить на нем chef-solo
Скрипт Chef передается в конфигурации solo.rb
node.json
После того, как сценарий Chef завершен, тестирование легко. Для Apache просто wget http://127.0.0.1
Для RVM вам придется выйти и снова войти в систему, после чего rvm notes
Следующим шагом будет изменение этого рецепта для установки версии Ruby по умолчанию.
Завершение
Повар — огромная тема, и документация для нее улучшается с течением времени. Надеемся, что это введение даст вам достаточный стимул для того, чтобы начать каким-либо образом использовать Chef, когда вы подумываете о запуске какой-нибудь ручной системы. Нам еще многое предстоит решить, настроить пользователей, vhosts или даже установить Ruby по умолчанию для использования с RVM и установить Passenger или что-то подобное, так что у нас есть комплексное решение для размещения наших приложений. Если вы пойдете и протестируете демо (источник можно найти в обычном месте ), вы найдете несколько раздражающих предупреждений при перезапуске Apache. В этом нет ничего страшного, мы действительно должны были поработать с конфигурацией NameVirtualHost
Тем не менее, учитывая, что это была просто быстрая операция копирования / вставки, мы получили работающую настройку Apache2.
Самым большим ресурсом для меня было изучение существующих кулинарных книг от Opscode и 37Signals . Много работы было проделано для многих распространенных пакетов. В эти дни я изо всех сил пытаюсь найти ресурс, у которого нет кулинарной книги, доступной в той или иной форме, чтобы использовать «как есть» или минимальные настройки.
Поэтому в следующий раз, когда вы настраиваете среду для своих приложений, потратьте некоторое время на ее создание на локальном виртуальном хосте с использованием VirtualBox. Как и большинство вещей, это займет дополнительное время, это расстроит вас, но то, что вы в итоге получите с выплатами в десять раз. Кто еще голоден?