Puppet 生成的 systemd 单元文件?

Fra*_*eil 4 puppet

我希望以下内容能够真正启动我的服务:

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',
}
Run Code Online (Sandbox Code Playgroud)

我知道并理解 start 命令不正确,但我不知道如何启动实际的 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',
}
Run Code Online (Sandbox Code Playgroud)

有点像cron。我习惯了daemontools,systemd的模型完全不同。我必须自己创建单元文件吗?并链接单元文件?

我找到了如何使用 puppet 启用 systemd 实例化服务?它启动某种 USB 设备。我还发现了似乎管理 systemd 本身的camptocamp/puppet-systemd。Puppet 关于systemd 服务提供商的文档在细节上相当稀少。

如何使用 Puppet 创建一个 systemd 服务?

小智 12

是的,您需要创建一个单元文件。您在那里指定的命令属性实际上不是服务资源的有效属性

你最好在你的单元文件中添加一个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
Run Code Online (Sandbox Code Playgroud)

然后,在 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,
}
Run Code Online (Sandbox Code Playgroud)

现在完成了,您可以正常启动服务:

service { 'myservice':
  ensure   => running,
  enable   => true,
  provider => provider,
}
Run Code Online (Sandbox Code Playgroud)