Статьи

Готовим с шеф-поваром Соло

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.jsonjson_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.rbnode.json

После того, как сценарий Chef завершен, тестирование легко. Для Apache просто wget http://127.0.0.1 Для RVM вам придется выйти и снова войти в систему, после чего rvm notes Следующим шагом будет изменение этого рецепта для установки версии Ruby по умолчанию.

Завершение

Повар — огромная тема, и документация для нее улучшается с течением времени. Надеемся, что это введение даст вам достаточный стимул для того, чтобы начать каким-либо образом использовать Chef, когда вы подумываете о запуске какой-нибудь ручной системы. Нам еще многое предстоит решить, настроить пользователей, vhosts или даже установить Ruby по умолчанию для использования с RVM и установить Passenger или что-то подобное, так что у нас есть комплексное решение для размещения наших приложений. Если вы пойдете и протестируете демо (источник можно найти в обычном месте ), вы найдете несколько раздражающих предупреждений при перезапуске Apache. В этом нет ничего страшного, мы действительно должны были поработать с конфигурацией NameVirtualHost Тем не менее, учитывая, что это была просто быстрая операция копирования / вставки, мы получили работающую настройку Apache2.

Самым большим ресурсом для меня было изучение существующих кулинарных книг от Opscode и 37Signals . Много работы было проделано для многих распространенных пакетов. В эти дни я изо всех сил пытаюсь найти ресурс, у которого нет кулинарной книги, доступной в той или иной форме, чтобы использовать «как есть» или минимальные настройки.

Поэтому в следующий раз, когда вы настраиваете среду для своих приложений, потратьте некоторое время на ее создание на локальном виртуальном хосте с использованием VirtualBox. Как и большинство вещей, это займет дополнительное время, это расстроит вас, но то, что вы в итоге получите с выплатами в десять раз. Кто еще голоден?