Então, dada a sua pergunta, em última análise, sobre a execução de comandos sob o sudo com ansible, eu dei uma outra olhada em como o PATH é definido ao usar ansible -s -a env
. Eu acho que é importante notar que ao usar o sinalizador sudo -s
em ansible, o $ PATH é definido por um mecanismo diferente ao usar apenas ansible -a env
.
Ao usar sudo command
ou ansible -s
, o ambiente dos usuários é redefinido e $ PATH é controlado pela configuração Default secure_path
em /etc/sudoers
e isso é explicado no sudoers do homem documentação;
By default, the env_reset option is enabled. This causes commands to
be executed with a new, minimal environment. The new environment
contains the TERM, PATH, HOME, MAIL, SHELL, LOGNAME, USER, USERNAME
and SUDO_* variables in addition to variables from the invoking
process permitted by the env_check and env_keep options.
Se você não definir um valor para Default secure_path
, esses valores serão codificados para o binário sshd, consulte esta resposta para detalhes.
No entanto, por padrão, no fedora / centros / ubuntu, o valor para $ PATH é obtido de secure_path definido em /etc/sudoers
;
secure_path - Path used for every command run from sudo.
Por exemplo, no meu host local fedora, ele tem a seguinte linha em /etc/sudoers
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
e se eu executar o comando env
remotamente por ssh e sudo, obtenho o caminho exato de volta;
$ ssh localhost "sudo env" | grep PATH
PATH=/sbin:/bin:/usr/sbin:/usr/bin
e eu recebo a mesma coisa usando ansible;
$ ansible localhost -s -a 'env' | grep PATH
PATH=/sbin:/bin:/usr/sbin:/usr/bin
e eu tentei a mesma coisa em uma instância raspbian (debian) e obtive um comportamento semelhante;
$ ansible raspberrypi -s -a 'cat /etc/sudoers' | grep secure
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
e esse é o caminho que ansible vê com as opções -s -a
;
$ ansible raspberrypi -s -a env | grep PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Portanto, em relação à sua pergunta original, eu verificaria o arquivo /etc/sudoers
e verificaria o valor de Defaults secure_path="/some/path/here"
.
Se você não tiver um valor lá que inclua o diretório sbin/
apropriado, o seguinte comando em ansible não funcionará sem um caminho completo fornecido;
ansible multi -s -a "service ntpd stop"