(已解决)Ansible 无法连接到(可访问)virtualbox VM(预认证错误)

(已解决)Ansible 无法连接到(可访问)virtualbox VM(预认证错误)

更新 2:好吧,我能告诉你什么呢,它又能正常工作了。实际上,我唯一做的事情就是用我闲置的 SSD 替换我旧的、慢速的硬盘。除此之外,我遵循完全相同的安装过程(全新安装 Windows、相同的安装介质、相同的软件版本、一般相同的软件)。不知道这会有什么影响。我从未真正相信这是一个超时问题,因为正如我所说,它曾经在这种设置下在这台机器上运行良好。也许 Windows 更新改变了一些网络行为。我不知道。无论如何,我仍然有旧的硬盘,所以如果有人对如何解决这个问题有一些有趣的想法,我可能会试一试。但是,现在我有一台可以正常工作的笔记本电脑,这不再是我的首要任务了。

更新 1:我可以确认这在我的另一台开发机器上有效,这台机器功能强大得多,但其他方面设置完全相同(软件版本、配置等)。考虑到我的问题机器是全新安装的,这尤其奇怪。

目标:

我正在使用 Vagrant 在我的 Windows 10 机器上设置 Web 开发环境。

Vagrant(在 Windows 上)用于启动 Virtualbox VM(也在 Windows 上)以托管 Debian Linux。我使用 Windows Subsystem for Linux(Debian Distro)来运行 Ansible,以便配置这些 VM 和我的生产服务器(它是一台运行 Debian 的远程机器 - 你猜对了 -)。

问题:

Ansible 无法连接到 Virtualbox VM。它在第一次连接尝试时就挂起了,没有任何错误。我必须使用 Ctrl+C 中止它。

奇怪的地方就在这里:我可以用 Windows 上的 Putty 和 WSL 上的 SSH 顺利连接到虚拟机,所以我知道虚拟机是可以访问的,而且 SSH 也可以正常工作。Ansible 也可以很好地访问我的远程服务器,所以 Ansible 本身也没有坏。问题发生了仅在 Ansible 和本地虚拟机之间仅限此机器

同样的设置(相同的 git repo、相同的配置文件、相同的软件版本)实际上在我的另一台机器上运行良好,不久前它也曾在这台机器上运行良好。所以我知道它是有效的理论上。我无论如何也想不出这些机器之间有什么不同,或者我做了什么改动导致它坏了。

我花了好几天的时间搜索互联网,尝试了所有我能找到或想到的方法。现在我甚至已经完全重新安装了 Windows 和整个开发环境,但没有成功,错误仍然存​​在。我非常绝望,因为就目前的情况而言,这台机器无法用作开发机器。

背景信息:

我像这样运行 Ansible(例如):

 ansible appserver -i environments/development --ask-vault-pass -k -e "ansible_user=vagrant" -m ping

之后,ansible 要求输入 SSH 密码、保险库密码,然后什么也没有发生。

当我使用 Ctrl+CI 中止时,虚拟机上的 /var/log/auth.log 中出现以下错误:

sshd[1343]: Connection closed by 192.168.33.1 port 51481 [preauth]

该 IP 地址是 Virtualbox 计算机的仅主机网络的 IP 地址,如 Virtualbox 的网络配置对话框中所示,而不是虚拟机本身的 IP 地址。sshd pid 每次都不同。

当我在剧本中运行 ping 模块时,我立即得到其中的三行(每行有不同的端口),并且在按下 Ctrl+C 后得到另一行。

这是我的 ansible.cfg(在我的项目目录中,/etc 中的文件未受影响):

[defaults]
force_handlers = True
hash_behaviour = merge

Ansible 清单相当平淡无奇(只有 IP)

当我运行上述 ansible 命令时,-vvvv我得到以下信息:

