首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ansible不能将ssh转换为Vagrant创建的VM

问Ansible不能将ssh转换为Vagrant创建的VM
EN

Stack Overflow用户
提问于 2017-03-01 15:31:17
回答 2查看 2.6K关注 0票数 0

我有一个非常简单的Vagrantfile:

代码语言:javascript
复制
config.vm.define "one" do |one|
  one.vm.box = "centos/7"
end
config.ssh.insert_key = false
end

(请注意,它正在创建vm,但在我安装vb来宾插件之前,由于失败而退出)

在创建vm之后,我想执行一个简单的Ansible作业。我的库存文件(Vagrant将客人的22个端口转发到主机上的2222个端口):

代码语言:javascript
复制
[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 ):

代码语言:javascript
复制
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

最后,下面是命令的输出:

代码语言:javascript
复制
<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中引用了它。还在迷走文件中分配了一个静态IP,并在docker命令中使用它。错误现在是“连接超时”。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-02 03:49:15

对于环回地址的工作方式存在误解,而且低估了您实际运行的系统有多复杂。

在您的问题中描述的场景中,您正在运行四台具有四个独立网络堆栈的机器:

  1. 物理机器Windows
  2. 一个CentOS VM (据推测运行在VirtualBox下,由Vagrant编排)
  3. 在安装Docker for Windows时后台运行的Docker Linux机器(从您的句子“docker命令(来自windows cmd)”判断)
  4. 在Docker的Linux机器下运行的不可用容器

这些机器中的每一台都有自己的环回地址(127.0.0.1),这是其他机器无法访问的。

您有一个端口映射:

迷航者在CentOS控制下为tnt VirtualBox虚拟机设置一个映射,以便VM的端口22可以在Windows回送地址(127.0.0.1)端口2222上访问。

因此,您可以从Windows连接SSH客户端到CentOS机器。

但是,Docker运行一个单独的Linux机器并配置docker命令,以便当您从Windows命令行提示符执行docker时,您实际上直接在这个Linux机器上工作(在运行容器时,您实际上不需要直接访问这个Docker主机,因此您可能不知道它的存在)。

就像这还不够一样,您运行的每个容器都有自己的环回127.0.0.1地址。

因此,Ansible容器不可能到达物理Windows机器的回送地址。

最简单的解决方案可能是将CentOS框配置为在公共网络上运行,使用静态IP地址(参见流浪汉:公共网络),例如在Vagrantfile中添加以下行

代码语言:javascript
复制
config.vm.network "public_network", ip: "192.168.0.17"

然后,您应该在库存文件中使用这个地址,并遵循康斯坦丁的建议使容器可以使用私钥:

代码语言:javascript
复制
[one]
192.168.0.17 ansible_ssh_user=vagrant ansible_ssh_private_key_file=/path/to/insecure_private_key/mapped/inside/container
票数 2
EN

Stack Overflow用户

发布于 2017-03-01 15:50:06

您似乎在库存中为ansible_ssh_private_key_file指定了窗口路径,但在容器中使用此目录。

您应该将C:/Users/Lukasz/.vagrant.d/映射到容器中,并从容器的角度设置ansible_ssh_private_key_file。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42535766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档