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

Перезапуск nginx и gunicorn без sudo

Могу я бежать systemctl restart gunicorn && systemctl restart nginx без sudo? В настоящее время я получаю:

out: для перезагрузки "gunicorn.service" требуется аутентификация.

out: Аутентификация как: myuser

out: Пароль:

# coding: utf-8
from fabric.api import *
from fabric.colors import green, red


def production():
    env.host_string = '159.xxx.xxx.xx'
    env.user = 'myuser'
    path = "/home/myuser/myproject/myproject"
    print(red("Beginning Deploy:"))
    with cd(path):
        with prefix('. /home/myuser/myproject/myenv/bin/activate'):
            run("pwd")
            print(green("Pulling master from git..."))
            run("git pull")
            print(green("Migrate the database..."))
            run("python3 manage.py migrate")
            print(green("Restart the uwsgi process"))
            run("systemctl restart gunicorn && systemctl restart nginx")
        print(red("DONE!"))

Вы можете попробовать добавить правило PolicyKit, чтобы разрешить перезапуск устройств без аутентификации.

Например, это позволит любому пользователю перезапустить названные службы (может потребоваться небольшая настройка):

polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.systemd1.manage-units") {
        polkit.log("action=" + action)
        polkit.log("subject=" + subject)
        polkit.log("unit="+action.lookup("unit"))
        polkit.log("verb="+action.lookup("verb"))
        if (action.lookup("unit") == "gunicorn.service" ||
            action.lookup("unit") == "nginx.service") {
            var verb = action.lookup("verb");
            if (verb == "start" || verb == "restart") {
                polkit.log("returning YES")
                return polkit.Result.YES;
            }
        }
    }
    polkit.log("returning NO")
});

Поместите свои правила в файл в /etc/polkit-1/rules.d каталог с именем, заканчивающимся на .rules.

Для этого требуется systemd 226 или выше, что в Ubuntu означает 16.04 LTS или новее.

(И если вы думаете, что это похоже на JavaScript, это потому, что это JavaScript.)

Вы также можете ограничить его конкретными пользователями, установив флажок subject.user, например:

if (subject.user == "deploy" || subject.user == "me") {