Учебники

Шеф-повар — Краткое руководство

Шеф-повар — Обзор

Chef — это технология с открытым исходным кодом, разработанная Opscode. Адам Джейкоб, соучредитель Opscode, известен как основатель Chef. Эта технология использует кодирование Ruby для разработки основных строительных блоков, таких как рецепты и кулинарные книги. Chef используется для автоматизации инфраструктуры и помогает сократить количество ручных и повторяющихся задач для управления инфраструктурой.

У Chef есть своя конвенция для разных строительных блоков, которые необходимы для управления и автоматизации инфраструктуры.

Почему повар?

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

В DevOps мы используем Chef для развертывания и управления серверами и приложениями внутри компании и в облаке.

Особенности шеф-повара

Ниже приведены наиболее характерные черты шеф-повара.

  • Chef использует популярный язык Ruby для создания предметно-ориентированного языка.

  • Шеф-повар не делает предположений о текущем состоянии узла. Он использует свои механизмы для получения текущего состояния машины.

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

Chef использует популярный язык Ruby для создания предметно-ориентированного языка.

Шеф-повар не делает предположений о текущем состоянии узла. Он использует свои механизмы для получения текущего состояния машины.

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

Преимущества шеф-повара

Шеф-повар предлагает следующие преимущества —

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

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

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

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

Недостатки шеф-повара

Некоторые из основных недостатков шеф-повара заключаются в следующем —

  • Одним из огромных недостатков шеф-повара является то, как поваренные книги контролируются. Требуется постоянное детство, чтобы работающие люди не вмешивались в другие кулинарные книги.

  • Доступен только Chef Solo.

  • В нынешней ситуации он подходит только для облака AWS.

  • Это не очень легко узнать, если человек не знаком с Руби.

  • Документация по-прежнему отсутствует.

Одним из огромных недостатков шеф-повара является то, как поваренные книги контролируются. Требуется постоянное детство, чтобы работающие люди не вмешивались в другие кулинарные книги.

Доступен только Chef Solo.

В нынешней ситуации он подходит только для облака AWS.

Это не очень легко узнать, если человек не знаком с Руби.

Документация по-прежнему отсутствует.

Ключевые строительные блоки от шеф-повара

Рецепт

Его можно определить как набор атрибутов, которые используются для управления инфраструктурой. Эти атрибуты, которые присутствуют в рецепте, используются для изменения существующего состояния или установки определенного узла инфраструктуры. Они загружаются во время работы клиента Chef и сравниваются с существующим атрибутом узла (машины). Затем он получает статус, определенный в ресурсе узла рецепта. Это главная рабочая лошадка поваренной книги.

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

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

Ресурс

Это основной компонент рецепта, используемый для управления инфраструктурой с различными типами состояний. В рецепте может быть несколько ресурсов, которые помогут в настройке и управлении инфраструктурой. Например —

  • package — управляет пакетами на узле

  • сервис — управляет сервисами на узле

  • user — управляет пользователями на узле

  • группа — управляет группами

  • template — управляет файлами со встроенным шаблоном Ruby

  • cookbook_file — переносит файлы из подкаталога files в cookbook в местоположение на узле

  • file — управляет содержимым файла на узле

  • каталог — управляет каталогами на узле

  • execute — выполняет команду на узле

  • cron — редактирует существующий файл cron на узле

package — управляет пакетами на узле

сервис — управляет сервисами на узле

user — управляет пользователями на узле

группа — управляет группами

template — управляет файлами со встроенным шаблоном Ruby

cookbook_file — переносит файлы из подкаталога files в cookbook в местоположение на узле

file — управляет содержимым файла на узле

каталог — управляет каталогами на узле

execute — выполняет команду на узле

cron — редактирует существующий файл cron на узле

атрибут

Они в основном настройки. Их можно рассматривать как пару «ключ-значение» всего, что вы хотите использовать в кулинарной книге. Существует несколько различных типов атрибутов, которые могут быть применены, с другим уровнем приоритета над окончательными настройками, под которыми работает узел.

файл

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

Шаблоны

Они похожи на файлы, но они не являются статичными. Файлы шаблонов заканчиваются расширением .ebr, что означает, что они содержат встроенный Ruby. Они в основном используются для подстановки значения атрибута в файлы для создания окончательной версии файла, которая будет размещена на узле.

Metadata.rb

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

Структура поваренной книги по умолчанию

C:\chef\cookbooks\nginx>tree 
Folder PATH listing for volume Local Disk 
Volume serial number is BE8B-6427 
C: ├───attributes 
├───definitions 
├───files 
│   └───default 
├───libraries 
├───providers 
├───recipes 
├───resources 
└───templates 
    └───default 

Шеф-повар — Связанные технологии

Ниже приведен список технологий, связанных с шеф-поваром.

Марионетка

Puppet предоставляет стандартный способ доставки и работы с программным обеспечением, где бы он ни работал. Это автоматизированный механизм администрирования для систем Linux, Unix и Windows, который выполняет административные задачи на основе централизованной спецификации.

Основные черты Puppet следующие:

  • Внедрение новых систем с единой конфигурацией.
  • Обновление систем и обновление пакетов безопасности и программного обеспечения.
  • Включение новых функций и добавление ловких возможностей.
  • Настройка конфигураций для обеспечения доступности источников данных.
  • Оптимизация доступных ресурсов и минимизация затрат.
  • Упрощение ролей и предоставление возможности команде сосредоточиться на основных и продуктивных проблемах.
  • Получение с высоты птичьего полета доступной инфраструктуры.

анзибль

Ansible — это радикально простая платформа для автоматизации ИТ, которая упрощает развертывание ваших приложений и систем. Избегайте написания сценариев или пользовательского кода для развертывания и обновления ваших приложений — автоматизируйте на языке, который приближается к простому английскому, используя SSH, без агентов для установки на удаленных системах.

Основные характеристики Ansible следующие:

  • Простой и легкий в освоении
  • Написано на Python
  • Безагентное
  • Основанные на YAML Playbooks
  • Галактика

SaltStack

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

ткань

Fabric — это язык программирования на основе Python, разработанный как API-интерфейс Python, который необходимо импортировать в код Python для настройки и управления инфраструктурой.

Шеф-повар — Архитектура

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

Chef Server

Чтобы на месте работала инфраструктура Chef, нам нужно последовательно настроить несколько вещей.

В приведенной выше настройке у нас есть следующие компоненты.

Рабочая станция шеф-повара

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

Chef Server

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

Узлы шеф-повара

Это фактические машины, которыми будет управлять сервер Chef. Все узлы могут иметь различные виды настройки в соответствии с требованиями. Клиент Chef является ключевым компонентом всех узлов, который помогает в настройке связи между сервером Chef и узлом Chef. Другими компонентами узла Chef является Ohai, который помогает получить текущее состояние любого узла в данный момент времени.

Chef — Настройка системы контроля версий

Использование системы контроля версий является фундаментальной частью автоматизации инфраструктуры. Существует несколько видов систем контроля версий, таких как SVN, CVS и GIT. Из-за популярности GIT среди сообщества Chef, мы будем использовать настройку GIT.

Примечание. Не думайте о создании инфраструктуры как кода без системы контроля версий.

На винде

Шаг 1 — Загрузите установщик Windows с www.git-scm.org и следуйте инструкциям по установке.

Шаг 2 — Зарегистрируйтесь в центральном хранилище на GitHub.

Шаг 3 — Загрузите ключ ssh в учетную запись GitHub, чтобы с ним можно было легко взаимодействовать. Для получения подробной информации о ssh-ключе перейдите по следующей ссылке https://help.github.com/articles/generatingssh-keys .

Шаг 4 — Наконец, создайте репо на учетной записи github, посетив https://github.com/new с именем chef-repo.

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

Шаг 1 — Загрузите пустую структуру репозитория Opscode Chef.

$ wget https://github.com/opscode/chef-repo/tarball/master

Шаг 2 — Извлеките шарик смолы.

$ tar –xvf master

Шаг 3 — Переименуйте каталог.

$ mv opscode-chef-repo-2c42c6a/ chef-repo

Шаг 4 — Измените текущий рабочий каталог на chef repo.

$ cd chef-repo 

Шаг 5 — Инициализируйте свежий репо.

$ git init. 

Шаг 6 — Подключитесь к своему репо на git hub.

$ git remote add origin git@github.com:vipin022/chef- 

Шаг 7 — Нажмите местный репо на github.

$ git add. 
$ git commit –m “empty repo structure added” 
$ git push –u origin maste

Используя вышеописанную процедуру, вы получите пустое репо с шеф-поваром. Затем вы можете приступить к разработке рецептов и кулинарных книг. После этого вы можете отправить изменения в GitHub.

Chef — настройка рабочей станции

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

Opscode предоставляет полностью упакованную версию, которая не имеет никаких внешних предпосылок. Этот полностью упакованный шеф-повар называется омнибусным установщиком .

На машине Windows

Шаг 1 — Загрузите установочный MSI-файл chefDK на компьютер.

Шаг 2 — Следуйте инструкциям по установке и установите его в целевом местоположении.

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

Настройка окна

Переменная пути ChefDK

$ echo $PATH 
/c/opscode/chef/bin:/c/opscode/chefdk/bin: 

На машине Linux

Для того, чтобы установить на машине Linux, нам нужно сначала получить curl на машине.

Шаг 1 — После того, как curl установлен на машине, нам нужно установить Chef на рабочую станцию ​​с помощью универсального установщика Opscode Chef.

$ curl –L https://www.opscode.com/chef/install.sh | sudo bash 

Шаг 2 — Установите Ruby на машину.

Шаг 3 — Добавьте Ruby к переменной пути.

$ echo ‘export PATH = ”/opt/chef/embedded/bin:$PATH”’ ≫ ~/.bash_profile && 
source ~/.bash_profile 

Omnibus Chef установит Ruby и все необходимые гемы Ruby в / opt / chef / внедренный , добавив каталог / opt / chef / внедренный / bin в файл .bash_profile.

Если Ruby уже установлен, установите гем Chef Ruby на компьютер, выполнив следующую команду.

$ gem install chef 

Chef — Настройка клиента

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

Шеф-повар клиента

Это один из ключевых компонентов узла Chef, который получает поваренные книги с сервера Chef и выполняет их на узле. Он также известен как поставщик шеф-повара.

Здесь мы будем использовать Vagrant для управления виртуальной машиной. Vagrant также можно настроить с помощью поставщика, такого как сценарий Shell, Chef и Puppet, чтобы привести виртуальную машину в нужное состояние. В нашем случае мы будем использовать Vagrant для управления виртуальными машинами, используя VirtualBox и клиент Chef в качестве поставщика.

Шаг 1 — Загрузите и установите VirtualBox с https://www.virtualbox.org/wiki/downlod

Шаг 2 — Загрузите и установите Vagrant по адресу http://downloads.vagrantup.com

Шаг 3 — Установите плагин Vagrant Omnibus, чтобы позволить Vagrant установить клиент Chef на ВМ.

$ vagrant plugin install vagrant-omnibus 

Создание и загрузка виртуальных

Шаг 1 — Мы можем загрузить необходимую коробку Vagrant из репозитория Opscode vagrant. Загрузите окно opscode-ubuntu-12.04 по следующему URL- адресу https://opscode-vmbento.s3.amazonaws.com/vagrant/opscode_ubuntu-12.04_provisionerless.box

Шаг 2 — Получив файл Vagrant, загрузите путь, необходимый для редактирования файла Vagrant.

vipin@laptop:~/chef-repo $ subl Vagrantfile 
Vagrant.configure("2") do |config| 
   config.vm.box = "opscode-ubuntu-12.04" 
   config.vm.box_url = https://opscode-vm-bento.s3.amazonaws.com/ 
   vagrant/opscode_ubuntu-12.04_provisionerless.box 
   config.omnibus.chef_version = :latest  
   config.vm.provision :chef_client do |chef| 
      chef.provisioning_path = "/etc/chef" 
      chef.chef_server_url = "https://api.opscode.com/ 
      organizations/<YOUR_ORG>" 
      chef.validation_key_path = "/.chef/<YOUR_ORG>-validator.pem"
      chef.validation_client_name = "<YOUR_ORG>-validator" 
      chef.node_name = "server" 
   end 
end 

В приведенной выше программе вам необходимо обновить имя <YOUR_ORG>, указав правильное или нужное название организации.

Шаг 3 — Следующий шаг после конфигурирования, чтобы получить окно бродяги. Для этого вам нужно переместиться в то место, где находится Vagrant box, и выполнить следующую команду.

$ vagrant up

Шаг 4 — После того, как машина включена, вы можете войти в нее, используя следующую команду.

$ vagrant ssh

В приведенной выше команде vagrantfile записывается на языке Ruby Domain Specific Language (DSL) для настройки виртуальной машины vagrant.

В файле vagrant у нас есть объект конфигурации. Vagrant будет использовать этот объект конфигурации для настройки виртуальной машины.

Vagrant.configure("2") do |config| 
……. 
End

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

config.vm.box = "opscode-ubuntu-12.04" 
config.vm.box_url = https://opscode-vm-bento.s3.amazonaws.com/ 
   vagrant/opscode_ubuntu-12.04_provisionerless.box

На следующем шаге вы скажете Vagrant загрузить плагин omnibus.

config.omnibus.chef_version = :latest

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

config.vm.provision :chef_client do |chef| 
….. 
End 

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

chef.provisioning_path = "/etc/chef" 

Chef — Тестовая настройка кухни

Test Kitchen — интегрированная среда тестирования от Chef. Он позволяет писать тестовые рецепты, которые будут запускаться на виртуальных машинах после их создания и конвергенции с использованием кулинарной книги. Тестовые рецепты запускаются на этой виртуальной машине и могут проверить, все ли работает как положено.

ChefSpec — это то, что имитирует только запуск Chef. Тестовая кухня загружает реальный узел и запускает на нем шеф-повара.

Шаг 1 — Установите тестовую кухню Ruby gem и тестовую кухню vagrant gem, чтобы тестовая кухня использовала vagrant для раскрутки теста.

$ gem install kitchen 
$ gem install kitchen-vagrant 

Шаг 2 — Настройка тестовой кухни. Это можно сделать, создав файл .kitchen.yml в каталоге поваренной книги.

driver_plugin: vagrant 
driver_config: 
   require_chef_omnibus: true 
platforms: 
   - name: ubuntu-12.04 
   driver_config: 
      box: opscode-ubuntu-12.04 
      box_url: https://opscode-vm.s3.amazonaws.com/vagrant/opscode_ 
      ubuntu-12.04_provisionerless.box 
suites: 
   - name: default 
run_list: 
   - recipe[minitest-handler] 
   - recipe[my_cookbook_test] 
attributes: { my_cookbook: { greeting: 'Ohai, Minitest!'} } 