ansible 2.7.6
config file = /mnt/d/Source/main_server/ansible/ansible.cfg
configured module search path = [u'/home/my_user/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/dist-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.13 (default, Sep 26 2018, 18:42:22) [GCC 6.3.0 20170516]
Using /mnt/d/Source/main_server/ansible/ansible.cfg as config file
SSH password:
Vault password:
setting up inventory plugins
/mnt/d/Source/main_server/ansible/environments/development did not meet host_list requirements, check plugin documentation if this is unexpected
Parsed /mnt/d/Source/main_server/ansible/environments/development inventory source with ini plugin
Loading callback plugin minimal of type stdout, v2.0 from /usr/lib/python2.7/dist-packages/ansible/plugins/callback/minimal.pyc
META: ran handlers
Trying secret <ansible.parsing.vault.PromptVaultSecret object at 0x7f8a35652610> for vault_id=default 
<192.168.33.10> ESTABLISH SSH CONNECTION FOR USER: vagrant
<192.168.33.10> SSH: EXEC sshpass -d9 ssh -vvv -C -o ControlMaster=auto -o ControlPersist=60s -o User=vagrant -o ConnectTimeout=10 -o ControlPath=/home/sseeland/.ansible/cp/d986014952 192.168.33.10 '/bin/sh -c '"'"'echo ~vagrant && sleep 0'"'"''

然后就一片寂静,直到我按下 Ctrl+C。

这是我的 Vagrant 文件:

Vagrant.configure("2") do |config|
    config.vm.box = "debian/stretch64"
    config.vm.boot_timeout = 120
    config.vm.synced_folder ".", "/vagrant", type: "virtualbox"

    config.vm.provider "virtualbox" do |v|
        v.customize [ "modifyvm", :id, "--nictype1", "virtio" ]
    end

    config.ssh.forward_agent = true

    config.vm.define "dev" do |dev|
        # Setting up private_network to have reliable ip and port from host
        dev.vm.network :private_network, ip: "192.168.33.10", nic_type: "virtio"

        # mount source code into machine
        dev.vm.synced_folder "../../svenseeland_site/", "/svenseeland_site/", type: "virtualbox"
    end

    config.vm.define "staging" do |staging|
        # Setting up private_network to have reliable ip and port from host
        staging.vm.network :private_network, ip: "192.168.33.11", nic_type: "virtio"
    end

    # set timezone
    config.vm.provision "shell", name: "set timezone", inline: <<-SHELL
        sudo rm /etc/localtime
        sudo ln -s /usr/share/zoneinfo/Europe/Berlin /etc/localtime
    SHELL

    # add vagrant user to SSH group
    config.vm.provision "shell", name: "add vagrant user to SSH group", inline: <<-SHELL
        usermod -a -G ssh vagrant
    SHELL

    # set root password
    config.vm.provision "shell", name: "set root password", inline: <<-SHELL
        echo -e "vagrant\nvagrant" | sudo passwd
    SHELL

    # enable passwordless root login to mirror the production server setup and open the door for Ansible
    config.vm.provision "shell", name: "enable keyless ssh login", inline: <<-SHELL
        sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config
        echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config
        service ssh restart
    SHELL
end

关于 SSH 的用户和密码的一些设置是为了准备通过 Ansible 进行管理,并与托管商提供的生产服务器的初始状态保持一致。

软件版本

  • Vagrant 2.2.3
  • Virtualbox 6.0.4
  • Ansible 2.7.6
  • Debian 9.7(官方 vagrant box)
  • Windows 10 版本 1809,内部版本 17763.253
  • WSL/Debian 已更新(apt-get dist-upgrade)

如果您需要更多信息请告诉我。

答案1

基本设置:

  • 在主机和客户操作系统之间设置仅主机网络(更多详细信息请参阅这个答案)。
  • 正确配置 SSH 密钥对,并使用仅主机 IP 地址从 WSL 通过 SSH 进入该 VM。
  • ansible在 WSL 发行版中安装,检查ansible --version是否正确安装。

由于 OP 已经完成了 99% 的工作,因此省略了每个基本步骤的详细解释。

程序:

  • 在 WSL 发行版中,在文件中添加仅主机 IP 地址/etc/ansible/hosts。或者在清单文件中添加虚拟机设置,如这个答案
  • 要在 WSL 中使用带有 SSH 密码的 Ansible,请安装sshpass到 WSL 中。
  • 运行此命令检查 Ansible 是否正常工作ansible all --user=usename --ask-pass --module-name=ping。请参阅Ansible 文档有关命令选项的更多详细信息。

相关内容