如何在没有tty的情况下重新启动systemd服务?

也许我看着这个错误的方式,但我想设置我的gitlab ci能够自动部署代码推。 看起来像一个相当简单的过程,我已经成功地把它的大部分工作。 我可能完全误解了systemd是如何工作的,因为我相当陌生。

我有一个节点应用程序,我推到gitlab,这将成功启动部署逻辑,但我所做的最后一步是重新启动应用程序,以确保我实际上拉入所有的代码更改(据我所知,模块的更改不会发生w / o重新启动服务,因为npm高速caching一旦需要保持在内存中的模块)。

我的gitlab ci yaml文件如下所示:

stages: - deploy deploy-prod: stage: deploy variables: BRANCH_REF: master script: - git fetch - git checkout $BRANCH_REF - git pull origin $BRANCH_REF - npm install - rm -rf /opt/my-app/www - ln -s $CI_PROJECT_DIR /opt/my-app/www - sh /home/gitlab-runner/restart.sh tags: - production 

我可能不需要间接的符号链接,但是这个问题并不重要。 我做了那个restart.sh文件,因为我得到了错误的sudo: sorry, you must have a tty to run sudo ,我想我可以把它包装在一个shell文件。 但是这并没有改变事情。

那么,如何让我的gitlab-runner用户在更新文件时重新启动服务呢?

我的systemdconfiguration如下所示:

 [Unit] After=mongod.service [Service] ExecStart=/usr/bin/node /opt/my-app/www/server Restart=always StandardOutput=syslog StandardError=syslog SyslogIdentifier=my-app User=my-app Group=my-app Environment=NODE_ENV=production 

而我的visudo设置为允许git-runner用户运行systemctl restart my-app.service而不需要密码,并且我已经通过su_ingtesting了gitlab-runner并且没有错误地运行命令,但是错误又一次表示我甚至不应该被允许使用关键字sudo 。 这是相关的sudoers条目:

gitlab-runner ALL=(ALL) NOPASSWD: /bin/systemctl restart my-app

谢谢

我做了很多这样的事情。 在这种情况下,你不需要 TTY,但是你需要使用sudo调用的path与sudoers文件中的内容完全一致。 在你的情况下,这意味着你需要确保你的重启脚本脚本:

  sudo /bin/systemctl restart my-app 

并不是

  sudo systemctl restart my-app 

你可以很容易的testing你的sudo安装程序是否正在成为root用户,并使用su -l gitlab-runner来成为这个用户。 最后,手动运行你的restart.sh脚本。 你不应该被提示input密码(这是尝试使用TTY的部分)。

好的,在挖了一些之后,我发现sudoers文件中有这个条目:

 Defaults requiretty 

评论说,这个问题解决了这个问题,而且从一些研究来看,它似乎没有真正的安全利益。