В приведенном выше коде одна часть определяет, что vagrant необходимо раскрутить виртуальные машины, и определяет, что вы хотите, чтобы Omnibus установил Chef на целевой узел.

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

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

Тест Кухня Рабочий процесс

Ниже приведены шаги, включенные в Test Kitchen Workflow.

Кухонный рабочий процесс

Создание поваренной книги с помощью шеф-повара

Используйте следующий код для создания кулинарной книги.

$ chef generate cookbook motd_rhel 
Installing Cookbook Gems: 

Compiling Cookbooks... 
Recipe: code_generator::cookbook
   * directory[C:/chef/cookbooks/motd_rhel] action create
      - create new directory C:/chef/cookbooks/motd_rhel
   
   * template[C:/chef/cookbooks/motd_rhel/metadata.rb] action create_if_missing
      - create new file C:/chef/cookbooks/motd_rhel/metadata.rb
      - update content in file C:/chef/cookbooks/motd_rhel/metadata.rb from none to 
      d6fcc2 (diff output suppressed by config)
   
   * template[C:/chef/cookbooks/motd_rhel/README.md] action create_if_missing
      - create new file C:/chef/cookbooks/motd_rhel/README.md
      - update content in file C:/chef/cookbooks/motd_rhel/README.md from none to 50deab
         (diff output suppressed by config)
   
   * cookbook_file[C:/chef/cookbooks/motd_rhel/chefignore] action create
      - create new file C:/chef/cookbooks/motd_rhel/chefignore
      - update content in file C:/chef/cookbooks/motd_rhel/chefignore from none to 15fac5
         (diff output suppressed by config)
   
   * cookbook_file[C:/chef/cookbooks/motd_rhel/Berksfile] action create_if_missing
      - create new file C:/chef/cookbooks/motd_rhel/Berksfile
      - update content in file C:/chef/cookbooks/motd_rhel/Berksfile from none to 9f08dc
         (diff output suppressed by config)
   
   * template[C:/chef/cookbooks/motd_rhel/.kitchen.yml] action create_if_missing
      - create new file C:/chef/cookbooks/motd_rhel/.kitchen.yml
      - update content in file C:/chef/cookbooks/motd_rhel/.kitchen.yml
         from none to 49b92b (diff output suppressed by config)
   
   * directory[C:/chef/cookbooks/motd_rhel/test/integration/default/serverspec]
      action create 
      - create new directory 
         C:/chef/cookbooks/motd_rhel/test/integration/default/serverspec
   
   * directory[C:/chef/cookbooks/motd_rhel/test/integration/helpers/serverspec]
      action create 
      - create new directory 
         C:/chef/cookbooks/motd_rhel/test/integration/helpers/serverspec
   
   * cookbook_file
      [C:/chef/cookbooks/motd_rhel/test/integration/helpers/serverspec/spec_helper.rb]
      action create_if_missing
      - create new file 
         C:/chef/cookbooks/motd_rhel/test/integration/helpers/serverspec/spec_helper.rb
      - update content in file
         C:/chef/cookbooks/motd_rhel/test/integration/helpers/serverspec/spec_helper.rb
            from none to d85df4 (diff output suppressed by config)
   
   * template
      [C:/chef/cookbooks/motd_rhel/test/integration/default/serverspec/defaul t_spec.rb]
      action create_if_missing
      - create new file
         C:/chef/cookbooks/motd_rhel/test/integration/default/serverspec/default_spec.rb
      - update content in file
         C:/chef/cookbooks/motd_rhel/test/integration/default/serverspec/default_spec.rb
            from none to 3fbdbd (diff output suppressed by config)
   
   * directory[C:/chef/cookbooks/motd_rhel/spec/unit/recipes] action create
      - create new directory C:/chef/cookbooks/motd_rhel/spec/unit/recipes
   
   * cookbook_file
      [C:/chef/cookbooks/motd_rhel/spec/spec_helper.rb] action create_if_missing
      - create new file C:/chef/cookbooks/motd_rhel/spec/spec_helper.rb
      - update content in file
         C:/chef/cookbooks/motd_rhel/spec/spec_helper.rb from none to 587075
            (diff output suppressed by config)
   
   * template
      [C:/chef/cookbooks/motd_rhel/spec/unit/recipes/default_spec.rb]
      action create_if_missing
      - create new file C:/chef/cookbooks/motd_rhel/spec/unit/recipes/default_spec.rb
      - update content in file
         C:/chef/cookbooks/motd_rhel/spec/unit/recipes/default_spec.rb
            from none to ff3b17 (diff output suppressed by config)
   
   * directory[C:/chef/cookbooks/motd_rhel/recipes] action create
      - create new directory C:/chef/cookbooks/motd_rhel/recipes
   
   * template[C:/chef/cookbooks/motd_rhel/recipes/default.rb] action create_if_missing
      - create new file C:/chef/cookbooks/motd_rhel/recipes/default.rb
      - update content in file
         C:/chef/cookbooks/motd_rhel/recipes/default.rb from none to c4b029
            (diff output suppressed by config) 
   
   * execute[initialize-git] action run 
      - execute git init . 
   
   * cookbook_file[C:/chef/cookbooks/motd_rhel/.gitignore] action create
      - create new file C:/chef/cookbooks/motd_rhel/.gitignore
      - update content in file C:/chef/cookbooks/motd_rhel/.gitignore from none to 33d469
         (diff output suppressed by config)
   
   * execute[git-add-new-files] action run
      - execute git add .
   
   * execute[git-commit-new-files] action run 
      - execute git commit -m "Add generated cookbook content" 

Ниже приведена структура созданной поваренной книги в качестве результата вышеприведенного кода.

Состав

Тестовый файл конфигурации кухни

Файл .kitchen.yaml

driver: 
   name: vagrant 
provisioner: 
   name: chef_zero 
# verifier: 
# name: inspec 
# format: doc 
platforms: 
   - name: ubuntu-14.04 
suites: 
   - name: default 
   run_list: 
      - recipe[motd_rhel::default] 
   attributes: 

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

Provisioner — содержит спецификацию работы Chef. Мы используем chef_zero, потому что он позволяет имитировать среду сервера Chef на локальной машине. Это позволяет работать с атрибутами узла и спецификациями сервера Chef.

Платформа — указывает целевую операционную систему.

Наборы — это определяет, что вы хотите применить в виртуальной среде. Здесь вы определяете множественное определение. Это место, где вы определяете список выполнения, в котором указывается, какой рецепт запускать и в какой последовательности нам нужно запускать.

Выполнение команд в последовательности

Список кухонь

$ kitchen list 
Instance  Driver  Provisioner Verifier   Transport Last Action 
ubuntu-1404 Vagrant ChefZero   Busser       Ssh   <Not Created> 

Кухня Создать

$ kitchen create
-----> Starting Kitchen (v1.4.2)
-----> Creating <default-centos-72>...
      Bringing machine 'default' up with 'virtualbox' provider...
      ==> default: Box 'opscode-centos-7.2' could not be found.
         Attempting to find and install...
      default: Box Provider: virtualbox
      default: Box Version: >= 0
      ==> default: Box file was not detected as metadata. Adding it directly...
         ==> default: Adding box 'opscode-centos-7.2' (v0) for provider: virtualbox
         default: Downloading:
            https://opscode-vmbento.s3.amazonaws.com/vagrant/virtualbox/
            opscode_centos-7.1_chefprovisionerless.box[...]
         Vagrant instance <default-centos-72> created.
         Finished creating <default-centos-72> (3m12.01s).
         -----> Kitchen is finished. (3m12.60s)

Кухня сходится

$ kitchen converge 
-----> Converging <default-centos-72>...        
      Preparing files for transfer        
      Preparing dna.json        
      Resolving cookbook dependencies with Berkshelf 4.0.1...
      Removing non-cookbook files before transfer       
      Preparing validation.pem        
      Preparing client.rb 
-----> Chef Omnibus   installation detected (install only if missing)        
      Transferring files to <default-centos-72>       
      Starting Chef Client, version 12.6.0        
      resolving cookbooks for run list: ["motd_rhel::default"]
      Synchronizing Cookbooks: - motd_rhel (0.1.0)       
      Compiling Cookbooks...       Converging 1 resources        
      Recipe: motd_rhel::default        (up to date)         
      Running handlers:       Running handlers complete       
      Chef Client finished, 0/1 resources updated in 01 seconds        
      Finished converging <default-centos-72> (0m3.57s). 
      -----> Kitchen is finished. (0m4.55s) 

Настройка тестирования

Кухонный логин используется для проверки правильности подготовки тестовой виртуальной машины.

$ kitchen login 
Last login: Thu Jan 30 19:02:14 2017 from 10.0.2.2 
hostname:  default-centos-72 
fqdn:      default-centos-72 
memory:    244180kBcpu count: 1 

Наконец выход

$ exit 
Logout 
Connection to 127.0.0.1 closed. 

Уничтожение настроек

$ Kitchen destroy 
-----> Starting Kitchen (v1.4.2) 
-----> Destroying <default-centos-72>...       
   ==> default: Forcing shutdown of VM...        
   ==> default: Destroying VM and associated drives...        
   Vagrant instance <default-centos-72> destroyed.        
   Finished destroying <default-centos-72> (0m4.94s). 
-----> Kitchen is finished. (0m5.93s) 

Шеф-повар — Настройка ножа

Нож — это инструмент командной строки Chef для взаимодействия с сервером Chef. Один использует его для загрузки поваренных книг и управления другими аспектами Chef. Он обеспечивает интерфейс между chefDK (Repo) на локальной машине и сервером Chef. Это помогает в управлении —

  • Узлы шеф-повара
  • Поваренная книга
  • Рецепт
  • Среды
  • Облачные ресурсы
  • Предоставление облака
  • Установка на клиенте Chef на узлах Chef

Нож предоставляет набор команд для управления инфраструктурой Chef.

Команды начальной загрузки

  • начальная загрузка ножа [SSH_USER @] FQDN (параметры)

Клиентские команды

  • нож клиент навальный удалить REGEX (варианты)
  • нож клиента создания CLIENTNAME (варианты)
  • нож клиента удалить КЛИЕНТА (варианты)
  • нож клиента редактирования КЛИЕНТА (варианты)
  • Использование: C: / opscode / chef / bin / knife (варианты)
  • нож клиентский ключ удалить КЛИЕНТ КЛЮЧ (варианты)
  • нож клиентский ключ редактировать CLIENT KEYNAME (варианты)
  • список ключей клиента ножа КЛИЕНТ (варианты)
  • нож клиентский ключ шоу КЛИЕНТ КЛЮЧ (варианты)
  • список клиентов ножа (варианты)
  • нож клиента перерегистрировать КЛИЕНТА (варианты)
  • нож клиента шоу КЛИЕНТА (варианты)

Настроить команды

  • настройка ножа (варианты)
  • нож настроить клиента КАТАЛОГ

Поваренная книга Команды

  • нож поваренная книга оптом удалить REGEX (варианты)
  • нож поваренная книга создания COOKBOOK (варианты)
  • поваренная книга ножа удалить COOKBOOK VERSION (варианты)
  • нож поваренная книга скачать COOKBOOK [ВЕРСИЯ] (варианты)
  • список поваренных книг ножа (варианты)
  • нож метаданных поваренной книги COOKBOOK (варианты)
  • метаданные поваренной книги ножа из ФАЙЛА (варианты)
  • кулинарное шоу ножа COOKBOOK [ВЕРСИЯ] [ЧАСТЬ] [FILENAME] (варианты)
  • тест поваренной книги ножа [COOKBOOKS …] (варианты)
  • нож поваренная книга загрузить [COOKBOOKS …] (варианты)

Команды сайта Cookbook

  • нож поваренная книга сайта скачать COOKBOOK [ВЕРСИЯ] (варианты)
  • нож поваренная книга сайта установки COOKBOOK [ВЕРСИЯ] (варианты)
  • Список сайтов поварской книги ножа (варианты)
  • нож поваренная книга поиск по сайту QUERY (варианты)
  • нож поваренная книга сайта поделиться COOKBOOK [КАТЕГОРИЯ] (варианты)
  • нож поваренная книга сайта шоу COOKBOOK [ВЕРСИЯ] (варианты)
  • нож поваренная книга сайта unshare COOKBOOK

Команды Data Bag

  • сумка для данных ножа создать мешок [пункт] (варианты)
  • сумка для данных ножа удалить СУМКА [ПУНКТ] (варианты)
  • нож для обработки данных редактировать BAG ITEM (варианты)
  • сумка с данными ножа из файла BAG FILE | FOLDER [FILE | FOLDER ..] (варианты)
  • список данных о ножах (варианты)
  • нож мешок данных шоу BAG [ПУНКТ] (варианты)

Команды окружения

  • нож среды сравнить [ОКРУЖАЮЩАЯ СРЕДА ..] (варианты)
  • ножевая среда создания ОКРУЖАЮЩЕЙ СРЕДЫ (варианты)
  • ножевая среда удалить ОКРУЖАЮЩУЮ СРЕДУ (варианты)
  • нож среды редактирования ОКРУЖАЮЩЕЙ СРЕДЫ (варианты)
  • нож среды из файла FILE [FILE ..] (параметры)
  • список среды ножа (варианты)
  • ножевая обстановка шоу ОКРУЖАЮЩАЯ СРЕДА (варианты)

Exec Commands

  • нож exec [СКРИПТ] (варианты)

Команды помощи

  • помощь ножу [список | ТЕМА]

Индексные команды

  • перестройка указателя ножа (варианты)

Команды узла

  • ножевой узел навалом удалить REGEX (варианты)
  • узел ножа создать узел (варианты)
  • нож узел удалить узел (варианты)
  • узел узла редактирования ножа (варианты)
  • набор среды узла ножа NODE ENVIRONMENT
  • узел ножа из файла FILE (варианты)
  • список узлов ножа (варианты)
  • run_list узла ножа добавить [NODE] [ENTRY [, ENTRY]] (опции)
  • run_list узла ножа удалить [NODE] [ENTRY [, ENTRY]] (опции)
  • набор нодов run_list узла NODE ENTRIES (варианты)
  • узел ножа показать узел (варианты)

OSC команды

  • нож osc_user создать пользователя (параметры)
  • нож osc_user удалить пользователя (опции)
  • нож osc_user редактировать USER (опции)
  • нож список осциллографов (опции)
  • нож osc_user перерегистрация USER (варианты)
  • нож osc_user показать USER (варианты)

Команды на основе пути

  • нож удалить [PATTERN1 … PATTERNn]
  • ножи PATTERN1 [PATTERNn]
  • нож дифференциал УЗОРЫ
  • нож скачать УЗОРЫ
  • нож редактировать [PATTERN1 … PATTERNn]
  • список ножей [-dfR1p] [PATTERN1 … PATTERNn]
  • ножевое шоу [PATTERN1 … PATTERNn]
  • нож загрузить паттерны
  • нож Xargs [КОМАНДА]

