Temos um cluster Galera operacional no CentOS 7 com sysv e estamos procurando migrar para o systemd. Estamos invocando um wsrep_notify_cmd para notificar nossa aplicação de mudanças nos estados de nós, e precisamos combinar isso com sudo porque nosso aplicativo está em um diretório com outro usuário / grupo ao qual mysql não tem acesso.
Com o sysv init, isso funciona bem, pois o comando / script é iniciado como root. Com o systemd, o comando / script é iniciado sob o mysql user - portanto, precisamos configurar os sudoers para que ele funcione. Ou então pensamos.
Depois de mudar para o systemd, continuei vendo sudo: unable to change to sudoers gid: Operation not permitted em nossos logs, então fiz alguns testes / depurações com a idéia de primeiro iniciar um script para o qual mysql tenha direitos, e esse script, por sua vez, passará os argumentos wsrep_notify_cmd para outro script ( /data/app/notify.sh ) usando sudo .
Observação: o SELinux está desativado.
configuração do servidor MySQL
Configuração do servidor (teste) do MySQL: wsrep_notify_cmd='/mysql/notify.sh'
Configuração de Sudoers
/etc/sudoers.d/mysql está configurado da seguinte forma:
Defaults:mysql !requiretty
Defaults:mysql umask=0007
Cmnd_Alias NOTIFY = /bin/bash /data/app/notify.sh*
mysql ALL=(app_user) NOPASSWD: NOTIFY
Teste manual
Agora, sudo su - mysql e, em seguida, a execução manual de /mysql/notify.sh funciona bem:
[mysql@testhost /mysql]$ /bin/sudo -u app_user /bin/bash /data/app/notify.sh --status Synced
[mysql@testhost /mysql]$
O script /data/app/notify.sh , sendo executado como app_user grava todos os parâmetros passados em um arquivo - e executa com êxito a execução do comando acima manualmente:
[root@testhost /data/app]# cat output.log
--status Synced
Mesma coisa, mas de dentro do systemd mysql service init
No entanto, ao fazer service mysql start , o script /mysql/notify.sh não executará seu trabalho como deveria e, em vez disso, negará acesso a qualquer sudo comando: sudo: unable to change to sudoers gid: Operation not permitted .
Estou executando este script usando #!/bin/bash -xv e redirecionando o stderr para um arquivo de log:
[mysql@testhost /mysql]$ cat debug.log
file=/mysql/args.log
+ file=/mysql/args.log
echo $USER
+ echo mysql
ARGS="$@"
+ ARGS='--status Synced'
/bin/sudo -K
+ /bin/sudo -K
sudo: unable to change to sudoers gid: Operation not permitted
/bin/sudo -u app_user /bin/bash /data/app/notify.sh $ARGS
+ /bin/sudo -u app_user /bin/bash /data/app/notify.sh --status Synced
sudo: unable to change to sudoers gid: Operation not permitted
Como você pode ver, o mesmo comando que eu consegui executar manualmente a partir do shell de usuário mysql está NOT funcionando ao ser invocado a partir do mesmo script ao ser executado como parte do systemd service mysql start .
O que poderia causar isso?