更新 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 文档有关命令选项的更多详细信息。