Gestion du service SQL Server 2019 sur Ubuntu avec systemctl

Introduction

SQL Server 2019 est installé sur une plateforme Ubuntu 18.04. Dans l'architecture par défaut, SQL Server 2019 tourne avec le compte mssql.

Architecture SQL Server 2019 - Linux Ubuntu

Avec le compte mssql, le statut du service mssql-server est facilement obtenu :

mssql@vps$ systemctl status mssql-server
 mssql-server.service - Microsoft SQL Server Database Engine
   Loaded: loaded (/lib/systemd/system/mssql-server.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2019-05-31 11:20:09 CEST; 36min ago
     Docs: https://docs.microsoft.com/en-us/sql/linux
 Main PID: 1448 (sqlservr)
    Tasks: 182
   CGroup: /system.slice/mssql-server.service
           ├─1448 /opt/mssql/bin/sqlservr
           └─1460 /opt/mssql/bin/sqlservr

Mais en essayant de stopper/démarrer/redémarrer le service mssql-server avec systemctl, le mot de passe est demandé.

mssql@vps$ systemctl stop mssql-server
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to stop 'mssql-server.service'.
Multiple identities can be used for authentication:
 1.  Ubuntu (ubuntu)
 2.  mssql
Choose identity to authenticate as (1-2):
mssql@vps$ sudo systemctl stop mssql-server
[sudo] password for mssql:

On préfèrerait autoriser mssql à gérer son propre service sans ces saisies du mot de passe.

2 solutions sont possibles :

  • Définir mssql-server comme un service utilisateur avec le compte mssql.
  • Donner les droits avec aucun mot de passe sur le service système mssql-server au user mssql via sudo.

Solution 1 : Définir mssql-server comme un service utilisateur avec le compte mssql

Par défaut le service système mssql-server est défini dans le fichier /lib/systemd/system/mssql-server.service. Il s'agit d'une configuration classique d'un service.

/lib/systemd/system/mssql-server.service
[Unit]
Description=Microsoft SQL Server Database Engine
After=network.target auditd.service
Documentation=https://docs.microsoft.com/en-us/sql/linux

[Service]
ExecStart=/opt/mssql/bin/sqlservr
User=mssql
WorkingDirectory=/var/opt/mssql

# Kill root process
KillMode=process

# Wait up to 30 minutes for service to start/stop
TimeoutSec=30min

# Remove process, file, thread limits
#
LimitNPROC=infinity
LimitNOFILE=infinity
TasksMax=infinity
UMask=007

# Restart on non-successful exits.
Restart=on-failure

# Don't restart if we've restarted more than 3 times in 2 minutes.
StartLimitInterval=120
StartLimitBurst=3

[Install]
WantedBy=multi-user.target

Au lieu d'utiliser un service système, une bascule vers un service utilisateur mssql est réalisée.

Le service système mssql-server est d'abord arrêté et désactivé en tant que root :

root@vps$ systemctl stop mssql-server
          
root@vps$ systemctl disable mssql-server
          
root@vps$ systemctl daemon-reload

En tant que mssql, le fichier /lib/systemd/system/mssql-server.service est copié dans le répertoire $HOME/.config/systemd/user (répertoire des services du user mssql).

mssql@vps$ mkdir -p  $HOME/.config/systemd/user

mssql@vps$ cp /lib/systemd/system/mssql-server.service $HOME/.config/systemd/user

Dans ce fichier copié, 2 modifications à faire :

$HOME/.config/systemd/user/mssql-server.service
...
[Service]
# User=mssql
...
...
[Install]
WantedBy=default.target

La directive User=mssql est commentée, si ce n'est pas le cas un message d'erreur est levé à propos du groupe lors du fork.

  Process: 1904 ExecStart=/opt/mssql/bin/sqlservr (code=exited, status=216/GROUP)
 Main PID: 1904 (code=exited, status=216/GROUP)

Si le service utilisateur doit démarrer au boot de la machine, la directive WantedBy doit être à default.target et non multi-user.target, cette dernière n'est en effet appliquable que pour un service système au boot.

À cette étape, le service utilisateur peut déjà être géré par mssql, sans mot de passe demandé, systemctl est invoqué avec l'option --user :

mssql@vps$ systemctl --user daemon-reload
          
mssql@vps$ systemctl --user status mssql-server
● mssql-server.service - Microsoft SQL Server Database Engine
   Loaded: loaded (/home/mssql/.config/systemd/user/mssql-server.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
mssql@vps$ systemctl --user start|stop|restart mssql-server

Dernière étape, activer le service utilisateur mssql-server au (re)démarrage de la machine :

mssql@vps$ systemctl --user enable mssql-server

Ne pas oublier d'autoriser le user mssql à exécuter des services en mode non connecté, pour cela, en tant que root :

root@vps$ loginctl enable-linger mssql

Solution 2 : Donner les droits avec aucun mot de passe sur le service système mssql-server au user mssql via sudo.

Si on souhaite conserver le service mssql-server comme un service système, éditer le fichier /etc/sudoers avec visudo.

root@vps$ visudo

et ajouter les autorisations ci-dessous pour le user mssql dans ce fichier :

Cmnd_Alias MSSQL_CMDS = /bin/systemctl start mssql-server, /bin/systemctl stop mssql-server
mssql ALL=(root) NOPASSWD: MSSQL_CMDS

Utiliser le chemin complet /bin/systemctl, c'est recommandé pour le fichier sudoers.

Le compte mssql peut maintenant gérer le service système mssql-server sans être invité à saisir le mot de passe :

mssql@vps$ sudo systemctl start|stop mssql-server

Conclusion

Pour gérer le service mssql-server avec le compte mssql, 2 solutions faciles. Cela dépend essentiellement de la méthode préférée ou des contraintes entreprise et sécurité.