Порцию серверов пожалуйста, или как начать деплоить с Opscode Chef

    Большинство русских статей по (Opscode Chef), которые мне попадались, содержали выдержки из кукбука (cookbook) и рассказ «какая классная штука Шеф». И все. Мол, смотри как я могу! А что и как с ним делать — не понятно. На официальном сайте есть подробная вики. Но в ней, ИМХО, легко заблудиться. Простого руководства «как сделать элементарное чтобы работало» нашел только в виде видео, по мотивам которого родилась эта статья.

    Часть первая. Идеологическая. Зачем.


    Если у вас 5 серверов, сетапить их нужно крайне редко, то и пары рук хватит. Можно еще положить /etc в Git или SVN, обязательно делать регулярные бекапы и жить спокойно. Для автоматизации деплоев приложения подойдет то, чем лучше всего владеет админ, даже если это простой скрипт на bash/python/ruby, или capistrano/fabric/etc.
    Если машин больше десятка, к тому же похожих или одинаковых, то скриптами обходиться уже сложновато. Capistrano/fabric — дают некоторые удобства, параллельный запуск на нескольких серверах, но логику все же писать приходится самому. С ними удобно деплоить, особенно приложение на том же языке, но не конфигурировать или сетапить. Тут уже нужно либо свои «костыли» городить, либо, что проще, взять уже готовый.

    От Шефа я отпирался до последнего, пока не столкнулся со следующим. Пускай имеем n одинаковых серверов, а /etc у всех в одной ветке репозитория. Поменяли конфиг nginx. Нужно применить изменения на всех остальных машинах. Как? Например, взять dsh:
    dsh -r ssh -c -M -m node1 -m node2 -m nodeN -- 'cd /etc && sudo git pull'

    Сюда же, в принципе, можно дописать и "/etc/init.d/nginx reload" и обновлять все, везде и сразу. Но для продакшина это не годится. Да и локальным пользователям перебои не очень приятны. Ко всему прочему, там еще есть supervisor, postgres, mongodb и много других сервисов, с которыми та же история. Как минимум, придется сделать по скриптику для перезагрузки каждого. В общем, «костыли» получаются.
    А Шеф как раз для такого предназначен. Изменил конфиг, он рассеялся по всей ферме, нужные (и только нужные) сервисы перегрузились. Плюс абстракция от версии *nix, да и MS, вроде как, поддерживается. Для конфигов есть шаблоны, которые «собираются» в зависимости от параметров сервера. В общем, вкусного много. Кстати, на текущем проекте используются все сразу: пара скриптов на bash, fabric и Chef.
    Ближе к практике. Давайте с нуля напишем и задеплоим простой кукбук по установке nginx, заодно разберемся. Для начала понадобится тестовая машина с sudo. Инструкция рассчитана на Ubuntu 11.10, но должна подойти под любой *nix.

    2. Установка и конфигурирование


    Шеф написан на Ruby. А Ruby удобней ставить через Ruby Version Manager (RVM).
    На своей машине, из-под обычного пользователя:
    bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer)

    Далее перелогиниваемся, или открываем новый терминал (чтобы перезагрузился bash profile).
    rvm install 1.9.2
    rvm use 1.9.2 --default

    RVM ставит и себя, и руби в ~/.rvm если запускать не из-под root`a. Cистема не пачкается, да и удалить легко, если что.
    Ставим Chef solo. Можно и из пакетов ставить, но rubygems — более «родной», не зависящий от пакетного менеджера способ.
    gem install knife-solo

    Есть 3 конфигурации Chef:
    • Solo — дает возможность запускать кукбуки.
    • Server — центарилизированное хранилище кукбуков, данных о серверах, поиск по ним, веб-интерфейс.
    • Client — зупускается на управляемой машине.

    Конфигурируем:
    
    cd ~
    knife configure -r . --defaults
    

    3. Кухня, повареная книга и нож


    knife kitchen solodemo

    Создастся папка solodemo:
    
    cd solodemo
    tree
    .
    |-- cookbooks		- кукбуки. Подробнее ниже.
    |-- data_bags		- хранилище данных глобальных данных (например, пользователи, параметры конфигураций, различные общие настройки).
    |-- nodes		- информация о серверах (нодах).
    |-- roles		- роли. Фактически это группы кукбуков и параметров к ним. Например, Apache сервер, MySQL сервер.
    |-- site-cookbooks
    `-- solo.rb
    

    Это т.н. «кухня». Фактически, некое упрощенное подобие Chef Server, только на локальной файловой системе.

    Создадим кукбук для установки nginx.
    
    cd solodemo
    knife cookbook create nginx -o cookbooks
    

    Это тоже папка. Смотрим.
    
    cd cookbooks
    tree
    .
    |-- attributes
    |-- definitions
    |-- files
    |   `-- default
    |-- libraries
    |-- metadata.rb
    |-- providers
    |-- README.md
    |-- recipes - рецепты "что сделать". default.rb выполняется по умолчанию, если не указать другой. По 
    одному рецепту в файле.
    |   `-- default.rb
    |-- resources
    `-- templates - шаблоны в формате ERB.
        `-- default
    

    Recipe (рецепт) — скрипт, описывающий что должно быть выполнено. Поддерживается как Ruby, так и вставки на Bash, Perl, Python, csh.
    Ресиптов может быть несколько, но «default» выполняется, если не указать какой-то конкретно (при вызове кукбука).
    В recipes/default.rb добавляем
    package "nginx"

    Сохраняем.
    «Package» тут — это ресурс. Посмотреть список с описанием встроенных ресурсов можно на вики. Их можно дополнять и расширять прямо в кукбуках при необходимости. Язык, на которых пишутся ресипты — Ruby DSL. Логика построена от обратного. Мы просто говорим, что на сервере должен быть установлен пакет «nginx». А Chef следит чтобы так и было делая что требуется. В принципе, то же самое можно описать на любом другом языке. Но тут много удобных вещей, что называется, «из коробки». Конечно, есть нюансы. Например, с пакетами, важно верно задать имя. Так, для apache нужно уже писать условие, т.к. в RPM-based дистрибутивах это httpd, в Debian — apache2.
    Далее, заходим на тестовый сервер и выставляем hostname. Это важно, т.к. Chef различает ноды именно по нему.
    hostname testserver.example.com
    echo "testserver.example.com" > /etc/hostname

    и в /etc/hosts добавляем
    10.10.10.10 testserver.example.com

    Проверяем:
    hostname -f

    Если в ответ «testserver.example.com» — все нормально. Нет — правим /etc/hosts.
    Теперь, с локальной машины из папки solodemo:
    
    knife prepare ubuntu@testserver.example.com
    

    Придется немного подождать и, возможно, ввести пароль для sudo. «Prepare» установит chef-client, который бкдет принимать команды.
    В папке nodes должен появиться файлик вида testserver.example.com.json. Пишем в него:
    { "run_list": ["recipe[nginx]"] }
    

    То есть, нужно запустить кукбук «nginx», а точнее, рецепт «default» из него.
    Потом
    
    knife cook ubuntu@testserver.example.com
    
    Все.

    Выводы


    Да, плясок вокруг одного nginx'а — много. Но на тривиальные задачи есть кукбуки, при чем достаточно гибкие и продуманные. А для нетривиальных — раз написанный кукбук позволяет установку полностью автоматизировать, и является своего рода документацией. На то чтобы разобраться и описать установку первого сервера я потратил неделю, зато установка «с нуля» занимает теперь минут 20. Часто ли такое надо? Пока нет. Но конфигурировать теперь — одно удовольствие. А если все равно писать документацию, так почему не делать это сразу на Chef? Да и заказчик может поднять и «пощупать» все на своей виртуалке с помощью пары команд.
    Я решил не перегружать статью информацией. Это все-таки больше руководство. Но термины сделаны ссылками, чтобы кому интересно — легко нашел.

    Ссылки


    Share post

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 15

      +1
      Хотелось бы увидеть сравнение Chef vs Puppet на данном этапе их развития.
        +2
        Различие принципиальное. Puppet — «что ты хочешь сделать?», chef — «что ты хочешь получить?». К примеру, лично мне пока ближе puppet =)
          0
          Хм, интересная мысль. Возможно вы правы.
          Да, ближе-то мне тоже puppet, но тем не менее некоторое обзорное сравнение я был бы не проч прочесть.
            0
            ЕМНИП, это как раз различие парадигм управления. Хотя, в случае с puppet немного нестандартная конфигурация заставляет попотеть.
            0
            Puppet — «что ты хочешь сделать?», chef — «что ты хочешь получить?», а juju — что такое?
              0
              Пока что не рассматривал, хотя Ubuntu MAAS определённо, заслуживает рассмотрения.
            0
            Поясню — просто мне гораздо проще объяснить тупой машине, что надо делать, вместо того, чтобы она решала это сама по непонятным алгоритмам и в нестандартном окружении.
            0
            У chef knife-ec2 мягко говоря скудноват.
              0
              Плагины knife для работы с облачными провайдерами, реализованы как обёртки над библиотекой fog, которая для конкретного провайдера может иметь более обширный функционал.

              Также, стоит отметить, что плагин knife-clodo постоянно совершенствуется и мы готовы рассматривать пожелания пользователей, касательно его функциональности.
              –1
              Сам не люблю «языкосрач», но «ресипт» это за гранью добра и зла. Есть же русское «рецепт», ну ладно, не нравится — возьми английское «рисайп». Ну ладно, не сложилось с произношением — ну «рисип». Но «Т» там откуда?!!!
              Какой ресипт?!!!
                0
                [resə‚pɪ], умник.
                  0
                  плюсадин, «ресипты» глаза режут.
                  0
                  Chef хорошо подходит для конфигурации большого количества идентичных серверов. А в связке с knife bootstrap и ssh-ключа можно делать из сервера конфетку одной командой. Так же в нем роли — наборы рецептов и других ролей — с помощью которых можно просто создавать высокоуровневые сущности. Например, можно создать роль frontend, на которую поставится nginx, пропишутся нужные хосты и fastcgi-pass'ы на бэкэнды, заданные ролью backend.

                  Неудобна тонкая кастомизация, когда вот эти 50 серверов надо сконфигурировать одинаково, а вот каждый из этих 10 — немного по другому. Количество атрибутов и if'ов в рецептах начинает расти как на дрожжах в таких случаях.

                  Но, в общем, я доволен chef'ом — нынешней базой в 50 рецептов окружение для разработки/тестирования разворачивается за 6-7 минут.
                    0
                    Простая, понятная и актуальная статья. Большое спасибо!
                      0
                      При установке

                      rvm install 1.9.2

                      ругалось на нехватку OpenSSL
                      ставил следующей командой

                      rvm install 1.9.2 --with-openssl-dir=$HOME/.rvm/usr
                      

                      Only users with full accounts can post comments. Log in, please.