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

Как перезапустить службу systemd без tty?

Возможно, я неправильно смотрю на это, но я пытаюсь настроить свой 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, и я подумал, что могу обернуть его в файл оболочки. Но это ничего не изменило.

Итак, как мне разрешить моему пользователю 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'ing на gitlab-runner и выполнив команду без ошибок, но снова ошибка указывает на то, что мне даже нельзя разрешить использовать ключевое слово sudo вообще. Вот соответствующая запись sudoers:

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

Спасибо

Итак, покопавшись еще немного, выясняется, что в моем файле sudoers была запись:

Defaults requiretty

Комментирование этого устраняет проблему, а некоторые исследовательская работа похоже, что нет никакой реальной выгоды от его хранения.

Я делаю что-то подобное. Вы не в этом случае нужен TTY, но вы делать необходимо для пути, который вы вызываете с помощью sudo, чтобы точно соответствовать тому, что находится в вашем sudoers файл. В вашем случае это означает, что вам необходимо убедиться, что ваш сценарий перезапуска:

 sudo /bin/systemctl restart my-app

И нет

 sudo systemctl restart my-app

Вы можете легко проверить, что ваш sudo установка работает правильно, становясь root и используя su -l gitlab-runner стать этим пользователем. Наконец, запустите вручную restart.sh сценарий. Вам следует не будет запрошен пароль (который пытается использовать TTY).