Повар - повторяющийся рецепт исполнения - PullRequest
3 голосов
/ 06 февраля 2011

Во-первых, может ли (и это хорошая практика) шеф-повар запустить рецепт с заданным интервалом для определенной роли?

У меня есть скрипт ruby, который управляет учетными записями пользователей и идентификаторами ssh, в настоящее времязапускается на cron каждый час, и я хотел бы превратить его в рецепт шеф-повара по понятным причинам (я хочу, чтобы он был на всех машинах).

Я вижу два способа сделать это:

Либо превратите скрипт в шаблон, рецепт просто отобразит шаблон по заданному пути, а затем зарегистрирует cronjob

ИЛИ

Разбейте скрипт на ресурсы, провайдеров и т. Д.., а шеф-повар запускает его каждый час.

Идеи?

Ответы [ 2 ]

8 голосов
/ 06 февраля 2011

Вы можете запустить chef-client в качестве демона (опция -d, как используется в сценариях инициализации) или в инструменте управления службами, например upstart , runit / daemontools или bluepill. Вы также можете запустить его из cron - просто убедитесь, что там не запущен режим демона:).

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

package "haproxy"

service "haproxy" do
  action [:enable, :start]
end

template "/etc/haproxy/haproxy.cfg" do
  source "haproxy.cfg.erb"
end

Пакет будет установлен при первом запуске chef и не будет изменен снова, если пакет не был удален из системы или вы не изменили ресурс. Аналогично, служба haproxy будет включена (через инструменты управления службами вашей платформы, обычно символические ссылки в /etc/rc*.d) и затем запущена (например, через /etc/init.d/haproxy start). Наконец, только если содержимое шаблона изменится, Chef отобразит новую версию шаблона. Для шаблонов это определяется на основе контрольной суммы SHA256.

Есть несколько исключений - ресурсы execute, script и ruby_block не являются идемпотентными, если вы не предоставите какой-то условный классификатор.

Кроме того, при использовании сервера у Chef нет списков выполнения рецептов «один раз» или «один раз». Недавно в списке рассылки шеф-повара была тема .

2 голосов
/ 28 июня 2011

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

1)

превратить скрипт в шаблон, рецепт просто отрендерит шаблон до заданногопуть и затем зарегистрируйте cronjob

Это легко начать (никаких реальных изменений в вашем скрипте, он просто гарантирует, что он есть)

Помните, что шеф-повар запускает каждый рецепт каждый раз.... Как сказал jtimberman: «он изменяет ресурсы только в том случае, если они не соответствуют рецепту».Таким образом, ваш рецепт должен просто перезаписать новый шаблон при его изменении.

ИЛИ 2)

Разбейте скрипт на ресурсы, провайдеров и т. Д., И Chef будет запускать его каждый час.

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

Это будет отлично работать, если ваш шеф-клиентdaemonized или chef-solo запускается на cron.

В этом случае вы можете настроить рецепт, используя такие ресурсы, как «пользователь», «группа» и «файл» (для копирования ключей ssh).Подробности см. Здесь: http://wiki.opscode.com/display/chef/Resources#Resources-File

Тогда вам лучше всего использовать «пакет данных» (данные json) для хранения данных о пользователях и устанавливать своих пользователей на основе этого.Это именно то, что сделал opscode в этом рецепте (для вдохновения посмотрите ./recipe/sysadmins.rb): https://github.com/opscode/cookbooks/tree/master/users

Просто имейте в виду, что они используют chef-сервер (или платформу opscode).Если вы используете chef-solo, вам нужно заменить 'search (: users,' groups: sysadmin ')' на свой собственный файл с данными, найденный где-нибудь, где chef-solo может достать его (загружаемый или внутри вашего шеф-повара).-repo).

...