Сырые команды

  • нож сырой REQUEST_PATH

Команды рецепта

  • список рецептов ножа [УЗОР]

Ролевые команды

  • Роль ножа навалом удалить REGEX (варианты)
  • Роль ножа создать РОЛЬ (варианты)
  • Роль ножа удалить РОЛЬ (варианты)
  • Роль ножа редактировать РОЛЬ (варианты)
  • роль ножа env_run_list добавить [РОЛЬ] [ОКРУЖАЮЩАЯ СРЕДА] [ВХОД [, ВХОД]] (варианты)
  • роль ножа env_run_list очистить [РОЛЬ] [ОКРУЖАЮЩАЯ СРЕДА]
  • роль ножа env_run_list удалить [РОЛЬ] [ОКРУЖАЮЩАЯ СРЕДА] [ЗАПИСИ]
  • роль ножа env_run_list заменить [ROLE] [ENVIRONMENT] [OLD_ENTRY] [NEW_ENTRY]
  • Роль ножа env_run_list set [РОЛЬ] [ОКРУЖАЮЩАЯ СРЕДА] [ЗАПИСИ]
  • роль ножа из файла FILE [FILE ..] (параметры)
  • список ролей ножа (варианты)
  • роль ножа run_list add [ROLE] [ENTRY [, ENTRY]] (опции)
  • роль ножа run_list clear [ROLE]
  • Роль ножа run_list удалить [ROLE] [ENTRY]
  • Роль ножа run_list заменить [ROLE] [OLD_ENTRY] [NEW_ENTRY]
  • Роль ножа run_list set [ROLE] [ENTRIES]
  • ролевой показ ножа (варианты)

Служить Команды

  • нож для подачи (варианты)

Команды SSH

  • нож сш QUERY COMMAND (варианты)

Команды SSL

  • нож ssl проверить [URL] (варианты)
  • нож ssl выборка [URL] (варианты)

Команды состояния

  • статус ножа QUERY (варианты)

Команды тегов

  • метка ножа создать тег …
  • метка ножа удалить TAG …
  • список меток ножа УЗЕЛ

Пользовательские Команды

  • Пользователь ножа создает USERNAME DISPLAY_NAME FIRST_NAME LAST_NAME EMAIL PASSWORD (варианты)
  • Нож пользователя удалить ПОЛЬЗОВАТЕЛЬ (варианты)
  • Нож пользователя редактировать ПОЛЬЗОВАТЕЛЬ (варианты)
  • нож пользовательский ключ создать USER (варианты)
  • Нож Пользовательский ключ удалить USER KEYNAME (варианты)
  • Нож Пользовательский ключ редактировать USER KEYNAME (варианты)
  • список ключей пользователя пользователя USER (опции)
  • нож пользовательский ключ шоу USER KEYNAME (варианты)
  • список пользователей ножа (варианты)
  • Пользователь ножа перерегистрирует ПОЛЬЗОВАТЕЛЯ (варианты)
  • нож пользователя шоу USER (варианты)

Настройка ножа

Чтобы настроить нож, необходимо перейти в каталог .chef и создать в репозитории chef knife.rb , который расскажет ножу о деталях конфигурации. Это будет пара деталей.

current_dir = File.dirname(__FILE__) 
log_level                :info 
log_location             STDOUT 
node_name                'node_name' 
client_key               "#{current_dir}/USER.pem" 
validation_client_name   'ORG_NAME-validator' 
validation_key           "#{current_dir}/ORGANIZATION-validator.pem" 
chef_server_url          'https://api.chef.io/organizations/ORG_NAME' 
cache_type               'BasicFile' 
cache_options( :path =>  "#{ENV['HOME']}/.chef/checksums" ) 
cookbook_path            ["#{current_dir}/../cookbooks"] 

В приведенном выше коде мы используем хост-сервер Chef, который использует следующие два ключа.

validation_client_name   'ORG_NAME-validator' 
validation_key           "#{current_dir}/ORGANIZATION-validator.pem" 

Здесь knife.rb сообщает ножу, какую организацию использовать и где найти закрытый ключ. Он сообщает ножу, где найти закрытый ключ пользователя.

client_key               "#{current_dir}/USER.pem" 

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

chef_server_url        'https://api.chef.io/organizations/ORG_NAME' 

Используя файл knife.rb, нож валидатора теперь может подключаться к размещенному Opscode вашей организации.

Chef — Solo Setup

Chef-Solo — это инструмент с открытым исходным кодом, работающий локально и позволяющий предоставлять гостевые машины с использованием поваренных книг Chef без каких-либо осложнений в конфигурации клиента и сервера Chef. Это помогает выполнять поваренные книги на самостоятельно созданном сервере.

Перед запуском Chef-Solo на локальном компьютере необходимо установить следующие два файла на локальном компьютере.

  • Solo.rb — Этот файл сообщает Chef о том, где найти поваренные книги, роли и пакеты с данными.

  • Node.json — этот файл устанавливает список запуска и любой специфичный для узла атрибут, если требуется.

Solo.rb — Этот файл сообщает Chef о том, где найти поваренные книги, роли и пакеты с данными.

Node.json — этот файл устанавливает список запуска и любой специфичный для узла атрибут, если требуется.

Конфигурация solo.rb

Ниже приведены шаги по настройке solo.rb.

Шаг 1 — Создайте файл solo.rb внутри репозитория Chef.

current_dir       = File.expand_path(File.dirname(__FILE__)) 
file_cache_path   "#{current_dir}" 
cookbook_path     "#{current_dir}/cookbooks" 
role_path         "#{current_dir}/roles" 
data_bag_path     "#{current_dir}/data_bags" 

Шаг 2 — Добавьте файл в git repo.

$ git add solo.rb 

Шаг 3 — Создайте файл node.json в репозитории chef со следующим содержимым.

{ 
   "run_list": [ "recipe[ntp]" ] 
} 

Шаг 4 — Получите поваренную книгу NTP внутри шеф-повара, используя нож.

vipin@laptop:~/chef-repo $ knife cookbook site install ntp 
Installing ntp to /Users/mma/work/chef-repo/cookbooks 
…TRUNCATED OUTPUT… 
Cookbook ntp version 1.3.0 successfully installed 

Шаг 5 — Добавьте файл node.json в Git.

$ git add node.json 

Шаг 6 — зафиксируйте и отправьте файлы в git repo.

vipin@laptop:~/chef-repo $ git commit -m "initial setup for Chef Solo" 
vipin@laptop:~/chef-repo $ git push 
Counting objects: 4, done. 
Delta compression using up to 4 threads. 
...TRUNCATED OUTPUT... 
To git@github.com:mmarschall/chef-repo.git 
b930647..5bcfab6 master -> master 

Запуск поваренной книги на узле

Шаг 1 — Войдите в узел, где вы хотите предоставить Chef-Solo.

Шаг 2 — Клонируйте репозиторий Chef на машине.

$ git clone $URL_PATH 

Шаг 3 — перейдите к репо шеф-повара.

$ cd chef-repo 

Наконец, запустите Chef-Solo, чтобы объединить узел —

$ sudo chef-solo -c solo.rb -j node.json 
[2017-20-08T22:54:13+01:00] INFO: *** Chef 11.0.0 *** 
[2017-20-08T22:54:13+01:00] INFO: Setting the run_list to 
["recipe[ntp]"] from JSON 
...TRUNCATED OUTPUT... 
[2012-12-08T22:54:16+01:00] INFO: Chef Run complete in 2.388374 
seconds 
[2012-12-08T22:54:16+01:00] INFO: Running report handlers 

solo.rb настраивает Chef-Solo для поиска его поваренных книг, ролей и пакетов данных в текущем каталоге: хранилище Chef.

Chef-Solo берет конфигурацию своего узла из файла JSON. В нашем примере мы назвали это node.json. Если вы собираетесь управлять несколькими серверами, вам потребуется отдельный файл для каждого узла. Затем Chef-Solo просто выполняет запуск Chef на основе данных конфигурации, найденных в solo.rb и node.json.

Шеф-повар — поваренные книги

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

Ключевые компоненты поваренной книги

  • Рецепты
  • Метаданные
  • Атрибуты
  • Ресурсы
  • Шаблоны
  • Библиотеки
  • Все остальное, что помогает создать систему

Создание поваренной книги

Есть два способа динамически создать кулинарную книгу.

  • Использование команды chef
  • Использование ножа

Использование команды Chef

Чтобы создать пустую кулинарную книгу с помощью команды Chef, выполните следующую команду.

C:\Users\vipinkumarm>chef generate cookbook <Cookbook Name> 
C:\Users\vipinkumarm>chef generate cookbook VTest
Installing Cookbook Gems:

Compiling Cookbooks...
Recipe: code_generator::cookbook
   * directory[C:/Users/vipinkumarm/VTest] action create
      - create new directory C:/Users/vipinkumarm/VTest
   
   * template[C:/Users/vipinkumarm/VTest/metadata.rb] action create_if_missing
      - create new file C:/Users/vipinkumarm/VTest/metadata.rb
      - update content in file C:/Users/vipinkumarm/VTest/metadata.rb 
         from none to 4b9435 (diff output suppressed by config)

   * template[C:/Users/vipinkumarm/VTest/README.md] action create_if_missing
      - create new file C:/Users/vipinkumarm/VTest/README.md
      - update content in file C:/Users/vipinkumarm/VTest/README.md 
         from none to 482077 (diff output suppressed by config)

   * cookbook_file[C:/Users/vipinkumarm/VTest/chefignore] action create
      - create new file C:/Users/vipinkumarm/VTest/chefignore
      - update content in file C:/Users/vipinkumarm/VTest/chefignore 
         from none to 15fac5 (diff output suppressed by config)
   
   * cookbook_file[C:/Users/vipinkumarm/VTest/Berksfile] action create_if_missing
      - create new file C:/Users/vipinkumarm/VTest/Berksfile
      - update content in file C:/Users/vipinkumarm/VTest/Berksfile 
         from none to 9f08dc (diff output suppressed by config)

   * template[C:/Users/vipinkumarm/VTest/.kitchen.yml] action create_if_missing
      - create new file C:/Users/vipinkumarm/VTest/.kitchen.yml
      - update content in file C:/Users/vipinkumarm/VTest/.kitchen.yml 
         from none to 93c5bd (diff output suppressed by config)

   * directory[C:/Users/vipinkumarm/VTest/test/integration/default/serverspec]
      action create
      - create new directory
         C:/Users/vipinkumarm/VTest/test/integration/default/serverspec
   
   * directory[C:/Users/vipinkumarm/VTest/test/integration/helpers/serverspec]
      action create
      - create new directory
         C:/Users/vipinkumarm/VTest/test/integration/helpers/serverspec
   
   * cookbook_file
      [C:/Users/vipinkumarm/VTest/test/integration/helpers/serverspec/sp ec_helper.rb]
      action create_if_missing
      - create new file
         C:/Users/vipinkumarm/VTest/test/integration/helpers/serverspec/spec_helper.rb
      - update content in file
         C:/Users/vipinkumarm/VTest/test/integration/helpers/serverspec/spec_helper.rb
         from none to d85df4 (diff output suppressed by config)
   
   * template
      [C:/Users/vipinkumarm/VTest/test/integration/default/serverspec/default _spec.rb]
      action create_if_missing
      - create new file
         C:/Users/vipinkumarm/VTest/test/integration/default/serverspec/default_spec.rb
      - update content in file
         C:/Users/vipinkumarm/VTest/test/integration/default/serverspec/default_spec.rb
         from none to 758b94 (diff output suppressed by config)
   
   * directory[C:/Users/vipinkumarm/VTest/spec/unit/recipes] action create
      - create new directory C:/Users/vipinkumarm/VTest/spec/unit/recipes
   
   * cookbook_file[C:/Users/vipinkumarm/VTest/spec/spec_helper.rb]
      action create_if_missing
      - create new file C:/Users/vipinkumarm/VTest/spec/spec_helper.rb
      - update content in file C:/Users/vipinkumarm/VTest/spec/spec_helper.rb
         from none to 587075 (diff output suppressed by config)

   * template[C:/Users/vipinkumarm/VTest/spec/unit/recipes/default_spec.rb]
      action create_if_missing
      - create new file C:/Users/vipinkumarm/VTest/spec/unit/recipes/default_spec.rb
      - update content in file 
         C:/Users/vipinkumarm/VTest/spec/unit/recipes/default_spec.rb
         from none to 779503 (diff output suppressed by config)
      - create new file C:/Users/vipinkumarm/VTest/recipes/default.rb
      - update content in file C:/Users/vipinkumarm/VTest/recipes/default.rb
         from none to 8cc381 (diff output suppressed by config)

   * cookbook_file[C:/Users/vipinkumarm/VTest/.gitignore] action create
      - create new file C:/Users/vipinkumarm/VTest/.gitignore
      - update content in file C:/Users/vipinkumarm/VTest/.gitignore from none to 33d469
         (diff output suppressed by config)

Структура кулинарной книги с именем VTest будет создана в каталоге, и следующая структура будет такой же.

VTEST

Использование ножа

Используйте следующую команду, чтобы создать кулинарную книгу с помощью ножа.

C:\Users\vipinkumarm\VTest>knife cookbook create VTest2 
WARNING: No knife configuration file found 
** Creating cookbook VTest2 in C:/chef/cookbooks 
** Creating README for cookbook: VTest2 
** Creating CHANGELOG for cookbook: VTest2 
** Creating metadata for cookbook: VTest2 

Ниже будет структура поваренной книги.

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

Шеф-повар — Зависимости поваренной книги

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

Например, если кто-то хочет скомпилировать код на C, тогда нужно убедиться, что все зависимости, необходимые для компиляции, установлены. Для этого может быть отдельная кулинарная книга, которая может выполнять такую ​​функцию.

Когда мы используем chef-сервер, нам нужно знать такие зависимости в кулинарных книгах, которые следует замедлять в файле метаданных кулинарных книг. Этот файл расположен в верхней части структуры каталогов поваренной книги. Он предоставляет подсказки серверу Chef, который помогает в развертывании поваренных книг на правильном узле.

Особенности файла metadata.rb

  • Расположен в верхней части структуры каталогов поваренной книги.

  • Скомпилируется, когда поваренная книга загружена на сервер Chef с помощью команды ножа.

  • Составлено с подкомандой метаданных поваренной книги ножа.

  • Создается автоматически при запуске команды создания готовой книги.

Расположен в верхней части структуры каталогов поваренной книги.

Скомпилируется, когда поваренная книга загружена на сервер Chef с помощью команды ножа.

Составлено с подкомандой метаданных поваренной книги ножа.

Создается автоматически при запуске команды создания готовой книги.

