Я пытаюсь выполнить выпуск некоторого артефакта сборки на локальном агенте Linux Ubuntu. Я создал группу развертывания, установил агент Azure в Linux и добавил этот единственный агент в группу развертывания (так что я всегда могу выполнить выпуск на этом конкретном сервере).
Теперь я создал конвейер выпуска и хочу добавить задачи, которые на самом деле будут работать с nginx и systemctl: остановить работающую в данный момент службу API, удалить старые файлы, скопировать вновь извлеченные файлы артефактов сборки в тот же каталог, а затем запустить Сервис API снова использует systemctl start MyApp
.
Однако на самом первом этапе я столкнулся с проблемой, из-за которой я не могу остановить текущее приложение с помощью systemctl stop MyApp.service
, потому что оно не работает:
2024-08-20T20:17:46.5603236Z systemctl stop MyApp.service
2024-08-20T20:17:46.5605104Z ========================== Starting Command Output ===========================
2024-08-20T20:17:46.5716903Z [command]/usr/bin/bash --noprofile --norc /agents/tfs/_work/_temp/4bd66e7e-d175-4b2e-8c97-d462550ed6dd.sh
2024-08-20T20:17:46.6313304Z Failed to stop MyApp.service: Interactive authentication required.
2024-08-20T20:17:46.6315936Z See system logs and 'systemctl status MyApp.service' for details.
Когда я пытаюсь сделать то же самое, используя sudo sudo systemctl stop MyApp.service
), это тоже терпит неудачу:
2024-08-20T20:25:08.1783842Z sudo systemctl stop MyApp.service
2024-08-20T20:25:08.1784026Z ========================== Starting Command Output ===========================
2024-08-20T20:25:08.1828785Z [command]/usr/bin/bash --noprofile --norc /agents/tfs/_work/_temp/f4435275-bb73-4378-81a3-498a293b989b.sh
2024-08-20T20:25:08.1829490Z sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper
2024-08-20T20:25:08.1829704Z sudo: a password is required
Я не знаю, каков правильный обходной путь для этой проблемы, и не использую ли я неправильный подход к выпуску/развертыванию последней версии API. Есть ли другой подход, который я могу использовать или?
Не удалось остановить MyApp.service: требуется интерактивная аутентификация.
Когда вы запускаете systemctl
без sudo
, вы планируете задание systemd от имени текущего пользователя. Текущий пользователь не имеет доступа к выполнению этого действия.
Чтобы решить эту проблему, мы можем добавить sudo
для запуска команды: sudo systemctl stop MyApp.service
sudo: для чтения пароля требуется терминал; либо используйте опцию -S для чтения из стандартного ввода, либо настройте помощник Askpass
Я могу воспроизвести ту же проблему при использовании цели развертывания Linux.
Причина проблемы в том, что когда мы переходим к использованию команды sudo, ей необходимо ввести пароль текущей учетной записи пользователя. Но Pipeline не поддерживает интерактивный ввод.
Чтобы решить эту проблему, вам необходимо добавить текущего пользователя, который используется для запуска агента, в корневую группу.
sudo usermod -aG sudo tfs
Затем вы можете изменить использование следующей команды:
echo "$(password)" | sudo -S systemctl stop MyApp.service
Примечание. Вам необходимо ввести пароль текущей учетной записи пользователя, которая используется для запуска агента Azure.
Результат:
После запуска команды: systemctl status servicename
я вижу, что служба успешно остановлена.