我有一个非常简单的Vagrantfile:
config.vm.define "one" do |one|
one.vm.box = "centos/7"
end
config.ssh.insert_key = false
end
(注意它是在创建vm但是在出现故障时退出,直到我安装了vbguest插件)
创建vm后,我想执行一个简单的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
}
我可以手动ssh到这个VM,没有问题 - 指定用户,端口和私钥。
我做错了吗?
编辑1:
我已使用私钥-v /c/Users/Lukasz/.vagrant.d/:/home/.ssh/
挂载了文件夹,并从库存文件ansible_ssh_private_key_file=/home/.ssh/insecure_private_key
中引用它。还在vagrantfile中分配了静态IP,并在docker命令中使用它。 Errror现在是“连接超时”。
答案 0 :(得分:2)
对于环回地址的工作方式存在误解,并且低估了实际运行的复杂系统。
在您的问题中描述的方案中,您正在运行四台具有四个独立网络堆栈的计算机:
这些计算机中的每一台都有自己的环回地址(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
:< / p>
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
答案 1 :(得分:1)
您似乎在库存中为ansible_ssh_private_key_file
指定了Windows路径,但是从容器内部使用此库存。
您应该将C:/Users/Lukasz/.vagrant.d/
映射到容器中,并从容器的角度设置ansible_ssh_private_key_file
。