Назад | Перейти на главную страницу

Как создать фоновую службу в Linux с помощью Chef?

У меня есть сценарий Python, который я выполняю с помощью screen на хосте ubuntu, и я хочу превратить это в надлежащую фоновую службу, используя рецепт Chef. Сценарий python просто запускает SMTP-сервер, который отбрасывает все электронные письма (сервер «черная дыра», полезный для тестирования), а затем вызывает python asyncore.loop() бежать вечно.

Как превратить это в рецепт шеф-повара? Я использую cookbook_file ресурс для загрузки моего скрипта Python, и я знаю, что мне нужно использовать service ресурс чтобы запустить службу, но я не знаю, как на самом деле Создайте сервис для начала. Мне нужно записать файл в /etc/init.d или /etc/systemd для создания службы на уровне ОС, или есть какой-то рецепт / ресурс Chef, который я могу вызвать, чтобы создать для меня фоновую службу с заданной командой?

Я использую шеф 11.18.12 и не может обновиться, поэтому некоторые поваренные книги (например, запустить его), для которых требуется 12+. ОС хоста - Ubuntu 14.04.3.

Вот что у меня есть на данный момент:

include_recipe 'apt'
include_recipe 'python'

# the python script to run as a background service    
cookbook_file '/usr/local/bin/smtp_server_blackhole.py' do
  source 'smtp_blackhole_server.py'
  owner 'root'
  group 'root'
  mode '0755'
end

# the init.d file which defines the service? Not sure about this part...
cookbook_file "init.d_smtp_server_blackhole" do
    path "/etc/init.d/smtp_server_blackhole.py"
    source "init.d_smtp_server_blackhole"
    owner "root"
    group "root"
    mode "0755"
end

service "smtp_blackhole_server.py" do
  # this doesn't work, because the command doesn't reference an existing service?
  start_command 'python /usr/local/bin/smtp_blackhole_server.py -c bounce'
  action [ :enable, :start ]

  # I think I need to do something like this, to wait for the init.d file to be written
  subscribes :restart, "cookbook_file[init.d_smtp_server_blackhole]", :immediately
end

Возможные решения

  1. DAEMON Tools это LWRP, который позволяет вам создавать сервис, используя файл шаблона для команды запуска. Однако он не обновлялся пару лет, и для этого необходимо настроить svscan сервис для «соответствующей системы инициализации».
  2. Этот вопрос есть несколько хороших ответов о том, как написать службу демона Python с использованием различных примеров кода и библиотек Python (например, python-демон и демонизировать), но он не описывает, как выполнять команды ОС идемпотентным способом в рамках рецепта шеф-повара.
  3. https://github.com/poise/poise-service похоже, что мне нужно, но он не поддерживает Chef 11.18, так как для poise 2.0 требуется Chef 12+.

Для Ubuntu 14.04 вы, скорее всего, захотите начать с Upstart, поскольку это система инициализации системы. Ознакомьтесь с шаблоном Erb-выскочки в poise-service, чтобы узнать, как все настраивать, или ознакомьтесь с Поваренной книгой Upstart от Canonical. Если вы хотите использовать что-то другое, кроме Upstary, я бы порекомендовал Supervisord как из-за его простоты, так и из-за его популярности в сообществе Python.