Шеф-повар - повторяющееся выполнение рецепта

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

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

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

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

OR

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

Идеи?


person Andrei Serdeliuc ॐ    schedule 06.02.2011    source источник


Ответы (2)


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

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

package "haproxy"

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

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

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

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

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

person jtimberman    schedule 06.02.2011
comment
Спасибо за ответ. Агент работает как демон, мой вопрос был в том, может ли шеф-повар запускать один и тот же рецепт при каждом запуске, даже если он запускался раньше и успешно завершился? - person Andrei Serdeliuc ॐ; 08.02.2011

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

1)

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

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

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

OR 2)

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

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

Это будет прекрасно работать, если ваш клиент шеф-повара демонизирован или шеф-повар запускается на 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-server (или платформу opscode). Если вы используете chef-solo, вам нужно будет заменить search(:users, 'groups:sysadmin')' своим собственным файлом базы данных, найденным где-то, где его может получить chef-solo (загружаемый или внутри вашего шеф-повара). -репо).

person adzdavies    schedule 28.06.2011