Создание кукбука Chef для управления инфраструктурой Ubuntu

Chef – это система управления конфигурациями, которая позволяет автоматизировать оркестровку и настройку большого количества машин.

В предыдущем руководстве вы ознакомились с основными терминами Chef. Данное руководство поможет создать кукбук – набор рецептов и других файлов, организованный заранее определенным образом, который облегчает совместное и повторное использование отдельных частей оркестровки. Вы научитесь создавать кукбуки и запускать их на отдельных нодах кластера Chef.

Предполагается, что для работы вы используете инфраструктуру, описанную в руководстве Установка сервера, рабочей станции и клиента Chef.

Основы написания кукбуков

Кукбук – это основной компонент конфигурации, с помощью которого Chef приводит ноду в определенное состояние. По сути, Chef использует кукбуки для выполнения задач и настройки нод.

Обычно кукбуки используются для обработки одного конкретного сервиса, приложения или функции. К примеру, вы можете создать кукбук для NTP, который будет синхронизировать время на всех нодах.

Кукбуки создаются на рабочей станции, а потом загружаются на сервер Chef. Сервер Chef передаёт рецепты и политики, описанные в кукбуке, в списки определённых нод. Такие списки содержат рецепты и роли, которые запускает клиент Chef, чтобы привести ноду в указанное состояние.

Таким образом все конфигурации, внесённые в кукбук, применяются к ноде.

Кукбук представляет собой полностью автономную структуру каталогов, которая содержит много различных каталогов и файлов, которые используются для различных целей. Рассмотрим некоторые из наиболее важных из них.

Рецепты

Кукбук может содержать множество рецептов или зависеть от сторонних рецептов. Рецепт – это файл, в котором хранится определение ресурсов оркестровки.

Ресурс – это фрагмент кода, который определяет необходимые системе изменения; например, ресурс может сообщить о необходимости установить какой-либо пакет, запустить сервис и т.п.

Рецепт – это список связанных между собой ресурсов, который сообщает Chef, как именно должна выглядеть система. Когда Chef запускает рецепт, он проверяет каждый ресурс на совместимость с текущим состоянием системы. Если система отвечает одному ресурсу рецепта, Chef переходит к следующему ресурсу. Если состояние системы не соответствует описанному ресурсом состоянию, Chef исправляет это.

Существует множество типов ресурсов. Самые распространённые типы:

  • package (управляет пакетами).
  • service (управляет сервисами ноды).
  • user (управляет пользователями).
  • group (управляет группами).
  • template (управляет встроенными шаблонами ruby).
  • cookbook_file (передаёт файлы из подкаталога кукбука в каталог ноды).
  • file (управляет содержимым файлов на ноде).
  • directory (управляет каталогами).
  • execute (выполняет команду на ноде).
  • cron (редактирует текущий cron-файл ноды).

Атрибуты

Атрибуты представляют данные о ноде (в виде пар «ключ-значение»).

Существует несколько типов атрибутов, каждый из которых имеет индивидуальный уровень приоритета. На уровне кукбука обычно определяются атрибуты сервиса или системы по умолчанию. Атрибуты с более высоким уровнем приоритета могут переопределить атрибуты с более низким уровнем.

Файлы

Подкаталог files содержит статические файлы, которые нужно поместить на ноду, которая использует данный кукбук.

Это могут быть простые конфигурационные файлы, содержимое которых не нужно корректировать. Рецепт может объявить ресурс, который переместит эти файлы на ноду.

Шаблоны

Шаблоны работают по тому же принципу, что и файлы, но они не статичны. Файлы шаблонов имеют расширение .erb (embedded Ruby).

Шаблоны обычно используются в конфигурационных файлах и позволяют добавлять переменные и другие функции, которые делают эти файлы более универсальными и обеспечивают их повторное выполнение. Chef использует шаблоны Embedded Ruby (ERB), которые поддерживают условные выражения, циклы и другие функции Ruby.

К примеру, если у вас есть атрибут, который определяет порт сервиса, шаблон может вставить этот атрибут в определение порта.

Файл metadata.rb

Файл metadata.rb управляет метаданными пакета (содержит имя пакета, его описание и т.п.).

В этом файле хранятся сведения о зависимостях (здесь вы можете выстроить зависимости между кукбуками). Это позволяет Chef выстраивать списки задач на нодах и правильно передавать все компоненты.

Создание простого кукбука

Для начала перейдите в каталог ~/chef-repo на рабочей станции.

