我正在使用 ansible 连接到 centos 7 虚拟机和物理机,用户名为 ansible,该用户在所有机器上都具有无密码 sudo 权限。在大多数机器上都可以正常工作,但在一台机器上我收到此错误:
FAILED! => { "changed": false, "module_stderr": "Shared connection to ... closed.\r\n", "module_stdout": "/var/tmp/sclpbsoCZ: line 8: -H: command not found\r\n", "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", "rc": 127 }
我使用此链接中的建议设置了无密码 sudo: https://code-maven.com/enable-ansible-passwordless-sudo (基本上,编辑 /etc/sudoers 以让用户无需密码即可使用 sudo)
我以为这些机器是完全相同的,但显然有些不对劲。
在 ansible-playbook 命令中添加 -vvv 让我看到它尝试运行的命令是:
'/bin/sh -c '"'"'sudo -H -S -n -u root /bin/sh -c '
这台机器为什么不能与 ansible 一起工作?
答案1
我发现了这一点,但乍一看它似乎与 ansible 无关:
https://unix.stackexchange.com/questions/192809/sudo-i-returns-an-error
原来centos有scl(软件集合)可以启用。
我在启动时启用了 devtoolset-7:
https://www.softwarecollections.org/en/scls/rhscl/devtoolset-7/
这恰好用一个脚本包装了 sudo,而这个脚本似乎并没有真正处理原始 sudo 的所有选项。这似乎可以被视为 devtoolset-7 中的一个错误(或至少是不良行为)。
目前的解决方法是删除 /etc/profile.d/ 中启用 devtoolset-7 的条目。
它正在运行以下代码:
source /opt/rh/devtoolset-7/enable
如果我通过 ssh 进入机器并运行有问题的命令:
sudo -H -S -n -u root /bin/sh
它会给我同样的错误:
# sudo -H -S -n -u root /bin/sh /var/tmp/sclKpdWFR: line 8: -H: command not found
当我查询正在使用哪个 sudo 时,它向我指出了问题所在......
# which sudo /opt/rh/devtoolset-7/root/usr/bin/sudo
这是一个兔子洞!