Конфигурация metadata.rb

Ниже приводится содержимое по умолчанию файла метаданных.

Метаданные

Контент по умолчанию

Шеф-повар — Роли

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

Создать роль

vipin@laptop:~/chef-repo $ subl roles/web_servers.rb 
name "web_servers" 
description "This role contains nodes, which act as web servers" 
run_list "recipe[ntp]" 
default_attributes 'ntp' => { 
   'ntpdate' => { 
      'disable' => true 
   } 
}

Как только мы создали роль, нам нужно загрузить ее на сервер Chef.

Загрузить роль на сервер Chef

vipin@laptop:~/chef-repo $ knife role from file web_servers.rb 

Теперь нам нужно назначить роль узлу с именем server.

Назначить роль узлу

vipin@laptop:~/chef-repo $ knife node edit server 
"run_list": [ 
   "role[web_servers]" 
] 
Saving updated run_list on node server 

Запустите Chef-Client

user@server:~$ sudo chef-client 
...TRUNCATED OUTPUT... 
[2013-07-25T13:28:24+00:00] INFO: Run List is [role[web_servers]] 
[2013-07-25T13:28:24+00:00] INFO: Run List expands to [ntp] 
...TRUNCATED OUTPUT... 

Как это устроено

  • Определите роль в файле Ruby внутри папки ролей репозитория Chef.

  • Роль состоит из имени и атрибута описания.

  • Роль состоит из списка выполнения для конкретной роли и параметров атрибута для конкретной роли.

  • У каждого узла, который имеет роль в своем списке выполнения, список выполнения роли будет определен как отдельный.

  • Все рецепты в списке выполнения роли будут выполнены на узле.

  • Роль будет загружена на сервер Chef с помощью роли ножа из команды file.

  • Роль будет добавлена ​​в список выполнения узла.

  • Запуск клиента Chef на узле, имеющем роль в его списке выполнения, выполнит все рецепты, перечисленные в роли.

Определите роль в файле Ruby внутри папки ролей репозитория Chef.

Роль состоит из имени и атрибута описания.

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

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

Все рецепты в списке выполнения роли будут выполнены на узле.

Роль будет загружена на сервер Chef с помощью роли ножа из команды file.

Роль будет добавлена ​​в список выполнения узла.

Запуск клиента Chef на узле, имеющем роль в его списке выполнения, выполнит все рецепты, перечисленные в роли.

Шеф-повар — Окружающая среда

Шеф-повар помогает в настройке конкретной среды. Всегда полезно иметь отдельную среду для разработки, тестирования и производства.

Chef позволяет группировать узлы в отдельные среды для поддержки упорядоченного процесса разработки.

Создание среды

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

vipin@laptop:~/chef-repo $ knife environment create book { 
   "name": "book", 
   "description": "", 
   "cookbook_versions": { 
   }, 
   "json_class": "Chef::Environment", 
   "chef_type": "environment", 
   "default_attributes": { 
   }, 
   "override_attributes": { 
   } 
} 
Created book 

Тестирование созданной среды

vipin@laptop:~/chef-repo $ knife environment list 
_default 
book 

Узел списка для всех сред

vipin@laptop:~/chef-repo $ knife node list 
my_server 

_default Environment

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

Атрибуты среды

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

Атрибутом среды может быть только default_attribute или override_attribute. Это не может быть нормальным атрибутом. Можно использовать методы default_attribute или override_attribute.

Тип атрибута

По умолчанию — атрибут по умолчанию всегда сбрасывается в начале каждого запуска клиента Chef и имеет самый низкий приоритет атрибута.

Переопределение — атрибут переопределения всегда сбрасывается в начале каждого запуска клиента Chef и имеет более высокий приоритет атрибута, чем default, force_default и normal. Атрибут переопределения чаще всего определяется в рецепте, но также может быть указан в файле атрибутов для роли или для среды.

Порядок применения атрибута

Атрибут заказа

Chef — шеф-клиент в роли демона

Запуск Chef-Client в качестве демона помогает узнать состояние всех узлов в любой момент времени. Это поможет запустить Chef-Client в любой момент времени.

Предварительные условия

Узел должен быть зарегистрирован на сервере Chef и на нем должен быть запущен Chef-Client без каких-либо ошибок.

Chef-Client в режиме демона

Запустите Chef-Client в режиме демона, который запускается каждые 30 минут.

user@server:~$ sudo chef-client -i 1800 

В приведенном выше коде — i позволяет запускать Chef-Client в режиме демона на требуемом узле, и 1800 секунд определяют, что демон Chef-Client должен запускаться каждые 30 минут.

Проверка запуска демона

Убедитесь, что Chef-Client работает как демон.

user@server:~$ ps auxw | grep chef-client 

Приведенная выше команда grep запускает процесс демона Chef-Client.

Другие способы

Вместо запуска Chef-Client в качестве демона, мы можем запустить то же самое, что и задание cron .

user@server:~$ subl /etc/cron.d/chef_client 
PATH=/usr/local/bin:/usr/bin:/bin 
# m h dom mon dow user command 
*/15 * * * * root chef-client -l warn | grep -v 'retrying [1234]/5 in' 

Вышеуказанное задание cron будет запускаться через каждые 15 минут.

Шеф-повар — Chef-Shell

Написание поваренных книг шеф-повара всегда сложно. Это делает его еще сложнее из-за длительного цикла обратной связи, когда они загружаются на сервер Chef, предоставляются бродячие виртуальные машины, проверяются их ошибки, промываются и повторяются. Было бы проще, если бы мы могли попробовать некоторые кусочки или рецепты, прежде чем делать всю эту тяжелую работу сразу.

Chef поставляется с Chef-Shell, который по сути является интерактивной сессией Ruby с Chef. В Chef-Shell мы можем создать —

  • Атрибуты
  • Написать рецепты
  • Инициализация шеф-повара

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

Запуск Shell

Шаг 1 — Запустите Chef-Shell в автономном режиме.

mma@laptop:~/chef-repo $ chef-shell 
loading configuration: none (standalone chef-shell session) 
Session type: standalone 
Loading...[2017-01-12T20:48:01+01:00] INFO: Run List is [] 
[2017-01-12T20:48:01+01:00] INFO: Run List expands to [] 
done. 
This is chef-shell, the Chef Shell. 
Chef Version: 11.0.0 
http://www.opscode.com/chef 
http://wiki.opscode.com/display/chef/Home 
run `help' for help, `exit' or ^D to quit. 
Ohai2u mma@laptop!  
chef > 

Шаг 2 — Переключиться в режим атрибутов в Chef-Shell

  • шеф-повар> attribute_mode

шеф-повар> attribute_mode

Шаг 3 — Установка значения атрибута.

  • chef: attribute> set [: title] = «Поваренная книга шеф-повара»

    • «Поваренная книга шеф-повара»

  • шеф-повар: атрибуты> выйти

    • : атрибуты

  • шеф-повар>

chef: attribute> set [: title] = «Поваренная книга шеф-повара»

«Поваренная книга шеф-повара»

шеф-повар: атрибуты> выйти

: атрибуты

шеф-повар>

Шаг 4 — Переключитесь в режим рецепта.

  • шеф-повар> recipe_mode

шеф-повар> recipe_mode

Шаг 5 — Создайте файловый ресурс.

chef:recipe > file "/tmp/book.txt" do 
chef:recipe > content node.title 
chef:recipe ?> end  

=> <file[/tmp/book.txt] @name: "/tmp/book.txt" @noop: nil @ 
before: nil @params: {} @provider: Chef::Provider::File @allowed_ 
actions: [:nothing, :create, :delete, :touch, :create_if_missing] 
@action: "create" @updated: false @updated_by_last_action: false 
@supports: {} @ignore_failure: false @retries: 0 @retry_delay: 
2 @source_line: "(irb#1):1:in `irb_binding'" @elapsed_time: 0 @ 
resource_name: :file @path: "/tmp/book.txt" @backup: 5 @diff: nil 
@cookbook_name: nil @recipe_name: nil @content: "Chef Cookbook">   

chef:recipe > 

Шаг 6 — Запустите программу Chef, чтобы создать файл с заданным содержимым.

  • шеф-повар: рецепт> run_chef

шеф-повар: рецепт> run_chef

[2017-01-12T21:07:49+01:00] INFO: Processing file[/tmp/book.txt] 
action create ((irb#1) line 1) 
--- /var/folders/1r/_35fx24d0y5g08qs131c33nw0000gn/T/cheftempfile20121212- 
11348-dwp1zs 2012-12-12 21:07:49.000000000 
+0100 
+++ /var/folders/1r/_35fx24d0y5g08qs131c33nw0000gn/T/chefdiff20121212- 
11348-hdzcp1 2012-12-12 21:07:49.000000000 +0100 
@@ -0,0 +1 @@ 
+Chef Cookbook 
\ No newline at end of file 
[2017-01-12T21:07:49+01:00] INFO: entered create 
[2017-01-12T21:07:49+01:00] INFO: file[/tmp/book.txt] created file 
/tmp/book.txt 

Как это устроено

  • Chef-Shell начинается с сеанса Interactive Ruby (IRB), дополненного некоторыми специфическими функциями.

  • Он предлагает такие режимы, как attribute_mode и interactive_mode.

  • Это помогает в написании команд, которые написаны внутри рецепта или поваренной книги.

  • Все работает в интерактивном режиме.

Chef-Shell начинается с сеанса Interactive Ruby (IRB), дополненного некоторыми специфическими функциями.

Он предлагает такие режимы, как attribute_mode и interactive_mode.

Это помогает в написании команд, которые написаны внутри рецепта или поваренной книги.

Все работает в интерактивном режиме.

Мы можем запустить Chef-Shell в трех различных режимах: автономный режим, режим клиента и режим Solo .

  • Автономный режим — это режим по умолчанию. Кулинарные книги не загружены, а список запуска пуст.

  • Режим клиента — здесь chef-shell действует как chef-клиент.

  • Режим Solo — здесь оболочка chef-shell действует как клиент chef-solo.

Автономный режим — это режим по умолчанию. Кулинарные книги не загружены, а список запуска пуст.

Режим клиента — здесь chef-shell действует как chef-клиент.

Режим Solo — здесь оболочка chef-shell действует как клиент chef-solo.

Chef — Тестирование поваренных книг

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

Ниже приведены шаги для тестирования.

Шаг 1 — Установите кулинарную книгу, используя следующую команду.

vipin@laptop:~/chef-repo $ knife cookbook site install <cookbook name> 

Шаг 2 — Запустите команды проверки поваренной книги ножа на рабочей поваренной книге.

vipin@laptop:~/chef-repo $ knife cookbook test VTest  
checking ntp 
Running syntax check on ntp 
Validating ruby files 
Validating templates

Шаг 3 — сломайте что-нибудь в кулинарной книге и протестируйте снова.

vipin@laptop:~/chef-repo $ subl cookbooks/VTest/recipes/default.rb 
... 
[ node['ntp']['varlibdir'] 
node['ntp']['statsdir'] ].each do |ntpdir| 
   directory ntpdir do 
      owner node['ntp']['var_owner'] 
      group node['ntp']['var_group'] 
      mode 0755 
   end 
end

Шаг 4 — Запустите команду проверки ножа снова.

vipin@laptop:~/chef-repo $ knife cookbook test ntp 
checking ntp 
Running syntax check on ntp 
Validating ruby files 
FATAL: Cookbook file recipes/default.rb has a ruby syntax error: 
FATAL: cookbooks/ntp/recipes/default.rb:25: syntax error, 
unexpected tIDENTIFIER, expecting ']' 
FATAL: node['ntp']['statsdir'] ].each do |ntpdir| 
FATAL: ^ 
FATAL: cookbooks/ntp/recipes/default.rb:25: syntax error, 
unexpected ']', expecting $end 
FATAL: node['ntp']['statsdir'] ].each do |ntpdir| 
FATAL: 

Метод работы

Тест поваренной книги ножа выполняет проверку синтаксиса Ruby для всех файлов Ruby в поваренной книге, а также для всех шаблонов ERB. Он просматривает файлы Ruby и запускает Ruby –c для каждого из них. Ruby –c проверяет синтаксис скрипта и завершает работу без его запуска.

После прохождения всех файлов Ruby, тест поваренной книги ножа проходит через все шаблоны и каналы ERB, избыточную версию, созданную с –x по Ruby –c .

Ограничения

Тест поваренной книги ножа выполняет только простую проверку синтаксиса для файлов Ruby и шаблонов ERB. Мы можем начать тестирование, используя ChefSpec и тестовую кухню.

Шеф-повар — Foodcritic

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

Foodcritic Setup

Шаг 1 — Добавьте Foodcritic самоцвет.

vipin@laptop:~/chef-repo $ subl Gemfile 
source 'https://rubygems.org' 
gem 'foodcritic', '~>2.2.0'

Шаг 2 — Установите драгоценный камень.

vipin@laptop:~/chef-repo $ bundle install 
Fetching gem metadata from https://rubygems.org/ 
...TRUNCATED OUTPUT... 
Installing foodcritic (2.2.0) 

Foodcritic Gem

Шаг 1 — Запустите Foodcritic в кулинарной книге.

vipin@laptop:~/chef-repo $ foodcritic ./cookbooks/<Cookbook Name> 
FC002: Avoid string interpolation where not required: ./cookbooks/ 
mysql/attributes/server.rb:220 
...TRUNCATED OUTPUT... 
FC024: Consider adding platform equivalents: ./cookbooks/<Cookbook Name>/ 
recipes/server.rb:132 

Шаг 2 — Генерация подробного отчета.

vipin@laptop:~/chef-repo $ foodcritic -C ./cookbooks/mysql 
cookbooks/<cookbook Name>/attributes/server.rb 
FC002: Avoid string interpolation where not required 
[...] 
85| default['<Cookbook Name>']['conf_dir'] = "#{mysql['basedir']}" 
[...] 
cookbooks/<Cookbook Name>/recipes/client.rb 
FC007: Ensure recipe dependencies are reflected in cookbook 
metadata 
40| end 
41|when "mac_os_x" 
42| include_recipe 'homebrew' 
43|end 
44|

Метод работы

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

Chef — ChefSpec

Разработка через тестирование (TDD) — это способ написания модульного теста перед написанием любого реального кода рецепта. Тест должен быть реальным и должен подтвердить, что делает рецепт. Это должно фактически потерпеть неудачу, поскольку не было никакого разработанного рецепта. Как только рецепт разработан, тест должен пройти.

ChefSpec построен на популярной платформе RSpec и предлагает специальный синтаксис для тестирования рецепта Chef.

Создание ChefSpec

Шаг 1 — Создайте гем-файл, содержащий гем chefSpec.

vipin@laptop:~/chef-repo $ subl Gemfile 
source 'https://rubygems.org' 
gem 'chefspec' 

