Я ожидал, что на самом деле моя служба запустит следующее:
service{'legacy':
ensure => running,
start => "cd /vagrant/nginx-reverse-proxy/legacy && /usr/bin/bundle exec ruby app.rb -o 127.0.0.1 -e production -p ${port}",
provider => 'systemd',
}
Я знаю и понимаю, что команда запуска неверна, но я не знаю, как запустить настоящее приложение Ruby Sinatra. Я действительно ожидал, что что-то вроде этого сработает:
service{'legacy':
ensure => running,
command => "cd /vagrant/nginx-reverse-proxy/legacy && /usr/bin/bundle exec ruby app.rb -o 127.0.0.1 -e production -p ${port}",
provider => 'systemd',
}
Немного похоже на cron. Я привык к daemontools, а модель systemd совершенно другая. Должен ли я сам создавать файл модуля? И связать юнит-файл?
я обнаружил Как включить службу с экземпляром systemd с помощью марионетки? который запускает какое-то USB-устройство. Я также нашел Camptocamp / марионетка-systemd который, кажется, управляет самим systemd. Документы Puppet на поставщик услуг systemd довольно скудны в деталях.
Как создать службу systemd с помощью Puppet?
Да, вам нужно создать файл модуля. Атрибут команды, который вы указали, на самом деле не действительный атрибут для сервисного ресурса
Лучше всего добавить Шаблон ERB с вашим модульным файлом, вот пример:
[Unit]
Description=My Ruby Service
Wants=basic.target
After=basic.target network.target
[Service]
WorkingDirectory=/vagrant/nginx-reverse-proxy/legacy
ExecStart=/usr/bin/bundle exec ruby app.rb -o 127.0.0.1 -e production -p 4567"
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
Затем настройте шаблон в Puppet и убедитесь, что вы обновили systemd. Пример кода:
file { '/lib/systemd/system/myservice.service':
mode => '0644',
owner => 'root',
group => 'root',
content => template('modulename/myservice.systemd.erb'),
}~>
exec { 'myservice-systemd-reload':
command => 'systemctl daemon-reload',
path => [ '/usr/bin', '/bin', '/usr/sbin' ],
refreshonly => true,
}
Теперь, когда все готово, вы можете запустить службу как обычно:
service { 'myservice':
ensure => running,
enable => true,
provider => provider,
}