Кроссплатформенные кулинарные книги — это те кулинарные книги, которые используют базовую среду, в которой они будут работать. 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
В приведенном выше примере команда зависит от ОС, как определено.