Последние несколько недель я много копался в Chef. Хотя документация хороша, было много раз, когда я вообще не понимал. Итак, я подробно расскажу о Chef. Если вы вообще не слышали о Chef (как я несколько месяцев назад), не волнуйтесь, я все объясню.

Что такое Chef и почему?

Chef - это мощная платформа автоматизации, которая превращает инфраструктуру в код. Chef автоматизирует настройку, развертывание и управление инфраструктурой в вашей сети, независимо от ее размера.

Но что означает инфраструктура как код? Допустим, у вас есть приложение Java, которое нужно развернуть на одной машине. Для этого не нужна автоматизация - вы можете сделать это вручную.

Но что происходит, когда одна машина не может справиться с нагрузкой, и вам нужно развернуть приложение еще на 10, 50 или 100 машинах? Здесь на помощь приходит Chef. Вместо того, чтобы вручную развертывать приложение на каждой отдельной машине, вы можете написать код, который сделает это за вас.

Терминология

  1. Рабочая станция - ваш локальный компьютер или ноутбук. Здесь вы пишете свой код, который затем отправляется на ваш шеф-повар-сервер.
  2. Chef Server - здесь находится весь ваш код. Также он содержит всю информацию об узлах.
  3. Узлы, также известные как Chef Client - машины, на которых должен запускаться ваш код. Вы можете использовать что-то вроде vagrant для учебных целей и aws / gcp в продакшене. Ваши узлы извлекают последний код с вашего сервера-повара.

Начало работы с шеф-поваром

Для начала нам нужно установить ChefDK на нашу рабочую станцию. ChefDK - это комплект разработчика Chef, который содержит все инструменты, необходимые для начала использования chef. Вы можете установить ChefDK отсюда.

После установки ChefDK выполните следующую команду:

chef generate cookbook testingChef
tree testingChef

Это структура, созданная командой chef generate cookbook. Давайте пройдемся по каждому файлу, чтобы увидеть, что они делают.

Поваренные книги

Кулинарная книга - это основная единица конфигурации, которая направлена ​​на достижение желаемого состояния с помощью других компонентов, таких как рецепты, шаблоны, файлы и т. Д. По умолчанию, когда вы создаете кулинарную книгу, вы получаете только папку рецептов. Однако вы также можете создавать папки для шаблонов и других компонентов, если планируете их использовать (о них мы поговорим позже).

Допустим, вы хотите запустить Java-приложение на машине. Для этого необходимы две вещи:

  1. На вашем компьютере должна быть установлена ​​Java.
  2. У него должно быть приложение для запуска.

Затем вы можете запустить приложение.

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

Ресурсы для шеф-поваров

Ресурс - это блок Ruby с четырьмя компонентами: тип, имя, одно (или несколько) свойств (со значениями) и одно (или несколько) действий. Синтаксис ресурса такой:

type 'name' do
   attribute 'value'
   action :type_of_action
end

Допустим, вы хотите установить OpenJDK 7 на свой узел. Для этого вы можете использовать ресурс package, доступный в chef.

package 'java-1.7.0-openjdk' do
 action :install
end

action: install - это действие по умолчанию для ресурса пакета, поэтому вы можете пропустить его, если хотите.

package 'java-1.7.0-openjdk'

Чтобы запустить cronJob на вашем узле, вы можете использовать ресурс cron.

cron 'reporting' do
  action :create
  minute '0'
  hour '0'
  weekday '1'
  command "/srv/app/scripts/daily_report" # Path of script to run
end

В зависимости от того, чего вы хотите достичь, вы можете использовать множество встроенных ресурсов для шеф-повара. Подробнее о них вы можете прочитать здесь.

Рецепты

Рецепт - это набор ресурсов, который приближает ваш узел на один шаг к желаемому состоянию. Рецепты написаны рубином.

Чтобы запустить рецепт, мы используем следующую команду:

chef-client -z pathToRecipe

Флаг -z означает, что клиент-шеф-повар должен работать в локальном режиме, поскольку мы не подключены ни к какому серверу шеф-повара. Если ваши узлы подключены к серверу, вам не нужно использовать флаг -z.

************************** default.rb ****************************
/* This is an example recipe to install install httpd (Apache HyperText Transfer Protocol (HTTP) server program), creates a file on the node at /var/www/html/index.html (default path for serving web pages on apache server) and starts the service on a centOS based machine */
package 'httpd'
file '/var/www/html/index.html' do
  content '<html>This is a placeholder for the home page.</html>'
end
service 'httpd' do
  action [:enable, :start]
end

Метаданные и Berksfile

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

Здесь на помощь приходит Супермаркет Chef. Он содержит поваренные книги сообщества, которые вы можете использовать в качестве зависимостей в своей собственной кулинарной книге. Эти зависимости перечислены в файле metadata.rb или даже в вашем Berksfile. Но тогда возникает вопрос: чем они отличаются?

************************* Berksfile ********************************
source 'https://supermarket.chef.io' # Fetch dependencies from here
metadata

Когда вы загружаете свою кулинарную книгу на сервер шеф-повара, вы также должны загружать зависимости своей кулинарной книги. Вот тут-то и помогает Беркс. Вам просто нужно выполнить две простые команды:

berks install 
berks upload

которые загружают все зависимости ваших кулинарных книг и загружают их на сервер шеф-повара. Поваренные книги зависимостей присутствуют в

~/.berkshelf/cookbooks/

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

**************************** metadata.rb ***************************
name 'testingChef'
maintainer 'The Authors'
maintainer_email '[email protected]'
license 'All Rights Reserved'
description 'Installs/Configures testingChef'
long_description 'Installs/Configures testingChef'
version '0.1.0' # Update after changes are made to the cookbook
chef_version '>= 12.14' if respond_to?(:chef_version)
depends 'haproxy', '~> 6.2.6'

Chefignore

Поместите в этот файл файлы / каталоги, которые следует игнорировать при загрузке
или предоставлении общего доступа к кулинарным книгам на сайт сообщества.

Охай

Когда мы устанавливаем CheckDK, мы тоже получаем от этого удовольствие. Каждый раз, когда вы запускаете chef-client на своем узле, chef запускает ohai перед этим. Охай собирает много системной информации. Типы атрибутов, которые собирает Охай, включают, но не ограничиваются:

  • Операционная система
  • Сеть
  • объем памяти
  • Диск
  • Процессор

При запуске ohai вы получаете много результатов, поэтому помните, чего вы хотите, и пишите свои команды соответственно.

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

if node['hostname'] == "Some hostname" do
  // do something only if the nodes hostname matches
end

Нож

Knife - это инструмент, который вы используете для связи с сервером шеф-повара. Если вы хотите узнать что-нибудь о своих узлах или обновить что-то вроде их рецептов, вам подойдет нож. Есть более десятка ножевых команд. Вот некоторые из них

  1. Knife bootstrap - эта команда используется для создания нового узла и присоединения его к вашему серверу шеф-повара. При начальной загрузке узла chef устанавливает на узел все, например ohai, chef-client, а также автоматически запускает chef-client. Для любых последующих изменений, внесенных в этот узел, вам необходимо вручную запустить chef-client, чтобы обновить ваш узел.
  2. ножевой узел show $ {nodeName} - эта команда используется для получения информации о вашем узле, которая включает рецепты, среду, платформу и т. д.

3. список кулинарных книг ножа $ {nodeName} - эта команда используется для получения всех кулинарных книг, связанных с вашим узлом.

Вот и все! Спасибо, что прочитали, и я надеюсь, что статья вам понравилась.

Следите за мной на Medium и Github :)