Шаг 2 — Установите драгоценный камень.

vipin@laptop:~/chef-repo $ bundler install 
Fetching gem metadata from https://rubygems.org/ 
...TRUNCATED OUTPUT... 
Installing chefspec (1.3.1) 
Using bundler (1.3.5) 
Your bundle is complete! 

Шаг 3 — Создайте каталог спецификаций.

vipin@laptop:~/chef-repo $ mkdir cookbooks/<Cookbook Name>/spec 

Шаг 4 — Создайте спецификацию

vipin@laptop:~/chef-repo $ subl  
cookbooks/my_cookbook/spec/default_spec.rb  
require 'chefspec'  
describe 'my_cookbook::default' do  
   let(:chef_run) {  
      ChefSpec::ChefRunner.new(  
         platform:'ubuntu', version:'12.04'  
      ).converge(described_recipe)  
   }  

   it 'creates a greetings file, containing the platform  
   name' do  
      expect(chef_run).to  
      create_file_with_content('/tmp/greeting.txt','Hello! ubuntu!')  
   end  
end 

Шаг 5 — Подтвердите ChefSpec.

vipin@laptop:~/chef-repo $ rspec cookbooks/<Cookbook Name>/spec/default_spec.rb 
F 
Failures: 
1) <CookBook Name> ::default creates a greetings file, containing the platform name 
Failure/Error: expect(chef_run.converge(described_recipe)).to 
create_file_with_content('/tmp/greeting.txt','Hello! ubuntu!') 
File content: 
does not match expected: 
Hello! ubuntu! 
# ./cookbooks/my_cookbook/spec/default_spec.rb:11:in `block 
(2 levels) in <top (required)>' 
Finished in 0.11152 seconds 
1 example, 1 failure  

Failed examples: 
rspec ./cookbooks/my_cookbook/spec/default_spec.rb:10 # my_ 
cookbook::default creates a greetings file, containing the 
platform name 

Шаг 6 — Редактировать рецепт поваренных книг по умолчанию.

vipin@laptop:~/chef-repo $ subl cookbooks/<Cookbook Name>/recipes/default.rb 
template '/tmp/greeting.txt' do 
   variables greeting: 'Hello!' 
end 

Шаг 7 — Создайте файл шаблона.

vipin@laptop:~/chef-repo $ subl cookbooks/< Cookbook Name>/recipes/default.rb 
<%= @greeting %> <%= node['platform'] %>! 

Шаг 8 — Запустите rspec снова.

vipin@laptop:~/chef-repo $ rspec cookbooks/<Cookbook Name>/spec/default_spec.rb 
. 
Finished in 0.10142 seconds 
1 example, 0 failures 

Как это устроено

Чтобы заставить его работать, нам нужно сначала настроить базовую инфраструктуру для использования RSpec с Chef. Затем нам нужен ChefSpec Ruby gem, а кулинарной книге нужен каталог spec, куда будут сохранены все тесты.

Chef — Тестовая кулинарная книга с тестовой кухней

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

Это контракт узла с ChefSpec, который имитирует только запуск Chef. Test Kitchen загружает реальный узел и запускает на нем Chef.

Настройка

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

Шаг 1 — Редактировать рецепт по умолчанию в кулинарной книге.

vipin@laptop:~/chef-repo $ subl cookbooks/<Cookbook Name>/recipes/default.rb 
file "/tmp/greeting.txt" do 
   content node['my_cookbook']['greeting'] 
end

Шаг 2 — Редактирование атрибутов поваренной книги.

vipin@laptop:~/chef-repo $ subl cookbooks/<Cookbook Name>/attributes/default.rb 
default['my_cookbook']['greeting'] = "Ohai, Chefs!"

Шаг 3 — Отредактируйте файл gem, чтобы установить необходимые камни Ruby.

vipin@laptop:~/chef-repo $ subl Gemfile 
gem 'test-kitchen', '~> 2.0.0.alpha.7' 
gem 'kitchen-vagrant' 

Шаг 4 — Установите необходимый рубиновый камень.

vipin@laptop:~/chef-repo $ bundle install 
...TRUNCATED OUTPUT... 
Installing test-kitchen (1.0.0.alpha.7) 
Installing kitchen-vagrant (0.10.0) ...TRUNCATED OUTPUT... 

Шаг 5 — Создайте файл .kitchen.yml в кулинарной книге.

vipin@laptop:~/chef-repo/cookbooks/my_cookbook $ subl .kitchen.yml 
--- 
driver_plugin: vagrant 
driver_config: 
   require_chef_omnibus: true  
platforms: 
   - name: ubuntu-12.04 
  driver_config: 
      box: opscode-ubuntu-12.04 
      box_url: 
         https://opscode-vm.s3.amazonaws.com/vagrant/
            opscode_ubuntu12.04_provisionerless.box  
suites: 
   - name: default 
   run_list: 
      - recipe[minitest-handler] 
      - recipe[my_cookbook_test] 
attributes: { my_cookbook: { greeting: 'Ohai, Minitest!'} } 

Шаг 6 — Создайте тестовый каталог в кулинарной книге.

vipin@laptop:~/chef-repo/cookbooks/<Cookbook Name>$ mkdir test 

Шаг 7 — Создание тестовой поваренной книги для интеграционного тестирования.

vipin@laptop:~/chef-repo/cookbooks/<Cookbook Name>/test $ knife 
cookbook create my_cookbook_test 
** Creating cookbook my_cookbook_test 
** Creating README for cookbook: my_cookbook_test 
** Creating CHANGELOG for cookbook: my_cookbook_test 
** Creating metadata for cookbook: my_cookbook_test 

Шаг 8 — Редактирование рецепта тестовой поваренной книги по умолчанию.

vipin@laptop:~/chef-repo/cookbooks/my_cookbook $ subl 
test/cookbooks/my_cookbook_test/recipes/default.rb 
include_recipe 'my_cookbook::default'

Шаг 9 — Создайте Minitest Spec в кулинарной книге.

vipin@laptop:~/chef-repo/cookbooks/my_cookbook $ mkdir -p 
   test/cookbooks/my_cookbook_test/files/default/tests/minitest  

vipin@laptop:~/chef-repo/cookbooks/my_cookbook $ subl 
   test/cookbooks/my_cookbook_test/files/default/tests/minitest/default_test.rb  

require 'minitest/spec'  
describe_recipe 'my_cookbook::default' do 
   describe "greeting file" do 
      it "creates the greeting file" do 
         file("/tmp/greeting.txt").must_exist 
      end 
       
      it "contains what's stored in the 'greeting' node 
         attribute" do 
         file('/tmp/greeting.txt').must_include 'Ohai, Minitest!' 
      end 
end

Шаг 10 — Отредактируйте Berksfile вашей основной кулинарной книги.

vipin@laptop:~/chef-repo/cookbooks/my_cookbook $ subl Berksfile 
site :opscode 
metadata 
cookbook "apt" 
cookbook "minitest-handler" 
cookbook "my_cookbook_test", path: 
"./test/cookbooks/my_cookbook_test" 

Тестирование установки

vipin@laptop:~/chef-repo/cookbooks/my_cookbook $ kitchen test 
-----> Starting Kitchen (v1.0.0.alpha.7) 
...TRUNCATED OUTPUT... 
-----> Converging <default-ubuntu-1204> 
-----> Installing Chef Omnibus (true) 
...TRUNCATED OUTPUT... 
Starting Chef Client, version 11.4.4 
[2013-06-29T18:33:57+00:00] INFO: *** Chef 11.4.4 *** 
[2013-06-29T18:33:58+00:00] INFO: Setting the run_list to 
["recipe[minitest-handler]", "recipe[my_cookbook_test]"] 
from JSON 
...TRUNCATED OUTPUT... 
# Running tests: 
recipe::my_cookbook::default::greeting 
file#test_0001_creates the greeting file = 0.00 s = . 
recipe::my_cookbook::default::greeting 
file#test_0002_contains what's stored in the 'greeting' 
node attribute = 0.00 s = . 
Finished tests in 0.011190s, 178.7277 tests/s, 178.7277 
assertions/s. 
2 tests, 2 assertions, 0 failures, 0 errors, 0 skips 
...TRUNCATED OUTPUT...  
-----> Kitchen is finished. (2m5.69s) 

Шеф-повар — Узлы

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

Начиная

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

Шаг 1 — Определите путь в файле gem.

vipin@laptop:~/chef-repo $ subl Gemfile 
source 'https://rubygems.org' 
gem 'knife-preflight' 

Шаг 2 — Запустите упаковщик, чтобы установить драгоценный камень.

vipin@laptop:~/chef-repo $ bundle install 
Fetching gem metadata from https://rubygems.org/ 
...TRUNCATED OUTPUT... 
Installing knife-preflight (0.1.6)

Метод работы

Запустите предполётный нож по заданной поваренной книге.

Мы можем запустить команду preflight, чтобы узнать, какие узлы и роли имеют данную кулинарную книгу в своих расширенных списках выполнения.

vipin@laptop:~/chef-repo $ knife preflight ntp 
Searching for nodes containing ntp OR ntp::default in their 
expanded run_list... 
2 Nodes found 
www-staging.example.com 
cms-staging.example.com 
Searching for roles containing ntp OR ntp::default in their 
expanded run_list... 
3 Roles found 
your_cms_role 
your_www_role 
your_app_role 
Found 6 nodes and 3 roles using the specified search 
criteria 

Существует несколько способов выполнения поваренной книги на узле.

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

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

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

  • Кулинарная книга может быть зависимостью от другой используемой кулинарной книги.

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

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

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

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

Независимо от того, как кулинарная книга окажется в списке выполнения узла, команда knife preflight перехватит ее, поскольку Chef сохраняет все расширенные списки ролей и рецептов в атрибутах узла. Команда Knife Preflight выполняет поиск именно этих атрибутов узла.

Шеф-повар — Шеф-клиент Run

Чтобы протестировать запуск Chef-Client, нам нужно настроить Chef-Client на использование размещенного Chef или собственного размещенного сервера.

Запуск Chef-Client в режиме отладки

