Chef: часть 3 — cookbooks

Автор: | 11/19/2015
 

pic-chef-logoCookbook (книга рецептов) в Chef позволяет структурировать ваши рецепты для более удобного управления ими.

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

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

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

Создаем каталог для книг:

$ mkdir -p ~/Chef/cookbooks && cd ~/Chef/cookbooks

Создаем рецепт:

$ chef generate cookbook apache2
Compiling Cookbooks...
Recipe: code_generator::cookbook
  * directory[/Users/arseny.zinchenko/Chef/cookbooks/apache2] action create
    - create new directory /Users/arseny.zinchenko/Chef/cookbooks/apache2
  * template[/Users/arseny.zinchenko/Chef/cookbooks/apache2/metadata.rb] action create_if_missing
    - create new file /Users/arseny.zinchenko/Chef/cookbooks/apache2/metadata.rb
...
  * cookbook_file[/Users/arseny.zinchenko/Chef/cookbooks/apache2/.gitignore] action create
    - create new file /Users/arseny.zinchenko/Chef/cookbooks/apache2/.gitignore
    - update content in file /Users/arseny.zinchenko/Chef/cookbooks/apache2/.gitignore from none to dd37b2
    (diff output suppressed by config)

В результате мы получаем каталог с таким содержимым:

$ tree
.
└── apache2
    ├── Berksfile
    ├── README.md
    ├── chefignore
    ├── metadata.rb
    ├── recipes
    │   └── default.rb
    ├── spec
    │   ├── spec_helper.rb
    │   └── unit
    │       └── recipes
    │           └── default_spec.rb
    └── test
        └── integration
            ├── default
            │   └── serverspec
            │       └── default_spec.rb
            └── helpers
                └── serverspec
                    └── spec_helper.rb

В котором находится наш рецепт:

$ cat apache2/recipes/default.rb
#
# Cookbook Name:: apache2
# Recipe:: default
#
# Copyright (c) 2015 The Authors, All Rights Reserved.

Создаtм файл шабона файла index.html:

$ chef generate template apache2 index.html
Compiling Cookbooks...
Recipe: code_generator::template
  * directory[./apache2/templates/default] action create
    - create new directory ./apache2/templates/default
  * template[./apache2/templates/default/index.html.erb] action create
    - create new file ./apache2/templates/default/index.html.erb
    - update content in file ./apache2/templates/default/index.html.erb from none to e3b0c4
    (diff output suppressed by config)

В результате — мы получаем файл apache2/templates/default/index.html.erb.

Редактируем его:

$ cat apache2/templates/default/index.html.erb
<html>
  <body>
    <h1>Hello from Chef's Apache</h1>
  </body>
</html>

Обновляем файл рецепта /home/setevoy/Chef/cookbooks/apache2/recipes/default.rb:

package 'apache2'

service 'apache2' do
  supports :status => true
  action [:enable, :start]
end

template '/var/www/html/index.html' do
  source 'index.html.erb'
end

Что бы запустить этот cookbook — используем chef-client с опцией run-list.

Находясь в катаоге с рецептами ~/Chef/cookbooks — выполняем:

$ sudo chef-client --local-mode --runlist 'recipe[apache2]'
[2015-11-18T10:49:39+00:00] WARN: No config file found or specified on command line, using command line options.
Starting Chef Client, version 12.5.1
resolving cookbooks for run list: ["apache2"]
Synchronizing Cookbooks:
  - apache2 (0.1.0)
Compiling Cookbooks...
Converging 3 resources
Recipe: apache2::default
  * apt_package[apache2] action install
...
     </html>
    -

Running handlers:
Running handlers complete
Chef Client finished, 3/4 resources updated in 55 seconds

Примечание: chef-apply  используется для запуска отдельных рецептов, тогда как chef-client — для выполнения рецептов из cookbook-а. Фактически, run-list принимает список рецептов из cookbook для выполнения.

В данном примере — вызов recipe[apache2] равен recipe[apache2::default] (как видно из лога). Т.е. — мы указываем, что хотим выполнить рецепт default (файл /home/setevoy/Chef/cookbooks/apache2/recipes/default.rb) из книги рецептов apache2 (каталог ~/Chef/cookbooks/apache2).

Проверяем:

$ curl localhost
<html>
  <body>
    <h1>Hello from Chef's Apache</h1>
  </body>
</html>

Подробнее  run-list описан тут>>>.