ansible ssh vagrant vm but connect refused

問題描述

  • ansible需要在vagrant構(gòu)建的virtual box中配置環(huán)境。
  • 但是首先ansible需要能夠通過ssh登錄到vagrnat vM中。
  • 因此使用了官網(wǎng)配置方式:在inventory中配置一個(gè)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在本機(jī)嘗試登陸到vagrant的虛擬機(jī)失敗。我考慮可能是密碼或者身份驗(yàn)證有問題。先考慮一下整個(gè)登陸過程:

    首先A要想登陸到B,

    • 要么A有B的登陸密碼。
    • 要么A將自己的公鑰配到了B的authorized_keys,然后帶著對(duì)應(yīng)的私鑰登錄

  • Q2:那么ansible登錄vagrant采用的是什么方式呢?
  • A2:采用的是配置公鑰私鑰的方式。進(jìn)入vagrant可以看.ssh文件夾中擁有一個(gè)authorized_keys里面正好配置了一個(gè)公鑰。而且我們?cè)谂渲胊nsible的host的時(shí)候還配置了一個(gè)私鑰文件。因此正好符合免密碼登陸。首先vagrant生成一個(gè)私鑰放在我們的.vagrant/machines/default/virtualbox/private_key然后將對(duì)應(yīng)的公鑰放入到authorized_keys中這樣就可以正常登陸了。

  • Q3:那么密碼既然沒有問題那么到底是哪里出現(xiàn)問題?
  • A3:在網(wǎng)上查資料的時(shí)候突然看到了ssh service。那么說明處理所有ssh事物的是一個(gè)ssh service,并且ssh service有個(gè)默認(rèn)的啟動(dòng)端口22,就去修改了ansible inventory的文件將ansible_ssh_port=2257改成了22。發(fā)現(xiàn)任然失敗。

  • Q4:那么為什么失敗還是報(bào)錯(cuò)一樣?
  • A4:認(rèn)真看報(bào)錯(cuò)信息發(fā)現(xiàn):Failed to connect to the host via ssh: ssh: connect to host 127.0.0.1 port 22:是登錄到localhost的22端口失敗。首先我們應(yīng)該是去找vm的22端口而不是本機(jī)的端口。說明我們connect的對(duì)象一開始就是錯(cuò)的。

  • Q5:那么我們?cè)撊绾蝐onnect vm呢?我不知道他的IP
  • A5:我猜想可以使用private network將vm的網(wǎng)絡(luò)調(diào)整到和local在同一個(gè)網(wǎng)絡(luò)就可以訪問了,修改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
    -但是仍然出錯(cuò)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:那么為什么又會(huì)出錯(cuò)明明從ip到端口都沒有錯(cuò)?。?/li>
  • A6:錯(cuò)誤提示到了我本機(jī)的.ssh文件,我猜測(cè)一定是主機(jī)使用了自己的私鑰登錄而不是配置的私鑰,因?yàn)殄e(cuò)誤提示中已經(jīng)訪問到了我本機(jī)的~/.ssh文件。一旦這樣一定會(huì)導(dǎo)致公鑰私鑰不匹配。

  • Q7:那么如何才能強(qiáng)制ssh的時(shí)候使用給定的私鑰文件呢?
  • A7:正常情況一旦我們?cè)L問其他域名一定導(dǎo)致要帶上local的私鑰,因此這也就解釋了官網(wǎng)使用的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發(fā)現(xiàn)鏈接成功。

  • Q8:那么為什么這樣能成功,ssh的機(jī)制到底是什么?
  • A8:我想過程可能是這樣的:每臺(tái)機(jī)器的ssh service都默認(rèn)啟動(dòng)在22端口,所以當(dāng)你要ssh到一臺(tái)機(jī)器上的時(shí)候,就是向某臺(tái)機(jī)器的22端口發(fā)送請(qǐng)求。我們鏈接vm也是向vm上的22端口發(fā)送請(qǐng)求,我們把vm的22端口映射到本機(jī)的2223端口,直接向本機(jī)的2223端口發(fā)送請(qǐng)求就是vm的22端口在處理我們的ssh請(qǐng)求所以就可以成功了

但是其實(shí)我還有最后一個(gè)問題 為啥登錄到127.0.0.1:2223端口就可以使用這里/Users/pezhang/test/.vagrant/machines/default/virtualbox/private_key的私鑰,而訪問其他域名就使用的是我.ssh的私鑰?

反思

  • 遇到問題沒有考慮去了解相應(yīng)的知識(shí)然后再去解決,每次都是刪除重試,然后某一次恰巧成功了就以為自己成功了,下次再失敗都不知道噶如何解決

action

  • 要求自己以后每個(gè)問題解決了必須說明為什么這種方式能夠work。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,569評(píng)論 19 139
  • 接上一篇總結(jié)了ansible的基本用法,這一次通過部署一個(gè)博客站點(diǎn)的例子來(lái)進(jìn)行ansible實(shí)戰(zhàn)。分為四個(gè)部分,第...
    __七把刀__閱讀 2,075評(píng)論 0 11
  • 1,介紹Vagrant 我們做web開發(fā)的時(shí)候經(jīng)常要安裝各種本地測(cè)試環(huán)境,比如apache,php,mysql,r...
    meng_philip123閱讀 2,644評(píng)論 0 12
  • 開發(fā)需要在各種系統(tǒng)上進(jìn)行開發(fā)任務(wù),運(yùn)維則需要在各種系統(tǒng)上學(xué)習(xí)工具使用。因此,虛擬機(jī)恐怕也是 IT 人員最常使用的工...
    李廣慧閱讀 5,692評(píng)論 3 24
  • Summary based on Ansible Tutorial Basic default inventory...
    abrocod閱讀 801評(píng)論 0 5

友情鏈接更多精彩內(nèi)容