cd ~/chef-repo

Создайте кукбук с помощью knife.

Примечание: knife – основной инструмент для взаимодействия с системой Chef.

Базовый синтаксис выглядит так:

knife cookbook create cookbook_name

Кукбук будет предназначен для установки и настройки Nginx, потому он будет называться nginx.

knife cookbook create nginx
** Creating cookbook nginx
** Creating README for cookbook: nginx
** Creating CHANGELOG for cookbook: nginx
** Creating metadata for cookbook: nginx

Команда knife построит в каталоге cookbooks простую структуру нового кукбука. Чтобы просмотреть её, откройте каталог cookbooks и найдите нужный кукбук:

cd cookbooks/nginx
ls
attributes  CHANGELOG.md  definitions  files  libraries  metadata.rb  providers  README.md  recipes  resources  templates

Теперь у вас есть структура каталогов и файлов, с помощью которой можно построить кукбук.

Создание рецепта

Откройте каталог recipes. Он содержит файл default.rb.

cd recipes
ls
default.rb

Это рецепт, который будет запущен, есл ивы сошлётесь на рецепт nginx. В этот файл нужно добавить весь код.

Откройте файл:

nano default.rb
#
# Cookbook Name:: nginx
# Recipe:: default
#
# Copyright 2014, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#

На данный момент в файле находятся только закомментированные заголовки.

Спланируйте задачи, которые нужно выполнить на ноде, чтобы установить на неё веб-сервер Nginx. Для этого используются ресурсы. Они не описывают, как выполнить ту или иную задачу; они просто описывают, как должна выглядеть система.

Во-первых, нужно добавить код для установки пакета. Это делается с помощью ресурса package.

package 'nginx' do
action :install
end

Этот маленький фрагмент кода определяет ресурс для Nginx. Первая строка задаёт тип ресурса (package) и имя пакета (nginx). Далее следует группа действий и параметров для этого пакета.

Строка action :instal установит заданный ранее ресурс. Нода, на которой запущен этот рецепт, проверит, установлен ли веб-сервер Nginx. Если он установлен, действие не будет выполнено. Если Nginx не установлен, нода установит его.

После установки сервиса нужно запустить его. В Ubuntu после установки сервер Nginx не запускается автоматически.

service 'nginx' do
action [ :enable, :start ] end

Теперь был использован тип ресурса service для пакета ‘nginx’. Он запустит сервис и настроит его автозапуск.

Последний ресурс объявит файл, который нужно обслужить.

cookbook_file "/usr/share/nginx/www/index.html" do
source "index.html"
mode "0644"
end

Ресурс cookbook_file сообщает Chef, что этот файл доступен в кукбуке и его можно передать на ноду. В данном случае файл будет передан в document root веб-сервера Nginx.

В первой строке содержится имя файла, который нужно создать. В строке source находится имя файла, который нужно найти в кукбуке. Chef ищет файлы в каталоге files/default.

Строка mode устанавливает права доступа к файлу. В данном случае пользователь root имеет право на чтение и запись, а все остальные пользователи – право на чтение.

Сохраните и закройте файл.

Создание файла index

Созданный ранее ресурс cookbook_file переместит файл index.html в каталог document root на ноде. Теперь нужно создать index.html.

Поместите этот файл в files/default. Перейдите в этот каталог:

cd ~/chef-repo/cookbooks/nginx/files/default

И создайте файл:

nano index.html

Поместите в него простой код HTML.

<html>
<head>
<title>Hello there</title>
</head>
<body>
<h1>This is a test</h1>
<p>Please work!</p>
</body>
</html>

Сохраните и закройте файл.

Создание вспомогательного кукбука

Теперь нужно заблаговременно решить небольшую проблему. Дело в том, что если нода попытается запустить созданный кукбук, это, скорее всего, не удастся.

Это происходит потому, что нода попробует установить Nginx из репозитория Ubuntu, а индекс пакетов ноды устарел. Прежде чем начать установку пакета, нужно обновить индекс с помощью sudo apt-get update.

Чтобы решить эту проблему, создайте простой кукбук для обновления индекса пакетов.

Это можно сделать с помощью knife. Назовём кукбук apt:

knife cookbook create apt

Эта команда создаст такую же структуру каталогов, что и для кукбука Nginx.

Отредактируйте стандартный рецепт нового кукбука:

nano ~/chef-repo/cookbooks/apt/recipes/default.rb

