Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ansible无法ssh到Vagrant创建的VM中_Ssh_Vagrant_Ansible_Virtual Machine - Fatal编程技术网

Ansible无法ssh到Vagrant创建的VM中

Ansible无法ssh到Vagrant创建的VM中,ssh,vagrant,ansible,virtual-machine,Ssh,Vagrant,Ansible,Virtual Machine,我有一个非常简单的文件: config.vm.define "one" do |one| one.vm.box = "centos/7" end config.ssh.insert_key = false end (请注意,它正在创建vm,但在我安装vbguest插件之前退出失败) 创建vm后,我想执行一个简单的Ansible作业。我的库存文件(Vagrant将guest上的22端口转发到host上的2222): 下面是Docker命令(来自Windows cmd): 最后,下面是命令的输

我有一个非常简单的文件:

config.vm.define "one" do |one|
  one.vm.box = "centos/7"
end
config.ssh.insert_key = false
end
(请注意,它正在创建vm,但在我安装vbguest插件之前退出失败)

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

下面是Docker命令(来自Windows cmd):

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

<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连接:vagrant
SSH:EXEC SSH-vvv-C-o ControlMaster=auto-o ControlPersist=60s-o StrictHostKeyChecking=no-o Port=2222-o'IdentityFile=“C:/Users/Lukasz/.vagrant.d/unsecure_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`”
致命:[127.0.0.1]:无法访问!=>{
“更改”:错误,
“msg”:“无法通过ssh连接到主机:OpenSSH_7.2p2 Ubuntu-4ubuntu2.1,OpenSSL 1.0.2g 2016年3月1日\r\ndebug1:读取配置数据/etc/ssh/ssh_config\r\ndebug1:/etc/ssh/ssh_config第19行:应用*\r\ndebug1的选项:自动mux:尝试现有主\r\ndebug1:控制套接字\“/root/.ansible/cp/ansible-ssh-127.0.0.1-2222-vagrant\”不存在\r\n错误2:解析\“127.0.0.1\”端口2222\r\n错误2:ssh\u connect\u direct:needpriv 0\r\n错误1:连接到127.0.0.1[127.0.0.1]端口2222。\r\ndebug2:fd 3设置O_NONBLOCK\r\ndebug1:连接到地址127.0.0.1端口2222:连接被拒绝\r\nssh:连接到主机127.0.0.1端口2222:连接被拒绝\r\n“,
“遥不可及”:真实
}
我可以手动ssh到这个VM,并且没有问题——指定用户、端口和私钥

我做错什么了吗

编辑1:


我已经挂载了带有私钥的文件夹:
-v/c/Users/Lukasz/.vagrant.d/:/home/.ssh/
,并从清单文件中引用它:
ansible\u ssh\u private\u key\u file=/home/.ssh/unsecure\u private\u key
。还在Vagrant文件中分配了一个静态IP,并在docker命令中使用它。错误现在是“连接超时”。

似乎您在资源清册中为
ansible\u ssh\u private\u key\u文件指定了windows路径,但从容器内部使用此资源清册


您应该将
C:/Users/Lukasz/.vagrant.d/
映射到您的容器中,并从容器的角度设置
ansible\u ssh\u private\u key\u文件。

似乎您在清单中为
ansible\u ssh\u private\u key\u文件指定了windows路径,但从容器内部使用此清单


您应该将
C:/Users/Lukasz/.vagrant.d/
映射到您的容器中,并从容器的角度设置
ansible\u ssh\u private\u key\u文件。

对环回地址的工作方式存在误解,也低估了您实际运行的系统的复杂性

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

  • 物理机器Windows
  • CentOS虚拟机(假定在VirtualBox下运行,由Vagrant协调)
  • 安装Docker for Windows时在后台运行的Docker Linux机器(从“Docker命令(来自Windows cmd)”一句判断)
  • 在Docker的Linux机器下运行的Ansible容器
  • 每台机器都有自己的环回地址(
    127.0.0.1
    ),任何其他机器都无法访问该地址


    您有一个端口映射:

    Vagrant在VirtualBox的控制下为tnt CentOS虚拟机设置映射,以便可以在Windows机器环回地址(
    127.0.0.1
    )端口2222上访问VM的端口22

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


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

    似乎这还不够,您运行的每个容器都有自己的环回
    127.0.0.1
    地址

    因此,Ansible容器无法到达物理Windows计算机的环回地址


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

    config.vm.network "public_network", ip: "192.168.0.17"
    
    然后,您应该在清单文件中使用此地址,并遵循以下步骤使容器可以使用私钥:

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

    人们对环回地址如何工作存在误解,也低估了您实际运行的系统的复杂性

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

  • 物理机器Windows
  • CentOS虚拟机(假定在VirtualBox下运行,由Vagrant协调)
  • 安装Docker for Windows时在后台运行的Docker Linux机器(从“Docker命令(来自Windows cmd)”一句判断)
  • 在Docker的Linux机器下运行的Ansible容器
  • 每台机器都有自己的环回地址(
    127.0.0.1
    ),任何其他机器都无法访问该地址


    您有一个端口映射:

    Vagrant在VirtualBox so的控制下为tnt CentOS虚拟机设置映射
    config.vm.network "public_network", ip: "192.168.0.17"
    
    [one]
    192.168.0.17 ansible_ssh_user=vagrant ansible_ssh_private_key_file=/path/to/insecure_private_key/mapped/inside/container