我可以正常使用 ssh,但 ansible 说“没有到主机的路由”

问题描述 投票:0回答:2

我编写了一个脚本来使用 vagrant 运行多个虚拟机,然后我必须使用 ansible 对其进行配置。不幸的是,我的主机是一台 Windows 机器,所以我认为我可以通过将所有虚拟机放入一个 VPN 中,然后从同一 VPN 中的另一台机器配置它们来解决问题。

理论上,它是有效的......我可以毫无问题地 ssh 进入其他机器。但是当我运行我的 ansible 剧本时,ansible 失败了。

首先,当使用

ssh: connect to host 10.1.2.100 [10.1.2.100] port 22: No route to host
 运行 ansible 时,我收到消息“
-vvvv

这是在晚上,我很累,第二天早上这个错误就没有再出现。不确定这是否与我正在进行部署的虚拟机同时重新启动有关,或者接收计算机从那时起被完全销毁和升级有关。无论如何,问题并没有消失。

重新创建两个虚拟机后,现在的结果:

# ansible-playbook -i vms -k -u vagrant vms.yml -vvvv

result:

<10.1.2.100> ESTABLISH SSH CONNECTION FOR USER: vagrant <10.1.2.100>
SSH: EXEC sshpass -d14 ssh -C -vvv -o ServerAliveInterval=50 -o
User=vagrant -o ConnectTimeout=10 -tt 10.1.2.100 '( umask 22 && mkdir
-p "$( echo $HOME/.ansible/tmp/ansible-tmp-1455781388.36-25193904947084 )" && echo
"$( echo $HOME/.ansible/tmp/ansible-tmp-1455781388.36-25193904947084
)" )' fatal: [10.1.2.100]: FAILED! => {"failed": true, "msg": "ERROR!
Using a SSH password instead of a key is not possible because Host Key
checking is enabled and sshpass does not support this.  Please add
this host's fingerprint to your known_hosts file to manage this
host."}

到目前为止还很清楚。我通过 ssh 进入另一个实例,将其添加到已知主机。这可以毫无问题地工作。

回到ansible,我再次尝试相同的命令。现在的结果是:

<10.1.2.100> ESTABLISH SSH CONNECTION FOR USER: vagrant <10.1.2.100>
SSH: EXEC sshpass -d14 ssh -C -vvv -o ServerAliveInterval=50 -o
StrictHostKeyChecking=no -o User=vagrant -o ConnectTimeout=10 -tt
10.1.2.100 '( umask 22 && mkdir -p "$( echo $HOME/.ansible/tmp/ansible-tmp-1455782149.99-271768166468916 )" &&
echo "$( echo
$HOME/.ansible/tmp/ansible-tmp-1455782149.99-271768166468916 )" )'
<10.1.2.100> PUT /tmp/tmpXQKa8Z TO
/home/vagrant/.ansible/tmp/ansible-tmp-1455782149.99-271768166468916/setup
<10.1.2.100> SSH: EXEC sshpass -d14 sftp -b - -C -vvv -o
ServerAliveInterval=50 -o StrictHostKeyChecking=no -o User=vagrant -o
ConnectTimeout=10 '[10.1.2.100]' fatal: [10.1.2.100]: UNREACHABLE! =>
{"changed": false, "msg": "ERROR! SSH Error: data could not be sent to
the remote host. Make sure this host can be reached over ssh",
"unreachable": true}

嗯,我确保可以通过 ssh 访问主机,非常感谢! Ansible 仍然无法通过,我快要因为想到可能是问题的事情而得脑瘤了。

有什么建议可能是什么问题吗?

ssh ansible
2个回答
2
投票

此问题已在此处报告,并提供了一些解决方法: https://github.com/ansible/ansible/issues/15321

共识似乎是:使用

ansible_password
或 b。在连接参数中使用
-u username
。但是,任何事情都可能会破坏 SSH 连接,使其对于更高级别的应用程序来说看起来“无法访问”,因此我建议执行该票证中概述的每个步骤。


0
投票

我有类似的错误消息,我可以解决。也许有人遇到同样的错误并发现这很有帮助:

我的设置如下(这是一个重要的区别): 我有一个具有多个虚拟机的主机,我正在启动一个 docker 容器,其中包含 一个简单的 ansible-playbook 来更新此虚拟机。

错误消息是:

TASK [Gathering Facts]
*********************************************************
    task path: /update-systems.yml:3 fatal: [test-worker]: UNREACHABLE! => {
    "changed": false,
    "msg": "Data could not be sent to remote host \"192.168.0.2\". Make sure this host can be reached over ssh: OpenSSH_8.9p1 Ubuntu-3ubuntu0.4, OpenSSL 3.0.2 15 Mar 2022\r\ndebug1: Reading configuration data /etc/ssh/ssh_config\r\ndebug1: /etc/ssh/ssh_config line 19: include /etc/ssh/ssh_config.d/*.conf matched no files\r\ndebug1: /etc/ssh/ssh_config line 21: Applying options for
*\r\ndebug2: resolve_canonicalize: hostname 192.168.0.2 is address\r\ndebug3: expanded UserKnownHostsFile '~/.ssh/known_hosts' -> '/root/.ssh/known_hosts'\r\ndebug3: expanded UserKnownHostsFile '~/.ssh/known_hosts2' -> '/root/.ssh/known_hosts2'\r\ndebug1: auto-mux: Trying existing master\r\ndebug1: Control socket \"/root/.ansible/cp/163fdfac79\" does not exist\r\ndebug3: ssh_connect_direct: entering\r\ndebug1: Connecting to 192.168.0.2 [192.168.0.2] port 22.\r\ndebug3: set_sock_tos: set socket 3 IP_TOS 0x10\r\ndebug2: fd 3 setting O_NONBLOCK\r\ndebug1: connect to address
192.168.0.2 port 22: Connection refused\r\nssh: connect to host 192.168.0.2 port 22: Connection refused\r\n",
    "unreachable": true }

我能够启动 docker 容器并手动运行 ansible-playbook,没有任何问题。但是使用 shell 脚本作为运行 ansible-playbook 的参数来启动 docker 容器失败了。

在容器中运行的shell脚本中的解决方案:

睡10

不知何故,docker 容器已准备好在网络完全初始化之前执行某些操作,从而导致此错误。

© www.soinside.com 2019 - 2024. All rights reserved.