Cookbook (книга рецептов) в 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 описан тут>>>.




