Pull to refresh
Southbridge
Обеспечиваем стабильную работу highload-проектов

Chef для новичков

Southbridge corporate blog
Tutorial
На тему систем централизованного управления конфигурациями на Хабре написано немало статей и, в частности, про Chef есть несколько хороших статей. Однако, количество релизов Chef растет, и я решил немного освежить его описание для читателей Хабра. Статья предназначена как для новичков, так и для тех, кто уже знакомился с системой, но по какой-то причине отложил изучение и хочет все-таки продолжить. А продолжать стоит! Поскольку, Chef полезен и для администрирования нескольких VPS, и для управления большим парком серверов. Особенно, если вам часто приходится заниматься настройкой серверов с нуля, подключением дополнительных нод в кластер и т.д.

Теория


Без теоретических основ никуда. В первую очередь стоит сказать, что Chef, как и Puppet, изначально написан на Ruby, и будет плюсом, если вы уже владеете этим языком. Если же нет, то стоит изучить хотя бы азы. Начать можно со статьи “Just Enough Ruby for Chef”. Ее действительно будет вполне достаточно для понимания основ языка.
В официальном вики можно найти всю необходимую информацию для начала изучения Chef (в документации делается упор на описание платных продуктов компании — Enterprise Chef и Hosted Chef, я буду говорить про Open Source Chef).
В первую очередь стоит посмотреть обзор архитектуры и разобраться с основными понятиями. Попробую кратко их описать.

Инфраструктура

  • Nodes (Ноды) — это любой, ваш сервер, физический либо виртуальный, который вы будете настраивать с помощью Chef.
  • The Server (Chef-сервер) — непосредственно сам Chef-сервер к которому обращаются клиенты (Nodes), сервер состоит из нескольких компонентов:
  • Web-UI — приложение на RoR представляющее собой веб-интерфейс для сервера;
  • Erchef — ядро сервера, начиная с Chef 11.x написано, Erlang, полностью совместимо с прежней версией на Ruby;
  • Bookshelf — хранилище для “поваренных книг”;
  • Nginx — идет в комплекте, все API-запросы проходят через него;
  • PostgreSQL — также включен в состав Chef-сервера, очевидно выполняет роль хранилища информации.
  • Workstations (рабочая станция) — рабочее место администратора Chef, т.е. ваш ПК на котором вы будет подготавливать рецепты, поваренные книги и управлять всей кухней с помощью knife.
  • Knife — какой шеф-повар без ножа? Knife это основной инструмент для работы с Chef из консоли. Именно с помощью “ножа“ вы будете управлять нодами и Chef-сервером.

Подготовка рецептов

  • Чтобы уверенно начать готовить рецепты необходимо четко понимать все термины и определения:
  • Сookbook (поваренная книга) — хранилище атрибутов, рецептов, шаблонов и файлов.
  • Attribute (аттрибуты) — некие параметры конфигураций которые вы можете задавать для нод как через рецепты, так и через роли, рекомендую ознакомится с порядком применения атрибутов здесь.
  • Templates (шаблоны конфигов) — вы можете распространять конфигурации как обычными файлами так параметризированными erb-шаблонами. Значения параметров шаблона в определенном порядке подставляются из атрибутов поваренных книг либо из ролей.
  • Files — любые файлы, которые вы сможете распространять с помощью рецептов предварительно описав их путь назначения и права.
  • Definitions (определения) — используются для описания новых или существующих ресурсов (напрмер служба, или виртуальный хост apache) и/или действий над ними.
  • Libraries (библиотеки) — ни что иное как вставки кода на Ruby, в качестве расширений для рецептов.
  • Resources (ресурсы) — ресурс это любой объект системы — файл, пользователь, группа, сервис и пр.

Если с теорией более или менее понятно, то можно начинать приступать к практике.

Практика


Установка Chef сервера

