問題描述
- 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。