Объявите в файле ресурс execute, который выполнит заданную команду.

execute "apt-get update" do
command "apt-get update"
end

Первая строка содержит только имя ресурса. Сама команда указывается в атрибуте command.

Сохраните и закройте кукбук.

Теперь нужно сделать так, чтобы новый кукбук выполнялся перед кукбуком Nginx. Есть несколько способов осуществить это. Его можно добавить в список задач ноды перед кукбуком Nginx, или же просто привязать его к самому кукбуку Nginx.

Второй вариант звучит лучше: так кукбук apt  будет выполняться перед кукбуком Nginx на всех нодах инфраструктуры.

Нужно только отредактировать пару параметров в кукбуке Nginx. Откройте рецепт Nginx:

nano ~/chef-repo/cookbooks/nginx/recipes/default.rb

Добавьте в начало кукбука (перед всеми ресурсами) следующую строку:

include_recipe "apt"
package 'nginx' do
action :install
end
service 'nginx' do
action [ :enable, :start ] end
cookbook_file "/usr/share/nginx/www/index.html" do
source "index.html"
mode "0644"
end

Сохраните и закройте файл.

Теперь нужно отредактировать файл metadata.rb. Chef проверяет этот файл, когда отправляет ноде список задач.

Откройте файл:

nano ~/chef-repo/cookbooks/nginx/metadata.rb

Добавьте в конец файла следующие строки:

name             'nginx'
maintainer       'YOUR_COMPANY_NAME'
maintainer_email 'YOUR_EMAIL'
license          'All rights reserved'
description      'Installs/Configures nginx'
long_description IO.read(File.join(File.dirname(__FILE__), 'README.md'))
version          '0.1.0'
depends "apt"

Теперь кукбук Nginx зависит от кукбука apt.

Добавление кукбука на ноду

Теперь базовый кукбук готов, и его можно загрузить на сервер.

Введите:

knife cookbook upload apt
knife cookbook upload nginx

Чтобы загрузить все кукбуки, введите команду:

knife cookbook upload -a

Теперь можно изменить список задач ноды. Для этого введите:

knife node edit name_of_node

Узнать имена доступных нод можно с помощью команды:

knife node list
client1

Введите следующую команду:

knife node edit client1
{
"name": "client1",
"chef_environment": "_default",
"normal": {
"tags": [
] },
"run_list": [
] }

Возможно, сначала вам нужно будет установить переменную EDITOR. Введите:

export EDITOR=name_of_editor

Как видите, это простой документ JSON, который описывает некоторые аспекты ноды. На данный момент массив run_list пуст.

Добавьте кукбук Nginx в этот массив:

"recipe[name_of_recipe]"

В результате файл будет выглядеть так:

{
"name": "client1",
"chef_environment": "_default",
"normal": {
"tags": [
] },
"run_list": [
"recipe[nginx]"
] }

Сохраните и закройте файл.

Подключитесь к ноде по SSH и запустите Chef client. После этого клиент проверит Chef server и обнаружит изменения в своём списке задач.

Подключитесь к ноде по SSH и запустите:

sudo chef-client
Starting Chef Client, version 11.8.2
resolving cookbooks for run list: ["nginx"] Synchronizing Cookbooks:
- apt
- nginx
Compiling Cookbooks...
Converging 4 resources
Recipe: apt::default
* execute[apt-get update] action run
- execute apt-get update
Recipe: nginx::default
* package[nginx] action install (up to date)
* service[nginx] action enable
- enable service service[nginx] * service[nginx] action start (up to date)
* cookbook_file[/usr/share/nginx/www/index.html] action create (up to date)
Chef Client finished, 2 resources updated

Как видите, кукбук apt был передан и запущен, хотя он не входил в список задач. Chef передал на ноду не только нужный кукбук, но и все его зависимости.

Откройте IP или домен ноды:

http://node_domain_or_IP

На экране должна появиться надпись:

This is a test
Please work!

Заключение

Теперь вы умеете создавать простые кукбуки и выстраивать зависимости между ними.

Управление конфигурацией может значительно улучшить целостность данных на серверах, автоматизируя процессы и отслеживая изменения, внесенные в системную среду.

Chef – производительный инструмент управления конфигурацией, который автоматизирует оркестровку и развёртывание с помощью Ruby. Chef позволяет использовать стандартные функции языка для достижения максимальной гибкости, а также предлагает DSL для некоторых ресурсов.

Tags: ,

Добавить комментарий