2017-03-01 150 views
0

創建的VM我有一個非常簡單的Vagrantfile:Ansible無法通過SSH進入由流浪

config.vm.define "one" do |one| 
    one.vm.box = "centos/7" 
end 
config.ssh.insert_key = false 
end 

(注意這是創建虛擬機,但以失敗退出,直到我安裝vbguest插件)VM創建

後我想執行一個簡單的Ansible工作。我的清單文件(流浪轉發來賓22端口2222上的主機):

[one] 
127.0.0.1 ansible_ssh_port=2222 ansible_ssh_user=vagrant ansible_ssh_private_key_file=C:/Users/Lukasz/.vagrant.d/insecure_private_key 

而這裏的泊塢命令(從Windows CMD):

docker run --rm -v /c/Users/Lukasz/ansible/ansible:/home:rw -w /home williamyeh/ansible:ubuntu14.04 ansible-playbook -i inventory/testvms site.yml --check -vvvv 

最後,這裏的輸出命令:

<127.0.0.1> ESTABLISH SSH CONNECTION FOR USER: vagrant 
<127.0.0.1> SSH: EXEC ssh -vvv -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o Port=2222 -o 'IdentityFile="C:/Users/Lukasz/.vagrant.d/insecure_private_key"' -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=vagrant -o ConnectTimeout=10 -o PreferredAuthentications=privatekey -o ControlPath=/root/.ansible/cp/ansible-ssh-%h-%p-%r 127.0.0.1 '/bin/sh -c '"'"'(umask 77 && mkdir -p "` echo ~/.ansible/tmp/ansible-tmp-1488381378.63-13786642598588 `" && echo ansible-tmp-1488381378.63-13786642598588="` echo ~/.ansible/tmp/ansible-tmp-1488381378.63-13786642598588 `") && sleep 0'"'"'' 
fatal: [127.0.0.1]: UNREACHABLE! => { 
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: OpenSSH_7.2p2 Ubuntu-4ubuntu2.1, OpenSSL 1.0.2g 1 Mar 2016\r\ndebug1: Reading configuration data /etc/ssh/ssh_config\r\ndebug1: /etc/ssh/ssh_config line 19: Applying options for *\r\ndebug1: auto-mux: Trying existing master\r\ndebug1: Control socket \"/root/.ansible/cp/ansible-ssh-127.0.0.1-2222-vagrant\" does not exist\r\ndebug2: resolving \"127.0.0.1\" port 2222\r\ndebug2: ssh_connect_direct: needpriv 0\r\ndebug1: Connecting to 127.0.0.1 [127.0.0.1] port 2222.\r\ndebug2: fd 3 setting O_NONBLOCK\r\ndebug1: connect to address 127.0.0.1 port 2222: Connection refused\r\nssh: connect to host 127.0.0.1 port 2222: Connection refused\r\n", 
    "unreachable": true 
} 

我可以ssh到這個VM manualy沒有問題 - 指定用戶,端口和私鑰。

我做錯了什麼?

編輯1:

我已經安裝文件夾使用私鑰:-v /c/Users/Lukasz/.vagrant.d/:/home/.ssh/,並從清單文件中引用它:ansible_ssh_private_key_file=/home/.ssh/insecure_private_key。還在vagrantfile中分配了一個靜態IP,並將其用於docker命令中。 Errror現在是「連接超時」。

+0

Ansible在連接到主機127.0.0.1端口2222時,出現「連接被拒絕」。當你「ssh到這個VM manualy」時,你運行的是什麼實際的ssh命令? – Kenster

+0

ssh [email protected] -p2222 -i C:/Users/Lukasz/.vagrant.d/insecure_private_key –

回答

2

對環回地址的工作原理存在誤解,也低估了您實際運行的複雜系統。

在你的問題中所描述的場景中,你正在運行四臺機器有四個單獨的網絡堆棧:

  1. 物理機的Windows
  2. 一個CentOS VM(VirtualBox的下理應在運行,流浪策劃)
  3. 它在後臺運行,當您安裝泊塢的Windows(從你的句子判斷「泊塢窗命令(CMD)窗口」)泊塢窗Linux機器
  4. 的答案在Docker的Linux機器上運行的Ible容器

這些機器中的每一個都有自己的環回地址(127.0.0.1),這是無法從任何其他機器訪問的。


你有一個端口映射:

流浪設置的VirtualBox的控制下對TNT的CentOS虛擬機的映射,使虛擬機的端口22是在Windows機器上環回地址(127.0.0.1)2222端口訪問。

因此,您可以通過Windows連接SSH客戶端到CentOS機器。


然而,碼頭工人的Windows上運行一個獨立的Linux機器,並配置docker命令,這樣,當你從Windows命令行提示符下執行docker,你居然直接在此Linux機器上工作(因爲你運行的容器,你實際上並不需要直接訪問這個Docker主機,所以你可能不知道它的存在)。

就像這還不夠,你運行的每個容器都會有自己的環回127.0.0.1地址。

因此,Ansible容器無法達到物理Windows機器的環回地址。


也許最簡單的解決辦法是通過添加例如以下行Vagrantfile配置CentOS的盒子到公共網絡上運行,使用靜態IP地址(請參閱Vagrant: Public Networks):

config.vm.network "public_network", ip: "192.168.0.17" 

那麼你應該在清單文件中使用這個地址,並按照Konstantin's advice使可用的私有密鑰容器:

[one] 
192.168.0.17 ansible_ssh_user=vagrant ansible_ssh_private_key_file=/path/to/insecure_private_key/mapped/inside/container 
+0

OMG,我怎麼能錯過?接得好! –

+0

我照你的建議做了。執行命令時,現在有一個「連接超時」錯誤。另外 - 我無法使用該靜態IP從我的主機ssh到虛擬機 - 「連接超時」以及 –

+0

您似乎知道您需要修復,現在您應該修復它。 – techraf

1

看起來您在清單中指定了ansible_ssh_private_key_file的Windows路徑,但在容器內使用此清單。

您應該將C:/Users/Lukasz/.vagrant.d/映射到您的容器中,並從容器的角度設置ansible_ssh_private_key_file

+0

確實,但我認爲還有比這更大的問題... – techraf