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

Puppet сгенерировал файлы systemd?

Я ожидал, что на самом деле моя служба запустит следующее:

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,
}