vipin@server:~$ sudo chef-client -l debug 
…TRUNCATED OUTPUT… 
Hashed Path:A+WOcvvGu160cBO7IFKLYPhh9fI= 
X-Ops-Content-Hash:2jmj7l5rSw0yVb/vlWAYkK/YBwk= 
X-Ops-Timestamp:2012-12-27T11:14:07Z 
X-Ops-UserId:vagrant' 
Header hash: {"X-Ops-Sign"=>"algorithm=sha1;version=1.0;", 
"X-Ops-Userid"=>"vagrant", "X-Ops-Timestamp"=>"2012-12- 
27T11:14:07Z", "X-Ops-Content- 
Hash"=>"2jmj7l5rSw0yVb/vlWAYkK/YBwk=", "X-Ops- 
Authorization- 
1"=>"HQmTt9U/ 
LJJVAJXWtyOu3GW8FbybxAIKp4rhiw9O9O3wtGYVHyVGuoilWDao", 
"X-Ops-Authorization- 
2"=>"2/uUBPWX+YAN0g1/ 
fD2854QAU2aUcnSaVM0cPNNrldoOocmA0U5HXkBJTKok", 
"X-Ops-Authorization- 
3"=>"6EXPrEJg5T+ 
ddWd5qHAN6zMqYc3untb41t+eBpigGHPhtn1LLInMkPeIYwBm", 
"X-Ops-Authorization- 
4"=>"B0Fwbwz2HVP3wEsYdBGu7yOatq7fZBXHfIpeOi0kn/ 
Vn0P7HrucnOpONmMgU", "X-Ops-Authorization- 
5"=>"RBmmbetFSKCYsdg2v2mW/ 
ifLIVemhsHyOQjffPYPpNIB3U2n7vji37NxRnBY", 
"X-Ops-Authorization- 
6"=>"Pb3VM7FmY60xKvWfZyahM8y8WVV9xPWsD1vngihjFw=="} 
[2012-12-27T11:14:07+00:00] DEBUG: Sending HTTP Request via 
GET to api.opscode.com:443/organizations/agilewebops/ 
nodes/vagrant
[2012-12-27T11:14:09+00:00] DEBUG: ---- HTTP Status and 
Header Data: ---- 
[2012-12-27T11:14:09+00:00] DEBUG: HTTP 1.1 200 OK 
[2012-12-27T11:14:09+00:00] DEBUG: server: nginx/1.0.5 
[2012-12-27T11:14:09+00:00] DEBUG: date: Thu, 27 Dec 2012 

Проверка результатов последнего запуска Chef-Client

Чтобы проверить последний запуск Chef-Client, особенно проблемы сбоев при разработке новой кулинарной книги, нам нужно знать, что именно пошло не так. Даже несмотря на то, что Chef печатает все в stdout, может потребоваться снова просмотреть журнал отладки.

Если мы хотим протестировать, нам нужна сломанная поваренная книга, которая не работает при компиляции.

user@server:~$ sudo chef-client 
================================================================== 
============== 
Recipe Compile Error in /srv/chef/file_store/cookbooks/my_ 
cookbook/recipes/default.rb 
================================================================== 
============== 
NoMethodError 
------------- 
undefined method `each' for nil:NilClass 
Cookbook Trace: 
--------------- 
/srv/chef/file_store/cookbooks/my_cookbook/recipes/default. 
rb:9:in `from_file' 
Relevant File Content: 
---------------------- 
/srv/chef/file_store/cookbooks/my_cookbook/recipes/default.rb: 
2: # Cookbook Name:: my_cookbook 
3: # Recipe:: default 
4: # 
5: # Copyright 2013, YOUR_COMPANY_NAME 
6: # 
7: # All rights reserved - Do Not Redistribute 
8: # 
9≫ nil.each {}  
10: 

Для более подробной информации, мы можем посмотреть на трассировку стека.

user@server:~$ less /srv/chef/file_store/chef-stacktrace.out 
Generated at 2013-07-21 18:34:05 +0000 
NoMethodError: undefined method `each' for nil:NilClass 
/srv/chef/file_store/cookbooks/my_cookbook/recipes/default.rb:9:in 
`from_file' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.4.4/lib/chef/ 
mixin/from_file.rb:30:in `instance_eval' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.4.4/lib/chef/ 
mixin/from_file.rb:30:in `from_file' 
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.4.4/lib/chef/ 
cookbook_version.rb:346:in `load_recipe' 

Chef — динамически настраиваемые рецепты

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

Шаг 1 — Создайте файл по умолчанию для атрибутов поваренной книги и добавьте в него атрибут по умолчанию.

vipin@laptop:~/chef-repo $ subl cookbooks/my_cookbook/attributes/default.rb 
default['my_cookbook']['message'] = 'hello world!'

Шаг 2 — Определите атрибут внутри рецепта.

vipin@laptop:~/chef-repo $ subl cookbooks/<Cookbook Name>/recipes/default.rb 
message = node['my_cookbook']['message'] 
Chef::Log.info("** Saying what I was told to say: #{message}") 

Шаг 3 — Загрузка измененной поваренной книги.

vipin@laptop:~/chef-repo $ knife cookbook upload my_cookbook 
Uploading my_cookbook [0.1.0]

Шаг 4 — Запуск Chef-Client определенного узла.

user@server:~$ sudo chef-client 
...TRUNCATED OUTPUT... 
[2013-01-13T20:48:21+00:00] INFO: ** Saying what I was told to 
say: hello world! 
...TRUNCATED OUTPUT... 

Метод работы

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

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

Переопределение атрибута на уровне узла и среды

Атрибут, определенный в ролях или среде, имеет наивысший приоритет.

Шаг 1 — Создать роль.

vipin@laptop:~/chef-repo $ subl roles/german_hosts.rb 
name "german_hosts" 
description "This Role contains hosts, which should print out 
their messages in German" 
run_list "recipe[my_cookbook]" 
default_attributes "my_cookbook" => { "message" => "Hallo Welt!" } 

Шаг 2 — Загрузите роль на сервер Chef.

vipin@laptop:~/chef-repo $ knife role from file german_hosts.rb 
Updated Role german_hosts! 

Шаг 3 — Назначьте роль узлу.

vipin@laptop:~/chef-repo $ knife node edit server 
"run_list": [ 
   "role[german_hosts]" 
] 
Saving updated run_list on node server 

Шаг 4 — Запустите Chef-Client.

user@server:~$ sudo chef-client 
...TRUNCATED OUTPUT... 
[2013-01-13T20:49:49+00:00] INFO: ** Saying what I was told to 
say: Hallo Welt! 
...TRUNCATED OUTPUT...

Шеф-повар — шаблоны

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

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

Как это использовать?

Шаг 1 — Добавьте шаблон к рецепту.

vipin@laptop:~/chef-repo $ subl cookbooks/<Cookbook Name>/recipes/default.rb  
template '/tmp/message' do 
   source 'Test.erb' 
   variables( 
      hi: 'Tesing', 
      world: 'Welt', 
      from: node['fqdn'] 
   ) 
end 

Шаг 2 — Добавить файл шаблона ERB .

vipin@laptop:~/chef-repo $ subl cookbooks/<Cookbook Name>/templates/default/test.erb 
<%- 4.times do %> 
<%= @hi %>, <%= @world %> from <%= @from %>! 
<%- end %>

Шаг 3 — Загрузите измененную поваренную книгу на сервер Chef.

vipin@laptop:~/chef-repo $ knife cookbook upload <Cookbook Name> 
Uploading my_cookbook [0.1.0] 
Run Chef Client on your node: 
user@server:~$ sudo chef-client 
...TRUNCATED OUTPUT... 
[2017-01-14T20:41:21+00:00] INFO: Processing template[/tmp/ 
message] action create (my_cookbook::default line 9) 
[2017-01-14T20:41:22+00:00] INFO: template[/tmp/message] updated 
content

Шаг 4 — Проверьте содержимое загруженного файла.

user@server:~$ sudo cat /tmp/message 
Hallo, Welt from vagrant.vm! 
Hallo, Welt from vagrant.vm! 
Hallo, Welt from vagrant.vm! 
Hallo, Welt from vagrant.vm! 

Workflow

Шеф-повар использует Erubis в качестве языка шаблонов. Это позволяет встраивать чистый код Ruby в специальные символы в шаблонах.

  • <% =%> используется, если вы хотите напечатать значение переменной или выражения Ruby в сгенерированный файл.

  • <% -%> используется, если вы хотите встроить логику Ruby в файл шаблона. Мы используем его, чтобы зациклить наше выражение четыре раза.

<% =%> используется, если вы хотите напечатать значение переменной или выражения Ruby в сгенерированный файл.

<% -%> используется, если вы хотите встроить логику Ruby в файл шаблона. Мы используем его, чтобы зациклить наше выражение четыре раза.

Шеф-повар — простой рубин с шеф-поваром DSL

В Chef, если нужно создать простые рецепты, можно использовать ресурсы, доступные в Chef, такие как шаблоны, remote_file и сервисы. Однако по мере того, как рецепты становятся более сложными, нужны передовые методы, такие как условные операторы, для выполнения частей рецепта при условии. Это сила смешивания простого Ruby с языком специфики домена Chef (DSL).

Как это использовать?

Запустите Chef Shell на любом узле в режиме клиента, чтобы иметь доступ к серверу Chef.

user@server:~$ sudo chef-shell --client 
loading configuration: /etc/chef/client.rb 
Session type: client 
...TRUNCATED OUTPUT... 
run `help' for help, `exit' or ^D to quit. 
Ohai2u user@server! 
Chef> 

Основные условия с шеф-поваром DSL

Сортировать узлы по имени, используя обычный Ruby.

chef > nodes.sort! {|a,b| a.name <=> b.name } 
=> [node[alice],node[server]] 

Цикл по узлам, печать их операционной системы.

chef > nodes.each do |n| 
   chef > puts n['os'] 
   chef ?> 
end  
linux 
windows 
=> [node[server], node[alice]] 

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

chef > %w{ec2 essentials}.each do |gem| 
   chef > gem_package "knife-#{gem}" 
   chef ?> end   => ["ec2", "essentials"] 

Метод работы

Рецепты Chef — это файлы Ruby, которые оцениваются в контексте запуска Chef. Они могут содержать простой код Ruby, такой как оператор if и циклы, а также элементы Chef DSL, такие как ресурсы.

Внутри рецепта можно просто объявить переменные Ruby и присвоить им значения.

Шеф-повар — рубиновые самоцветы с рецептами

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

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

Использование iptable Gem в данном рецепте

Шаг 1 — Отредактируйте рецепт по умолчанию из поваренной книги и установите драгоценный камень, который будет использоваться внутри рецепта.

vipin@laptop:~/chef-repo $ subl 
cookbooks/my_cookbook/recipes/default.rb 
chef_gem 'ipaddress' 
require 'ipaddress' 
ip = IPAddress("192.168.0.1/24") 
Chef::Log.info("Netmask of #{ip}: #{ip.netmask}")

Шаг 2 — Загрузите измененную поваренную книгу на сервер Chef.

vipin@laptop:~/chef-repo $ knife cookbook upload my_cookbook 
Uploading my_cookbook [0.1.0] 

Шаг 3 — Запуск клиента Chef, чтобы увидеть результат.

user@server $ sudo chef-client 
...TRUNCATED OUTPUT... 
[2013-01-18T14:02:02+00:00] INFO: Netmask of 192.168.0.1: 
255.255.255.0 
...TRUNCATED OUTPUT...

Метод работы

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

Ресурс chef_gem будет делать то же самое, и в Chef Omnibus — единственный способ работы. Его основная функция — сделать самоцветы доступными для самого шеф-повара.

Шеф-повар — Библиотеки

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

Создание библиотеки

Шаг 1 — Создайте вспомогательный метод в библиотеке поваренной книги.

vipin@laptop:~/chef-repo $ subl cookbooks/my_cookbook/libraries/ipaddress.rb 
class Chef::Recipe 
def netmask(ipaddress) 
IPAddress(ipaddress).netmask 
end 
end

Шаг 2 — Используйте вспомогательный метод.

vipin@laptop:~/chef-repo $ subl cookbooks/my_cookbook/recipes/default.rb 
ip = '10.10.0.0/24' 
mask = netmask(ip) # here we use the library method 
Chef::Log.info("Netmask of #{ip}: #{mask}") 

Шаг 3 — Загрузите измененную поваренную книгу на сервер Chef.

vipin@laptop:~/chef-repo $ knife cookbook upload my_cookbook 
Uploading my_cookbook [0.1.0] 

Тестирование библиотеки

user@server $ sudo chef-client 
...TRUNCATED OUTPUT... 
[2013-01-18T14:38:26+00:00] INFO: Netmask of 10.10.0.0/24: 
255.255.255.0 
...TRUNCATED OUTPUT... 

Метод работы

Код библиотеки Chef может открыть класс chef :: Recipe и добавить новые методы, как это сделано в шаге 1. Этот шаг — не самый чистый, а самый простой способ сделать это.

class Chef::Recipe 
def netmask(ipaddress) 
... 
end 
end

Лучшие практики

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

vipin@laptop:~/chef-repo $ subl cookbooks/my_cookbook/libraries/ipaddress.rb 
class Chef::Recipe::IPAddress 
def self.netmask(ipaddress) 
IPAddress(ipaddress).netmask 
end 
end 

Мы можем использовать метод внутри рецепта, как

IPAddress.netmask(ip) 

Шеф-повар — Определение

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

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

Создание определения

Шаг 1 — Создайте новый файл определения в папке определения поваренных книг.

vipin@laptop:~/chef-repo $ subl cookbooks/test_cookbook/definitions/ 
capistrano_deploy_dirs.rb 
define :capistrano_deploy_dirs, :deploy_to => '' do 
   directory "#{params[:deploy_to]}/releases" 
   directory "#{params[:deploy_to]}/shared" 
   directory "#{params[:deploy_to]}/shared/system" 
end

Шаг 2 — Используйте определение в рецепте поваренных книг по умолчанию.

vipin@laptop:~/chef-repo $ subl cookbooks/test_cookbook/recipes/default.rb 
capistrano_deploy_dirs do 
   deploy_to "/srv" 
end 

Шаг 3 — Загрузите поваренную книгу на сервер шеф-повара.

vipin@laptop:~/chef-repo $ knife cookbook upload test_cookbook 
Uploading test_cookbook [0.1.0] 

Шаг 4 — Запустите клиент Chef на нужном узле.

vipin@laptop:~/chef-repuser@server $ sudo chef-client 
...TRUNCATED OUTPUT... 
[2013-01-18T16:31:11+00:00] INFO: Processing directory[/srv/ 
releases] action create (my_cookbook::default line 2) 
[2013-01-18T16:31:11+00:00] INFO: directory[/srv/releases] created 
directory /srv/releases 
[2013-01-18T16:31:11+00:00] INFO: Processing directory[/srv/ 
shared] action create (my_cookbook::default line 3) 
[2013-01-18T16:31:11+00:00] INFO: directory[/srv/shared] created 
directory /srv/shared 
[2013-01-18T16:31:11+00:00] INFO: Processing directory[/srv/ 
shared/system] action create (my_cookbook::default line 4) 
[2013-01-18T16:31:11+00:00] INFO: directory[/srv/shared/system] 

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

В определении у нас есть параметры, которые в нашем коде выглядят следующим образом.

….. 
directory "#{params[:deploy_to]}/releases" 
directory "#{params[:deploy_to]}/shared" 
directory "#{params[:deploy_to]}/shared/system” 
…… 

Его можно использовать внутри рецепта по умолчанию следующим образом.

capistrano_deploy_dirs do 
   deploy_to "/srv"` 
end 

Chef — Переменная среды

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

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

Настройка переменной среды с использованием рецепта Chef

Шаг 1 — Обновите рецепт поваренной книги по умолчанию с помощью переменной среды.

vipin@laptop:~/chef-repo $ subl cookbooks/test_cookbook/recipes/default.rb  
ENV['MESSAGE'] = 'Testing environment variable update with chef !'  
execute 'print value of environment variable $MESSAGE' do 
   command 'echo $MESSAGE > /tmp/message' 
end

Шаг 2 — Загрузите обновленную кулинарную книгу на сервер.

vipin@laptop:~/chef-repo $ knife cookbook upload test_cookbook 
Uploading my_cookbook [0.1.0] 

Шаг 3 — Запуск клиента Chef для создания временного файла.

user@server:~$ sudo chef-client 
...TRUNCATED OUTPUT... 
[2013-01-25T15:01:57+00:00] INFO: Processing execute[print 
value of environment variable $MESSAGE] action run 
(my_cookbook::default line 11) 
[2013-01-25T15:01:57+00:00] INFO: execute[print value of 
environment variable $MESSAGE] ran successfully 
...TRUNCATED OUTPUT... 

Проверка переменной

user@server:~$ cat /tmp/message 
Hello from Chef

Метод работы

Ruby предоставляет текущую переменную среды через ENV хеш для чтения и изменения переменной среды.

Выполнить ресурс

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

mma@laptop:~/chef-repo $ subl cookbooks/test_cookbook/recipes/default.rb  
execute 'print value of environment variable $MESSAGE' do 
   command 'echo $MESSAGE > /tmp/message' 
   environment 'MESSAGE' => 'Hello from the execute resource' 
end 

Примечание. Установка переменной среды с помощью ENV сделает эту переменную доступной в течение всего цикла Chef. Напротив, передача его ресурсу execute сделает его доступным только для той команды, которая выполняется ресурсом.

Шеф-повар — ошибки данных

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

Метод работы

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

Шаг 1 — Создайте каталог для нашей сумки данных.

mma@laptop:~/chef-repo $ mkdir data_bags/hooks

Шаг 2 — Создайте элемент пакета данных для корзины запросов. Нужно убедиться, что вы используете определенный URL requestBin.

vipi@laptop:~/chef-repo $ subl data_bags/hooks/request_bin.json { 
   "id": "request_bin", 
   "url": "http://requestb.in/1abd0kf1" 
}

Шаг 3 — Создайте пакет данных на сервере Chef

vipin@laptop:~/chef-repo $ knife data bag create hooks 
Created data_bag[hooks] 

Шаг 4 — Загрузите пакет данных на сервер Chef.

vipin@laptop:~/chef-repo $ knife data bag from file hooks requestbin.json 
Updated data_bag_item[hooks::RequestBin]

Шаг 5 — Обновите рецепт поваренной книги по умолчанию, чтобы получить требуемую поваренную книгу из пакета данных.

vipin@laptop:~/chef-repo $ subl cookbooks/my_cookbook/recipes/default.rb 
hook = data_bag_item('hooks', 'request_bin') 
http_request 'callback' do 
   url hook['url'] 
end 

Шаг 6 — Загрузите измененную поваренную книгу на сервер Chef.

vipin@laptop:~/chef-repo $ knife cookbook upload my_cookbook 
Uploading my_cookbook [0.1.0] 

Шаг 7 — Запустите клиент Chef на узле, чтобы проверить, выполняется ли корзина http-запроса.

user@server:~$ sudo chef-client 
...TRUNCATED OUTPUT... 
[2013-02-22T20:37:35+00:00] INFO: http_request[callback] 
GET to http://requestb.in/1abd0kf1 successful 
...TRUNCATED OUTPUT...

Как это устроено

Пакет данных — это именованная коллекция структурных данных. Нужно определить ввод данных и вызвать элемент пакета данных в файле JSON. Можно также искать элемент пакета данных из рецептов, чтобы использовать данные, хранящиеся в пакетах данных.

Мы создали пакет данных под названием крючки. Пакет данных — это каталог в репозитории Chef. Мы использовали нож, чтобы создать его на сервере.

Chef — скрипты для ошибок в данных

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

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

Метод работы

Шаг 1 — Создайте пакет данных.

vipin@laptop:~/chef-repo $ mkdir data_bags/servers 
vipin@laptop:~/chef-repo $ knife data bag create servers 
Created data_bag[servers] 

Шаг 2 — Создайте элемент пакета данных.

vipin@laptop:~/chef-repo $ subl data_bags/servers/Storage.json { 
   "id": "storage", 
   "host": "10.0.0.12" 
} 

Шаг 3 — Обновите элемент пакета данных.

vipin@laptop:~/chef-repo $ subl data_bags/servers/Storage.json { 
   "id": "storage", 
   "host": "10.0.0.12" 
} 

Использование в кулинарной книге

Шаг 1 — Необходимо создать файл JSON, содержащий значения пакета данных, используя указанную выше поваренную книгу, чтобы внешние сценарии могли получить доступ к этим значениям.

vipin@laptop:~/chef-repo $ subl cookbooks/test_cookbook/recipes/default.rb 
file "/etc/backup_config.json" do 
   owner "root"
   group "root" 
   mode 0644 
   content data_bag_item('servers', 'backup')['host'].to_json 
end

Шаг 2 — Загрузите test_cookbook на сервер Chef.

vipin@laptop:~/chef-repo $ knife cookbook upload test_cookbook 
Uploading my_cookbook [0.1.0] 

Шаг 3 — Запустите клиент Chef на узле.

user@server:~$ sudo chef-client 
...TRUNCATED OUTPUT... 
[2013-03-14T20:30:33+00:00] INFO: Processing 
file[/etc/backup_config.json] action create 
(my_cookbook::default line 9) 
[2013-03-14T20:30:34+00:00] INFO: entered create 
[2013-03-14T20:30:34+00:00] INFO: 
file[/etc/backup_config.json] owner changed to 0 
[2013-03-14T20:30:34+00:00] INFO: 
file[/etc/backup_config.json] group changed to 0 
[2013-03-14T20:30:34+00:00] INFO: 
file[/etc/backup_config.json] mode changed to 644 
[2013-03-14T20:30:34+00:00] INFO: 
file[/etc/backup_config.json] created file 
/etc/backup_config.json 
...TRUNCATED OUTPUT... 

Шаг 4 — Проверка содержимого сгенерированного файла JSON.

user@server:~$ cat /etc/backup_config.json 
"10.0.0.12" 

Рабочий процесс сценариев

В приведенной выше команде файловый ресурс, который мы использовали для создания файла JSON в каталоге / etc, определяется в поваренной книге по умолчанию. Он получает содержимое файла непосредственно из пакета данных, используя метод data_bag_item. Мы получаем доступ к значениям хоста из элемента пакета данных и преобразуем его в JSON. Файловый ресурс использует JSON-преобразованные значения в качестве своего содержимого и записывает его на диск.

Шеф-повар — кросс-платформенный для поваренных книг

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

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

Метод работы

Получение сведений о платформе узлов и выполнение условной логики в нашей поваренной книге зависит от платформы. В нашем случае мы проверим его на Ubuntu.

Шаг 1 — Зарегистрируйте сообщение, если узлом является Ubuntu.

vipin@laptop:~/chef-repo $ subl cookbooks/test_cookbook/recipes/default.rb 
Log.info("Running on ubuntu") if node.platform['ubuntu'] 

Шаг 2 — Загрузите поваренную книгу на сервер Chef.

vipin@laptop:~/chef-repo $ subl cookbooks/test_cookbook/recipes/default.rb 
Uploading my_cookbook [0.1.0] 
Uploaded 1 cookbook. 

Шаг 3 — Запустите клиент Chef на узле.

user@server:~$ sudo chef-client 
...TRUNCATED OUTPUT... 
[2013-03-03T20:07:39+00:00] INFO: Running on Ubuntu 
...TRUNCATED OUTPUT...

В качестве альтернативы, если кто-то не заинтересован в конкретной платформе, а должен знать только, какая декларативная платформа используется, можно использовать следующее утверждение.

Log.info("Running on a debian derivative") if 
platform_family?('debian')

Загрузка модифицированной поваренной книги и запуск клиента Chef на узле Ubuntu покажет следующий результат.

[2013-03-03T20:16:14+00:00] INFO: Running on a debian 
derivative 

Рабочий процесс сценариев

В приведенной выше команде Ohai обнаружит текущее состояние операционной системы узла и сохранит его как атрибут платформы с объектом узла.

node['platform'] 

Или вы можете использовать синтаксис стиля метода —

node.platform 

Установка значений, специфичных для платформы

Чтобы установить специфические для платформы значения, chef предлагает удобные методы value_for_platform и value_for_platform_family. Их можно использовать, чтобы избежать сложного оператора case и вместо этого использовать простой хеш.

Пример кулинарной книги

execute "start-runsvdir" do 
   command value_for_platform( 
      "debian" => { "default" => "runsvdir-start" }, 
      "ubuntu" => { "default" => "start runsvdir" }, 
      "gentoo" => { "default" => "/etc/init.d/runit-start start" } 
   ) 
   action :nothing 
end 

В приведенном выше примере команда зависит от ОС, как определено.

  • Для Debian будет работать runsdir-start
  • Для Ubuntu «start runvdir» будет работать
  • Для Gentoo будет работать «/etc/init.d/runit-start»

Шеф-повар — Ресурсы

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

В случае Chef chef :: Platform отображает провайдеров и версии платформ каждого узла. В начале каждого запуска Chef-клиента сервер Chef собирает информацию о текущем состоянии всех машин. Позже сервер Chef использует эти значения для определения правильного поставщика.

Синтаксис ресурса

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

В приведенном выше синтаксисе «тип» — это тип ресурса, а «имя» — это имя, которое мы будем использовать. В блоках «do» и «end» у нас есть атрибут этого ресурса и действие, которое нам нужно предпринять для этого конкретного ресурса.

Каждый ресурс, который мы используем в рецепте, имеет свой собственный набор действий, который определяется внутри блоков «do» и «end».

пример

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

Все ресурсы имеют общий набор функций, действий, свойств, условного выполнения, уведомлений и соответствующего пути действий.

действия Действие : nothing можно использовать с любым ресурсом или пользовательским ресурсом.
свойства Свойства ignore_failure, provider, retries, retry_delay и Support могут использоваться с любым ресурсом или пользовательскими ресурсами.
гвардия Условные исполнения not_if и only_if можно использовать для установки дополнительных средств защиты определенных ресурсов, чтобы они запускались только при выполнении условия.
Переводчики гвардии Оценивает строковую команду, используя основанный на сценариях ресурс: bash, csh, perl, powershell_script, python или ruby .
Уведомления Уведомления и подписки могут быть использованы с любым ресурсом.
Относительные пути Относительный путь # {ENV [‘HOME’]} можно использовать с любым ресурсом.
Безопасность файлов Windows Ресурсы template, file, remote_file, cookbook_file, directory и remote_directory поддерживают использование списков наследования и контроля доступа (ACL) в рецептах.
Запустить в фазе компиляции Иногда ресурс необходимо запустить перед каждым другим ресурсом или после добавления всех ресурсов в коллекцию ресурсов.

Доступные ресурсы

apt_package

Используйте ресурс apt_package для управления пакетами для платформ Debian и Ubuntu.

удар

Используйте ресурс bash для выполнения сценариев с использованием интерпретатора Bash. Этот ресурс также может использовать любые действия и свойства, доступные для исполняемого ресурса. Команды, которые выполняются с этим ресурсом, (по своей природе) не являются идемпотентными, поскольку они, как правило, уникальны для среды, в которой они выполняются. Используйте not_if и only_if для защиты этого ресурса от идемпотентности.

партия

Используйте пакетный ресурс для выполнения пакетного сценария с помощью интерпретатора cmd.exe. Пакетный ресурс создает и выполняет временный файл (аналогично тому, как ведет себя ресурс скрипта ), а не запускает встроенную команду.

Этот ресурс наследует действия (: run и: nothing) и свойства (create, cwd, environment, group, path, timeout и user) от ресурса execute . Команды, которые выполняются с этим ресурсом, (по своей природе) не являются идемпотентными, поскольку они, как правило, уникальны для среды, в которой они выполняются. Используйте not_if и only_if для защиты этого ресурса от идемпотентности.

bff_package

Используйте ресурс bff_package для управления пакетами для платформы AIX с помощью утилиты installp . Когда пакет устанавливается из локального файла, он должен быть добавлен к узлу с использованием ресурсов remote_file или cookbook_file .

chef_gem

Используйте ресурс chef_gem, чтобы установить гем только для экземпляра Ruby, выделенного для Chef-Client. Когда гем устанавливается из локального файла, он должен быть добавлен к узлу с использованием ресурсов remote_file или cookbook_file .

Ресурс chef_gem работает со всеми теми же свойствами и опциями, что и ресурс gem_package , но не принимает свойство gem_binary, поскольку он всегда использует CurrentGemEnvironment, в котором работает Chef-Client. В дополнение к выполнению действий, аналогичных ресурсу gem_package, ресурс chef_gem выполняет вышеуказанное.

cookbook_file

Используйте ресурс cookbook_file для передачи файлов из подкаталога COOKBOOK_NAME / files / по указанному пути, расположенному на хосте, на котором работает ChefClient.

Файл выбирается в соответствии со спецификой файла, что позволяет использовать разные исходные файлы в зависимости от имени хоста, платформы хоста (операционной системы, дистрибутива или, при необходимости) или версии платформы. Файлы, расположенные в подкаталоге COOKBOOK_NAME / files / default, могут использоваться на любой платформе.

Cron

Используйте ресурс cron для управления записями cron для планирования заданий на основе времени. Свойства для расписания по умолчанию будут *, если не предоставлены. Ресурсу cron требуется доступ к программе crontab, обычно cron.

Csh

Используйте ресурс csh для выполнения сценариев с использованием интерпретатора csh. Этот ресурс также может использовать любые действия и свойства, доступные для исполняемого ресурса.

Команды, которые выполняются с этим ресурсом, (по своей природе) не являются идемпотентными, поскольку они, как правило, уникальны для среды, в которой они выполняются. Используйте not_if и only_if для защиты этого ресурса от идемпотентности.

развертывание

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

каталог

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

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

dpkg_package

Используйте ресурс dpkg_package для управления пакетами для платформы dpkg . Когда пакет устанавливается из локального файла, он должен быть добавлен к узлу с использованием ресурсов remote_file или cookbook_file .

easy_install_package

Используйте ресурс easy_install_package для управления пакетами для платформы Python.

Env

Используйте ресурс env для управления ключами среды в Microsoft Windows. После установки ключа среды Microsoft Windows необходимо перезапустить, прежде чем ключ среды станет доступен планировщику задач.

erl_call

Используйте ресурс erl_call для подключения к узлу, расположенному в распределенной системе Erlang. Команды, которые выполняются с этим ресурсом, (по своей природе) не являются идемпотентными, поскольку они, как правило, уникальны для среды, в которой они выполняются. Используйте not_if и only_if для защиты этого ресурса от идемпотентности.

казнить

Используйте ресурс execute для выполнения одной команды. Команды, которые выполняются с этим ресурсом, (по своей природе) не являются идемпотентными, поскольку они, как правило, уникальны для среды, в которой они выполняются. Используйте not_if и only_if для защиты этого ресурса от идемпотентности.

файл

Используйте файловый ресурс для управления файлами непосредственно на узле.

freebsd_package

Используйте ресурс freebsd_package для управления пакетами для платформы FreeBSD.

gem_package

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

Гит

Используйте ресурс git для управления ресурсами управления исходным кодом, которые существуют в репозитории git. git версии 1.6.5 (или выше) требуется для использования всех функций в ресурсе git.

группа

Используйте групповой ресурс для управления локальной группой.

homebrew_package

Используйте ресурс homebrew_package для управления пакетами для платформы Mac OS X.

http_request

Используйте ресурс http_request для отправки HTTP-запроса (GET, PUT, POST, DELETE, HEAD или OPTIONS) с произвольным сообщением. Этот ресурс часто полезен, когда необходимы пользовательские обратные вызовы.

Ifconfig

Используйте ресурс ifconfig для управления интерфейсами.

ips_package

Используйте ресурс ips_package для управления пакетами (с использованием Image Packaging System (IPS)) на платформе Solaris 11.

Ksh

Используйте ресурс ksh для выполнения сценариев с использованием интерпретатора оболочки Korn (ksh). Этот ресурс также может использовать любые действия и свойства, доступные для исполняемого ресурса.

Команды, которые выполняются с этим ресурсом, (по своей природе) не являются идемпотентными, поскольку они, как правило, уникальны для среды, в которой они выполняются. Используйте not_if и only_if для защиты этого ресурса от идемпотентности.

Ссылка на сайт

Используйте ресурс ссылок для создания символических или жестких ссылок.

Журнал

Используйте ресурс журнала для создания записей журнала. Ресурс журнала ведет себя как любой другой ресурс: встроен в коллекцию ресурсов на этапе компиляции, а затем запускается на этапе выполнения. (Чтобы создать запись журнала, которая не встроена в коллекцию ресурсов, используйте Chef :: Log вместо ресурса журнала)

macports_package

Используйте ресурс macports_package для управления пакетами для платформы Mac OS X.

Mdadm

Используйте ресурс mdadm для управления устройствами RAID в среде Linux с помощью утилиты mdadm. Поставщик mdadm создаст и соберет массив, но не создаст файл конфигурации, который используется для сохранения массива при перезагрузке.

Если требуется файл конфигурации, это необходимо сделать, указав шаблон с правильной компоновкой массива, а затем с помощью поставщика монтирования создать запись таблицы файловых систем (fstab).

гора

Используйте ресурс монтирования для управления смонтированной файловой системой.

Ohai

Используйте ресурс ohai для перезагрузки конфигурации Ohai на узле. Это позволяет рецептам, которые изменяют системные атрибуты (например, рецепт, добавляющий пользователя), ссылаться на эти атрибуты позже во время выполнения программы chef-client.

пакет

Используйте ресурс пакета для управления пакетами. Когда пакет устанавливается из локального файла (например, с помощью RubyGems, dpkg или RPM Package Manager), этот файл должен быть добавлен в узел с использованием ресурсов remote_file или cookbook_file.

pacman_package

Используйте ресурс pacman_package для управления пакетами (используя pacman) на платформе Arch Linux.

powershell_script

Используйте ресурс powershell_script для выполнения сценария с использованием интерпретатора Windows PowerShell, во многом аналогично тому, как используются сценарии и ресурсы на основе сценариев — bash, csh, perl, python и ruby. Сценарий powershell_script специфичен для платформы Microsoft Windows и интерпретатора Windows PowerShell.

питон

Используйте ресурс python для выполнения скриптов с использованием интерпретатора Python. Этот ресурс также может использовать любые действия и свойства, доступные для исполняемого ресурса.

Команды, которые выполняются с этим ресурсом, (по своей природе) не являются идемпотентными, поскольку они, как правило, уникальны для среды, в которой они выполняются. Используйте not_if и only_if для защиты этого ресурса от идемпотентности.

перезагружать

Используйте ресурс перезагрузки, чтобы перезагрузить узел, необходимый шаг для некоторых установок на определенных платформах. Этот ресурс поддерживается для использования на платформах Microsoft Windows, Mac OS X и Linux.

registry_key

Используйте ресурс registry_key для создания и удаления разделов реестра в Microsoft Windows.

remote_directory

Используйте ресурс remote_directory для постепенной передачи каталога из кулинарной книги в узел. Каталог, скопированный из кулинарной книги, должен быть расположен в COOKBOOK_NAME / files / default / REMOTE_DIRECTORY.

Ресурс remote_directory будет соответствовать специфике файла.

remote_file

Используйте ресурс remote_file для передачи файла из удаленного местоположения, используя специфичность файла. Этот ресурс похож на файловый ресурс.

маршрут

Используйте ресурс маршрута для управления таблицей системной маршрутизации в среде Linux.

rpm_package

Используйте ресурс rpm_package для управления пакетами для платформы RPM Package Manager.

Рубин

Используйте ресурс ruby для выполнения скриптов с использованием интерпретатора Ruby. Этот ресурс также может использовать любые действия и свойства, доступные для исполняемого ресурса.

Команды, которые выполняются с этим ресурсом, (по своей природе) не являются идемпотентными, поскольку они, как правило, уникальны для среды, в которой они выполняются. Используйте not_if и only_if для защиты этого ресурса от идемпотентности.

ruby_block

Используйте ресурс ruby_block для выполнения кода Ruby во время запуска Chef-Client. Код Ruby в ресурсе ruby_block оценивается с другими ресурсами во время конвергенции, тогда как код Ruby вне ресурса ruby_block оценивается перед другими ресурсами, так как рецепт компилируется.

скрипт

Используйте ресурс сценария для выполнения сценариев с использованием указанного интерпретатора, такого как Bash, csh, Perl, Python или Ruby. Этот ресурс также может использовать любые действия и свойства, доступные для исполняемого ресурса.

Команды, которые выполняются с этим ресурсом, (по своей природе) не являются идемпотентными, поскольку они, как правило, уникальны для среды, в которой они выполняются. Используйте not_if и only_if для защиты этого ресурса от идемпотентности.

обслуживание

Используйте ресурс сервиса для управления сервисом.

smart_os_package

Используйте ресурс smartos_package для управления пакетами для платформы SmartOS.

solaris_package

Ресурс solaris_package используется для управления пакетами для платформы Solaris.

диверсия

Используйте ресурс Subversion для управления ресурсами контроля версий, которые существуют в хранилище Subversion.

шаблон

Используйте ресурс шаблона для управления содержимым файла с помощью шаблона Embedded Ruby (ERB) путем передачи файлов из подкаталога COOKBOOK_NAME / templates / по указанному пути, расположенному на хосте, на котором работает Chef-Client. Этот ресурс включает в себя действия и свойства из файлового ресурса. Файлы шаблонов, управляемые ресурсом шаблона, следуют тем же правилам специфичности файлов, что и remote_file и файловые ресурсы.

пользователь

Используйте пользовательский ресурс для добавления пользователей, обновления существующих пользователей, удаления пользователей, а также для блокировки / разблокировки паролей пользователей.

windows_package

Используйте ресурс windows_package для управления пакетами Microsoft Installer Package (MSI) для платформы Microsoft Windows.

windows_service

Используйте ресурс windows_service для управления службой на платформе Microsoft Windows.

yum_package

Используйте ресурс yum_package для установки, обновления и удаления пакетов с Yum для платформ Red Hat и CentOS. Ресурс yum_package может разрешать данные, предоставленные для пакетов, так же, как это делает Yum при запуске из командной строки. Это позволяет использовать различные варианты установки пакетов, например минимальные версии, виртуальные пакеты и имена библиотек.

Шеф-повар — легкий поставщик ресурсов

Облегченный поставщик ресурсов (LWRP) предоставляет возможность расширения списка доступных ресурсов путем расширения его функций и позволяет пользователю Chef создавать собственные ресурсы.

Создавая пользовательские ресурсы, можно просто написать поваренные книги, потому что можно владеть обогащенными пользовательскими ресурсами, используя Chef DSL, что помогает сделать код рецепта более выразительным.

В сообществе Chef многие пользовательские ресурсы реализованы с использованием LWRP. Есть много рабочих примеров LWRP, таких как iptables_rules и apt_repository .

Метод работы

Убедитесь, что у вас есть имя поваренной книги Testing_resource и run_list узла, который содержит поваренную книгу Testing_resource.

Здание LWRP

Шаг 1 — Создайте пользовательский ресурс в поваренной книге Testing_resource.

vipin@laptop:~/chef-repo $ subl cookbooks/Testing_resource/resources/default.rb 
actions :create, :remove 
attribute :title, kind_of: String, default: "World" 
attribute :path, kind_of: String, default: "/tmp/greeting.txt" 

Шаг 2 — Создайте провайдера для ресурсов в поваренной книге Tesing_resource.

vipin@laptop:~/chef-repo $ subl cookbooks/Testing_resource/provider/default.rb 
action :create do 
   log "Adding '#{new_resource.name}' greeting as #{new_resource. 
      path}" 
   file new_resource.path do 
      content "#{new_resource.name}, #{new_resource.title}!" 
      action :create 
end  
action :remove do 
   Chef::Log.info "Removing '#{new_resource.name}' greeting #{new_resource.path}" 
   file new_resource.path do 
      action :delete 
   end 
end 

Шаг 3 — Используйте новый ресурс, отредактировав рецепт Testing_resource по умолчанию.

vipin@laptop:~/chef-repo $ subl cookbooks/Tesing_resource/recipes/default.rb 
greeting "Ohai" do 
   title "Chef" 
   action :create 
end 

Шаг 4 — Загрузите измененную поваренную книгу на сервер Chef.

vipin@laptop:~/chef-repo $ knife cookbook upload greeting 
Uploading greeting [0.1.0] 

Шаг 5 — Запустите Chef-Client на узле.

vipin@server:~$ sudo chef-client 
...TRUNCATED OUTPUT... 
2013-06-28T21:32:54+00:00] INFO: Processing greeting[Ohai] action 
create (greeting::default line 9) 
[2013-06-28T21:32:54+00:00] INFO: Adding 'Ohai' greeting as /tmp/ 
greeting.txt 
[2013-06-28T21:32:54+00:00] INFO: Processing file[/tmp/greeting. 
txt] action create (/srv/chef/file_store/cookbooks/greeting/ 
providers/default.rb line 7) 
[2013-06-28T21:32:54+00:00] INFO: entered create 
[2013-06-28T21:32:54+00:00] INFO: file[/tmp/greeting.txt] created 
file /tmp/greeting.txt 
...TRUNCATED OUTPUT... 

Шаг 6 — Проверьте содержимое сгенерированного файла.

user@server:~$ cat /tmp/greeting.txt 
Ohai, Chef! 

Сценарии рабочего процесса

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

Шеф-повар — чертежи

В Chef чертежи — это инструменты, позволяющие выяснить и записать, что именно находится на сервере. Чертежи записывают все необходимые вещи, такие как директоры, пакеты, файлы конфигурации и так далее. Чертежи имеют возможность разделять информацию о сервере в различных форматах. Одним из них является рецепт шеф-повара. Это помогает настроить уникальный сервер с помощью Chef.

Woring Метод

Нам нужно установить Python и Git на узле, где нам нужно запустить проект.

Шаг 1 — Установите план.

vipin@server:~$ pip install blueprint 

Шаг 2 — Создайте план.

user@server:~$ sudo blueprint create internal-cookbook 
# [blueprint] using cached blueprintignore(5) rules 
# [blueprint] searching for Python packages 
# [blueprint] searching for PEAR/PECL packages 
# [blueprint] searching for Yum packages 
# [blueprint] searching for Ruby gems 
# [blueprint] searching for npm packages 
# [blueprint] searching for software built from source 
# [blueprint] searching for configuration files 
# [blueprint] /etc/ssl/certs/AC_Ra\xc3\xadz_Certic\xc3\ 
xa1mara_S.A..pem not UTF-8 - skipping it 
# [blueprint] /etc/ssl/certs/NetLock_Arany_=Class_Gold=_F\xc5\ 
x91tan\xc3\xbas\xc3\xadtv\xc3\xa1ny.pem not UTF-8 - skipping it 
# [blueprint] /etc/ssl/certs/EBG_Elektronik_Sertifika_Hizmet_Sa\ 
xc4\x9flay\xc4\xb1c\xc4\xb1s\xc4\xb1.pem not UTF-8 - skipping it 
# [blueprint] /etc/ssl/certs/Certinomis_-_Autorit\xc3\xa9_Racine. 
pem not UTF-8 - skipping it 
# [blueprint] /etc/ssl/certs/T\xc3\x9cB\xc4\xb0TAK_UEKAE_K\xc3\ 
xb6k_Sertifika_Hizmet_Sa\xc4\x9flay\xc4\xb1c\xc4\xb1s\xc4\xb1_-_S\ 
xc3\xbcr\xc3\xbcm_3.pem not UTF-8 - skipping it 
# [blueprint] searching for APT packages 
# [blueprint] searching for service dependencies

Шаг 3 — Создайте кулинарную книгу из чертежа.

user@server:~$ blueprint show -C internal-cookbook my-server/recipes/default.rb

Шаг 4 — Проверьте содержимое сгенерированного файла.

user@server:~$ cat internal-cookbook /recipes/default.rb 
# 
# Automatically generated by blueprint(7). Edit at your own risk. 
# 
cookbook_file('/tmp/96468fd1cc36927a027045b223c61065de6bc575.tar') 
do 
   backup false 
   group 'root' 
   mode '0644' 
   owner 'root' 
   source 'tmp/96468fd1cc36927a027045b223c61065de6bc575.tar' 
end 
execute('/tmp/96468fd1cc36927a027045b223c61065de6bc575.tar') do 
   command 'tar xf "/tmp/96468fd1cc36927a027045b223c61065de6bc575.tar"' 
   cwd '/usr/local' 
end 
directory('/etc/apt/apt.conf.d') do 
...TRUNCATED OUTPUT... 
service('ssh') do 
   action [:enable, :start] 
   subscribes :restart, resources('cookbook_file[/etc/default/ 
      keyboard]', 'cookbook_file[/etc/default/console-setup]', 
      'cookbook_file[/etc/default/ntfs-3g]', 'package[openssh-server]', 
      'execute[96468fd1cc36927a027045b223c61065de6bc575.tar]') 
end

Рабочий сценарий

Blueprint — это пакет Python, который находит все необходимые данные конфигурации сервера и сохраняет их в репозитории Git. У каждого проекта есть свое имя.

Можно попросить план показать содержание своего репозитория Git в различных форматах.

user@server:~$ ls -l internal-cookbook / 
total 8 
drwxrwxr-x 3 vagrant vagrant 4096 Jun 28 06:01 files 
-rw-rw-r-- 1 vagrant vagrant 0 Jun 28 06:01 metadata.rb 
drwxrwxr-x 2 vagrant vagrant 4096 Jun 28 06:01 recipes 

Blueprints Show Commands

user@server:~$ blueprint show-packages my-server 
...TRUNCATED OUTPUT... 
apt wireless-regdb 2011.04.28-1ubuntu3 
apt zlib1g-dev 1:1.2.3.4.dfsg-3ubuntu4 
python2.7 distribute 0.6.45 
python2.7 pip 1.3.1 
pip blueprint 3.4.2 
pip virtualenv 1.9.1 

Предыдущая команда показывает все виды установленных пакетов. Другие команды показа следующие:

  • шоу-файлы
  • шоу-услуги
  • шоу-источники

Шеф-повар — Файлы и пакеты

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

Установка пакетов из стороннего репо

Шаг 1 — Отредактируйте рецепт по умолчанию из поваренной книги.

vipin@laptop:~/chef-repo $ subl cookbooks/test_cookbook/recipes/default.rb 
include_recipe "apt" 
apt_repository "s3tools" do 
   uri "http://s3tools.org/repo/deb-all" 
   components ["stable/"] 
   key "http://s3tools.org/repo/deb-all/stable/s3tools.key" 
   action :add 
end 
package "s3cmd"

Шаг 2 — Отредактируйте метаданные, чтобы добавить зависимость от подходящей поваренной книги.

vipin@laptop:~/chef-repo $ subl cookbooks/my_cookbook/metadata.rb 
... 
depends "apt"

Шаг 3 — Загрузите измененную поваренную книгу на сервер Chef.

Шаг 4. Убедитесь, что пакет, который вы пытаетесь установить, еще не установлен.

Шаг 5 — Подтвердите репо по умолчанию.

Шаг 6 — Запустите Chef-Client на узле.

Шаг 7 — Проверьте, установлен ли требуемый пакет.

Установка программного обеспечения из источника

Если нужно установить часть программного обеспечения, которая не доступна в виде пакета для данной платформы, необходимо скомпилировать его самостоятельно. В Chef мы можем сделать это с помощью ресурса script.

Шаг 1 — Изменить рецепт по умолчанию.

vipin@laptop:~/chef-repo $ subl cookbooks/my_cookbook/recipes/ 
default.rb 
version = "1.3.9" 
bash "install_nginx_from_source" do 
   cwd Chef::Config['file_cache_path'] 
   code ≪-EOH 
      wget http://nginx.org/download/nginx-#{version}.tar.gz 
      tar zxf nginx-#{version}.tar.gz && 
      cd nginx-#{version} && 
      ./configure && make && make install 
   EOH 

Шаг 2 — Загрузите измененную поваренную книгу на сервер Chef.

Шаг 3 — Запустите Chef-Client на узле.

Шаг 4 — Убедитесь, что nginx установлен.

Chef — кулинарные книги сообщества

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

Нужно настроить нож в своей системе, чтобы обновлять, загружать и загружать поваренные книги. Взаимодействуйте с поваренными книгами, используя команды поваренной книги ножа. С помощью поваренной книги ножа вы можете создавать, удалять, показывать, просматривать, загружать и загружать поваренные книги. Прочтите документацию по командам поваренной книги ножа для получения дополнительной информации в Главе 7.

Вот ссылка на кулинарные книги сообщества: https://supermarket.chef.io/cookbooksdirectory