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

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

也许我的看法是错误的,但我正在尝试设置我的 gitlab ci 以便能够在推送时自动部署代码。这似乎是一个相当简单的过程,我已经成功地完成了大部分工作。我可能完全误解了 systemd 的工作原理,因为我对它还很陌生。

我有一个正在推送到 gitlab 的节点应用程序,它将成功启动部署逻辑,但我要做的最后一步是重新启动该应用程序,以确保我实际上提取了所有代码更改(据我了解,如果不重新启动服务,模块就不会发生更改,因为 npm 缓存会在需要时将模块保存在内存中)。

我的 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 用户在更新文件时重新启动服务?

我的 systemd 配置如下:

[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 进入 gitlab-runner 并运行命令成功测试了这一点,没有出现错误,但错误再次表明我根本不应该被允许使用关键字sudo。以下是相关的 sudoers 条目:

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

谢谢

答案1

我做了类似的事情。你在这种情况下需要 TTY,但是你需要确保使用 sudo 调用的路径与文件中的内容完全匹配sudoers。对于您来说,这意味着您需要确保您的重启脚本执行以下任务:

 sudo /bin/systemctl restart my-app

并不是

 sudo systemctl restart my-app

您可以轻松测试您的sudo设置是否正常工作,成为 root 并使用su -l gitlab-runner成为该用户。最后,手动运行您的restart.sh脚本。您应该不是提示输入密码(这是尝试使用 TTY 的部分)。

答案2

好的,经过进一步挖掘之后,发现我的 sudoers 文件中存在以下条目:

Defaults requiretty

评论解决了这个问题,从一些研究看起来把它放在那里并没有真正的安全益处。

相关内容