ansible ssh vagrant vm but connect refused

问题描述

  • ansible需要在vagrant构建的virtual box中配置环境。
  • 但是首先ansible需要能够通过ssh登录到vagrnat vM中。
  • 因此使用了官网配置方式:在inventory中配置一个slave host:
slave_service ansible_ssh_host=127.0.0.1 
ansible_ssh_port=2257 ansible_ssh_user='vagrant' ansible_ssh_private_key_file='/Users/pezhang/test/.vagrant/machines/default/virtualbox/private_key'
  • 但是Failed to connect to the host via ssh: ssh: connect to host 127.0.0.1 port 2233: Connection refused

解决步骤

  • Q1:为什么Connection refused ?
  • A1: ansible在本机尝试登陆到vagrant的虚拟机失败。我考虑可能是密码或者身份验证有问题。先考虑一下整个登陆过程:

    首先A要想登陆到B,

    • 要么A有B的登陆密码。
    • 要么A将自己的公钥配到了B的authorized_keys,然后带着对应的私钥登录

  • Q2:那么ansible登录vagrant采用的是什么方式呢?
  • A2:采用的是配置公钥私钥的方式。进入vagrant可以看.ssh文件夹中拥有一个authorized_keys里面正好配置了一个公钥。而且我们在配置ansible的host的时候还配置了一个私钥文件。因此正好符合免密码登陆。首先vagrant生成一个私钥放在我们的.vagrant/machines/default/virtualbox/private_key然后将对应的公钥放入到authorized_keys中这样就可以正常登陆了。

  • Q3:那么密码既然没有问题那么到底是哪里出现问题?
  • A3:在网上查资料的时候突然看到了ssh service。那么说明处理所有ssh事物的是一个ssh service,并且ssh service有个默认的启动端口22,就去修改了ansible inventory的文件将ansible_ssh_port=2257改成了22。发现任然失败。

  • Q4:那么为什么失败还是报错一样?
  • A4:认真看报错信息发现:Failed to connect to the host via ssh: ssh: connect to host 127.0.0.1 port 22:是登录到localhost的22端口失败。首先我们应该是去找vm的22端口而不是本机的端口。说明我们connect的对象一开始就是错的。

  • Q5:那么我们该如何connect vm呢?我不知道他的IP
  • A5:我猜想可以使用private network将vm的网络调整到和local在同一个网络就可以访问了,修改inventory文件slave_service ansible_ssh_host=192.168.33.10 ansible_ssh_port=22 ansible_ssh_user='vagrant' ansible_ssh_private_key_file='/Users/pezhang/test/.vagrant/machines/default/virtualbox/private_key
    -但是仍然出错Add correct host key in /Users/pezhang/.ssh/known_hosts to get rid of this message.\r\nOffending ECDSA key in /Users/pezhang/.ssh/known_hosts:8\r\nECDSA host key for 192.168.33.10 has changed and you have requested strict checking

  • Q6:那么为什么又会出错明明从ip到端口都没有错啊?
  • A6:错误提示到了我本机的.ssh文件,我猜测一定是主机使用了自己的私钥登录而不是配置的私钥,因为错误提示中已经访问到了我本机的~/.ssh文件。一旦这样一定会导致公钥私钥不匹配。

  • Q7:那么如何才能强制ssh的时候使用给定的私钥文件呢?
  • A7:正常情况一旦我们访问其他域名一定导致要带上local的私钥,因此这也就解释了官网使用的127.0.0.1,我们还是使用ansible_ssh_host=127.0.0.1,然后能访问到vm的22端口即可。因此我使用了vagrant config.vm.network "forwarded_port", guest: 22, host: 2223然后修改ansible_ssh_port=2223发现链接成功。

  • Q8:那么为什么这样能成功,ssh的机制到底是什么?
  • A8:我想过程可能是这样的:每台机器的ssh service都默认启动在22端口,所以当你要ssh到一台机器上的时候,就是向某台机器的22端口发送请求。我们链接vm也是向vm上的22端口发送请求,我们把vm的22端口映射到本机的2223端口,直接向本机的2223端口发送请求就是vm的22端口在处理我们的ssh请求所以就可以成功了

但是其实我还有最后一个问题 为啥登录到127.0.0.1:2223端口就可以使用这里/Users/pezhang/test/.vagrant/machines/default/virtualbox/private_key的私钥,而访问其他域名就使用的是我.ssh的私钥?

反思

  • 遇到问题没有考虑去了解相应的知识然后再去解决,每次都是删除重试,然后某一次恰巧成功了就以为自己成功了,下次再失败都不知道噶如何解决

action

  • 要求自己以后每个问题解决了必须说明为什么这种方式能够work。

你可能感兴趣的:(ansible ssh vagrant vm but connect refused)