На сайте Get Chef выбираем актуальную версию Chef Server для вашего дистрибутива.
Я буду устанавливать сервер на CentOS 6.5, а рабочую станцию администратора буду настраивать на примере Ubuntu 12.04:
Сервер должен иметь “полное имя домена” (FQDN):
т.е. в /etc/hostname должна быть запись вида: chef.example.ru
Установку производим от пользователя с правами root.
rpm -Uvh https://opscode-omnibus-packages.s3.amazonaws.com/el/6/x86_64/chef-server-11.0.10-1.el6.x86_64.rpm
Далее нужно выполнить первоначальное конфигурирование сервера:
chef-server-ctl reconfigure
Эта команда настоит все необходимые компоненты для работы Chef сервера (Erchef, RabbitMQ, nginx, PostgreSQL)
После того как все настроено, можно зайти на страницу веб-интерфейса Chef Server.
В правой колонке вы увидите имя пользователя и пароль по умолчанию: admin: p@ssw0rd1.
Пароль меняем во вкладке “Users”, также перегенерируем приватный ключ (ключ нужно обязательно сохранить себе и затем на сервер по умолчанию он нигде не сохраняется):

Далее перейдите во вкладку “Clients”, здесь нужно перегенирить ключ для chef-validator (его тоже в обязательно порядке сохранить куда-нибудь себе и на сервер, позже он понадобится)

Установка Chef Client (Knife) на рабочее место администратора

Установку можно произвести одной командой:
curl -L https://www.opscode.com/chef/install.sh | sudo bash
Либо скачать deb или rpm пакет и установить его вручную.
Для работы с “поваренными книгами” нам понадобится консольный клиент git:
apt-get install git
Также нужно иметь Ruby версии => 1.9.1. Для Ubuntu 12.04 ставится так:
apt-get install ruby1.9.1
Склонируем себе в домашнюю директорию разметку репозитория для Chef:
git clone git://github.com/opscode/chef-repo.git
Чтобы иметь возможность управлять нодами ролями и пр. с помощью knife со своего рабочего места, потребуется два ключа:
  • chef-validator.pem приватный ключ chef сервера (используется клиентами для авторизации API-запросов к серверу)
  • user.pem ваш приватный ключ для авторизации на сервере.
Их нужно скопировать в директорию где вы будете хранить кукбуки, например:
~/chef-repo/.chef/
Настройка knife выполняется командой:
knife configure -i
здесь, нужно будет указать путь до приватных ключей, а также путь до директории с кукбуками. Файл конфигурации knife также будет находиться в директории ~/chef-repo/.chef/ и выглядеть будет примерно так:
cat  /home/it/chef-repo/.chef/knife.rb
log_level                :info
log_location             STDOUT
node_name                'it'
client_key               '/root/Chef/chef-repo/.chef/it.pem'
validation_client_name   'chef-validator'
validation_key           '/home/it/chef-repo/.chef/chef-validator.pem'
chef_server_url          'https://chef.example.ru:443'
syntax_check_cache_path  '/home/it/chef-repo/.chef/syntax_check_cache'
cookbook_path [ '/home/it/chef-repo/cookbooks', '/home/it/chef-repo/example' ] # Список директорий с кукбуками
knife[:editor] = 'vim' # Редактор для knife
Проверим работоспособность knife:
knife client list
все команды нужно выполнять из директории или поддиректорий вашего локального репозитория Chef.

Подключим первый сервер с помощью knife

Для этого используется команда knife bootstrap, которая устанавливает chef-клиента, создает нового пользователя на сервере и генерирует ключи:
knife bootstrap test.example.ru
в общем случае происходит подключение к хосту по ssh от имени root, но если доступ для root ограничен, то нужно указать пользователя с админскими (sudo) правами:
knife bootstrap test.example.ru --sudo -x admin -P Password
Проверим что сервер попал в список нод:
knife node list
test.example.ru

Применим первый кукбук

Итак, у нас подключена первая нода. Теперь мы можем инсталлировать на нее софт и менять его конфигурацию с помощью Chef. Но прежде нам нужно написать свой первый кукбук, либо взять готовый из репо Opscode на github. Второго варианта для начала будет вполне достаточно.
Перейдем в директорию где у нас должны лежать кукбуки
cd ~/chef-repo/cookbooks
и склонируем сюда первый кукбук, например для chef-client:
git clone https://github.com/opscode-cookbooks/chef-client.git
Если мы заглянем в metadata.rb, то увидим список зависимостей для данного кукбука:
suggests 'bluepill'
suggests 'daemontools'
suggests 'runit'
depends 'cron', '>= 1.2.0'
depends 'logrotate', '>= 1.2.0'
их тоже придется склонировать себе, а затем на сервер.
Чтобы применять рецепты из данного кукбука, нужно предварительно закачать его сервер вместе со всеми зависимостями:
knife cookbook upload bluepill daemontools runit cron logrotate chef-client
Теперь мы можем добавить рецепт chef-client для нашей тестовой ноды и изменить период обращения клиента к серверу:
knife node edit test.example.ru
Конфигурация ноды представлена в json-формате. Пропишем период обращения ноды к серверу и добавим рецепт chef-client в run list:
{
  "name": "test.example.ru",
  "chef_environment": "_default",
  "normal": {
    "chef_client": {
      "interval": "300"
    },
    "tags": [

    ]
  },
  "run_list": [
    "recipe[chef-client]"
  ]
}

