在SSH中,我可以使用公司VPN和代理连接两台不同的机器。
为此,我的~/.ssh/config有两个主机定义如下:
Host foobar
User alice
HostName XXX.XXX.XXX.XXX
ProxyCommand nc -x proxy-socks.foobar.com:4242 %h %p对于两台主机,ProxyCommand是相同的,只有HostName和User不同。每个主机都有我的公钥,我只需输入ssh foobar就可以连接到每个主机,不需要密码。
现在,我试着用ansible在这些机器上行动。我有一个类似的inventory.cfg,列出了~/.ssh/config中定义的两台机器的名称
[vpn]
foobar
barfoo我尝试了这个简单的命令:
ansible -i inventory.cfg vpn -m ping这对其中一台机器有效,但对另一台不起作用。以下是经过编辑的输出:
foobar | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
barfoo | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: Welcome on barfoo [...] Permission denied (keyboard-interactive).",
"unreachable": true
}由于我从输出中的主机获得了“欢迎”消息,这意味着我到达了主机(因此代理配置应该是正常的)。但我无法理解错误“权限被拒绝(键盘交互)”。我可以在没有密码的情况下通过SSH连接到这台机器(实际上,管理员甚至禁用了密码认证,我不得不通过电子邮件向他们发送我的公钥)。
我试图通过添加--private-key $HOME/.ssh/id_rsa来说明我的SSH键,但是错误消息完全相同。
出于好奇,我尝试使用Python的包fabric,但这对两台机器都很好:
import fabric
fabric.Connection('barfoo').run('hostname')所以似乎在ansible和这个机器配置之间发生了一些奇怪的事情。有线索吗?
编辑
使用@GeralexGR的建议,我在ansible命令中添加了-vvvv以获得更多的输出。
在输出中,我可以看到ansible正在调用SSH:
ssh -vvv -C -o ControlMaster=auto -o ControlPersist=60s -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o ConnectTimeout=10 -o 'ControlPath="/home/alice/.ansible/cp/dbd7338475"' barfoo '/bin/sh -c '"'"'echo ~ && sleep 0'"'"''通过反复尝试,我可以将这个命令简化为以下命令:
ssh -vvv -o PreferredAuthentications=publickey barfoo 'hostname'此命令在一台计算机上失败,但另一台计算机失败。但是,如果我删除了PreferredAuthentications选项,那么它在两台机器上都能正常工作。
当它失败时,它会输出类似这样的内容:
debug1: Next authentication method: publickey
debug1: Offering public key: [...]
[...]
debug1: Server accepts key: [...]
[...]
Authenticated with partial success.
debug1: Authentications that can continue: keyboard-interactive
debug3: start over, passed a different list keyboard-interactive
debug3: preferred publickey
debug1: No more authentication methods to try.如果删除此选项并执行一个简单的ssh -vvvv,则在输出中得到如下结果:
debug1: Next authentication method: publickey
debug1: Offering public key: [...]
[...]
debug1: Server accepts key: [...]
[...]
Authenticated with partial success.
debug1: Authentications that can continue: keyboard-interactive
[...]
debug1: Next authentication method: keyboard-interactive
debug2: userauth_kbdint
[...]
debug1: Authentication succeeded (keyboard-interactive).所以,我猜这台机器需要keyboard-interactive。实际上,如果我同时将publickey和keyboard-interactive放在选项中,这是可行的:
ssh -vvv -o preferredauthentications=publickey,keyboard-interactive barfoo 'hostname'所以,回到ansible,我尝试了这个:
ansible -vvvv --ssh-extra-args='-o preferredauthentications=publickey,keyboard-interactive' -i inventory.cfg -m ping vpn但是它还是失败了,我想这种认证机制是不可能的吗?我不知道为什么/如何在这里需要键盘交互,因为我从来没有提示输入密码。我会问机器的管理员。
发布于 2022-02-21 08:59:00
@Zeitounator在评论中给出了解决办法。
我在我的inventory.cfg文件中添加了这两行(带有虚拟密码):
[vpn:vars]
ansible_ssh_pass=foo现在,初始的ansible命令运行良好。
或者,在命令行上使用--ask-pass选项也有效:
ansible --ask-pass -i inventory.cfg -m ping vpn关于上下文,我向机器管理员询问了一些更多的信息。这台机器不要求我提供密码或任何东西,但它要求一些外部用户(不是我)接受一些条款和条件。这就是为什么需要keyboard-interactive机制的原因。
https://stackoverflow.com/questions/71170226
复制相似问题