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
описан тут>>>.