Напишем свой первый кукбук

Сделаем свой кукбук для тестовых рецептов:
knife cookbook create test
Добавим в рецепт “по умолчанию” директиву для установки списка пакетов, которые мы будем распространять на все наши серверы:
vim ~/chef-repo/cookbooks/test/recipes/default.rb
%w{ntp mc htop iotop iftop atop vim-common wget curl rkhunter git awstats postfix}.each do |packages|
    package packages do
    action :install
    end
end
Осталось только закачать кукбук на сервер и прописать его в run-list (список исполняемых рецептов) ноды, а лучше сделать роль и включить туда этот рецепт. Но вот незадача, нужен ведь еще репозиторий epel, как минимум. Можно положить файл конфига в кукбук и дописать в рецепт копирование конфига в yum.repos.d, либо воспользоваться кукбуком yum от opscode:
git clone https://github.com/opscode-cookbooks/yum.git
Также, скачаем кукбук yum-epel (почему-то в последнем релизе решили выделить рецепты с основными репами в отдельные кукбуки):
git clone https://github.com/opscode-cookbooks/yum-epel.git
Закачаем книги на сервер:
knife cookbook upload yum yum-epel
Теперь можем включить рецепт yum-epel в наш тестовый рецепт:
vim ~/chef-repo/cookbooks/test/recipes/default.rb
include_recipe “yum-epel”

%w{ntp mc htop iotop iftop atop vim nano wget curl rkhunter git awstats postfix}.each do |packages|
    package packages do
    action :install
    end
end
Также можем прописать в атрибутах нашего кукбука исключения пакетов для epel-repo:
vim ~/chef-repo/cookbooks/test/attributes/default.rb
default['yum']['epel']['exclude'] = “test*”
Закачаем кукбук на сервер и применим рецепт на ноде:
knife cookbook upload test

knife node edit test.example.ru
{
  "name": "test.example.ru",
  "chef_environment": "_default",
  "normal": {
    "chef_client": {
      "interval": "300"
    },
    "tags": [

    ]
  },
  "run_list": [
    "recipe[chef-client]",
    “recipe[test]”
  ]
}

knife ssh name:test.example.ru "chef-client" -P r00tPassworD

Итак, вы получили первый опыт использования Chef. Теперь, я думаю стало ясно, что все не так уж сложно, как казалось. Главное не останавливаться на этом. Прочтите еще несколько статей, попробуйте применить рецепты из репозитория Opscode. Напишите пару своих рецептов, примените их. Переведите описание своей серверной инфраструктуры на язык Chef. Пускай у вас уйдет на это несколько дней или ночей, за то потом скорость развертывания серверов будет на порядок выше, а досадных ошибок станет меньше. И помните, лучший способ изучить Chef — начать его использовать.

Полезные статьи:

Официальный Chef-вики
Сборник «поваренных книг» от Opscode
Arrays and Chef Attributes
Chef 11 In-Depth: Attributes Changes
Breaking Changes in Chef 11
Первый опыт в качестве шеф-повара, или управление конфигурацией
Chef или как управлять тысячей серверов
Порцию серверов пожалуйста, или как начать деплоить с Opscode Chef
Целый сайт для новичков: Getting started with Chef
Цикл статей от Алексея Васильева (к сожалению только на английском): Getting Started with Chef Solo
Tags:
Hubs:
Total votes 37: ↑30 and ↓7 +23
Views 69K
Comments Comments 13

Information

Founded
Location
Россия
Website
southbridge.io
Employees
51–100 employees
Registered
Representative
Антон Скобин