簡體   English   中英

Ansible無法ssh到由Vagrant創建的VM中

[英]Ansible cannot ssh into VM created by Vagrant

我有一個非常簡單的Vagrantfile:

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

(請注意,它正在創建虛擬機,但由於退出而失敗,直到我安裝了vbguest插件)

創建虛擬機后,我想執行一個簡單的Ansible作業。 我的清單文件(Vagrant將來賓上的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

這是Docker命令(來自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
}

我可以毫無問題地手動切換到該VM-指定用戶,端口和私鑰。

難道我做錯了什么?

編輯1:

我已經安裝了帶有私鑰的文件夾: -v /c/Users/Lukasz/.vagrant.d/:/home/.ssh/並從清單文件中引用它: ansible_ssh_private_key_file=/home/.ssh/insecure_private_key 還在vagrantfile中分配了靜態IP,並在docker命令中使用了它。 現在的錯誤是“連接超時”。

對環回地址的工作方式存在誤解,而且對您實際運行的系統有多么低估。

在問題描述的方案中,您正在運行具有四個單獨的網絡堆棧的四台計算機:

  1. 物理機Windows
  2. 一個CentOS VM(據說是在VirtualBox下運行,由Vagrant安排)
  3. 安裝Docker for Windows時在后台運行的Docker Linux機器(從您的句子“ docker命令(來自Windows cmd) ”判斷)
  4. 在Docker的Linux機器下運行的Ansible容器

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


您有一個端口映射:

Vagrant在VirtualBox的控制下為tnt CentOS虛擬機設置了一個映射,以便可以在Windows機器回送地址( 127.0.0.1 )端口2222上訪問VM的端口22。

因此,您可以將SSH客戶端從Windows連接到CentOS計算機。


但是,Docker for Windows運行一台單獨的Linux機器並配置docker命令,以便從Windows命令行提示符執行docker時,您實際上可以直接在此Linux機器上工作(運行容器時,實際上並不需要訪問該Docker主機直接運行,因此您可能不知道其存在)。

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

結果,Ansible容器無法到達物理Windows計算機的環回地址。


可能最簡單的解決方案是將CentOS框配置為在具有靜態IP地址的公共網絡上運行(請參見Vagrant:Public Networks ),方法是在Vagrantfile添加以下行:

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

然后,您應該在清單文件中使用此地址,並按照Konstantin的建議使私鑰可用於容器:

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

似乎您在清單中為ansible_ssh_private_key_file指定了Windows路徑,但是從容器內部使用了該清單。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM