使用Ansible SSH进入Vagrant虚拟机

20
通常情况下,您可以使用vagrant ssh登录管理的Vagrant虚拟机。有两个选项:
  1. 您可以使用由Vagrant生成的insecure_private_key进行身份验证。
  2. 使用自己的私钥-前提是将config.ssh.forward_agent设置为true并正确配置VM。
我使用第二个选项。因此,当我运行vagrant ssh时,我会使用自定义私钥登录到该机器。
现在我需要让Ansible SSH进入我的Vagrant机器,我不想使用Vagrantfile
因此我执行了以下命令: ansible-playbook -i hosts/development --private-key=~/.ssh/id_rsa -u vagrant dev.yml 然而,返回了以下错误:

fatal: [192.168.50.5] => SSH Error: Permission denied (publickey). while connecting to 192.168.50.5:22

hosts/inventory文件仅包含我的Vagrant VM IP(192.168.50.5)。
我不知道为什么Ansible无法SSH连接到VM。它使用的用户名(vagrant)和密钥(id_rsa)与执行vagrant ssh时完全相同。
然而,在上面的情况下,使用vagrant ssh没有问题。
任何建议将不胜感激。

你确定端口是22而不是2222吗? - Vor
在我的回答之后,我研究了几种可能性。我相信您没有在虚拟机vagrant用户的authorized_keys中设置您的公钥。除非绝对必要,否则我不建议使用个人密钥来作为vagrant的密钥。 - Mike D
3个回答

32
问题可能出现在您的 hosts/inventory 文件中。您需要在其中添加适当的 Ansible 连接配置,保存并重新运行。
192.168.50.5 ansible_ssh_port=22 ansible_ssh_user=vagrant ansible_ssh_private_key_file=~/.ssh/id_rsa 

如果您没有使用端口22,请相应地调整主机文件中的ansible_ssh_port
另外,您可能还没有在Vagrant中设置pubkey,因此这也无法正常工作。要测试这一点,请运行:
vagrant ssh-config | grep IdentityFile
# result should be your private key and not
#   .vagrant/machines/default/virtualbox/private_key

如果您没有将pubkey放入Vagrant虚拟机中,则需要在尝试使用私钥之前添加该密钥。
参考: http://docs.ansible.com/ansible/intro_inventory.html#list-of-behavioral-inventory-parameters 参考: https://docs.vagrantup.com/v2/cli/ssh_config.html

2
我无法使用ssh的原因是我使用了错误的私钥文件。正确的密钥可以通过vagrant ssh-config命令来查看。谢谢! - luqo33
我在使用自定义清单文件时遇到了困难。我的问题是当我在清单中指定主机时,我必须指定自定义端口号:[default] 127.0.0.1:2201,否则它默认为22,而我无法在 ansible.cfgVagrantfile 中设置它。 - Hafiz
@Hafiz,你也可以在清单文件中使用ansible_ssh_port=2201 - Mike D

3
我认为你应该尝试使用由Vagrant生成的清单。 这样可以避免除了Vagrantfile之外还要维护Ansible清单的麻烦。
例如,你会发现像这样的清单被用于“vagrant ssh”:
cat .vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory
>>>
# Generated by Vagrant

default ansible_host=127.0.0.1 ansible_port=2222 ansible_user='vagrant' ansible_ssh_private_key_file='/home/someone/coding-in-a-project/.vagrant/machines/default/virtualbox/private_key'

您将能够运行 ansible 即时命令和 ansible-playbook 命令。 (根据您的需求指定: --private-key=~/.ssh/your_private_key

ansible default -i .vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory -m ansible.builtin.shell -a 'echo foobar'

ansible-playbook -i .vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory playbook.yml

来源: https://docs.ansible.com/ansible/latest/scenario_guides/guide_vagrant.html

Vagrant是一个用于构建和管理虚拟开发环境的工具。Ansible可以与Vagrant一起使用,以便在虚拟机中自动化配置和部署应用程序。通过这种方式,您可以快速创建可重复的开发环境,并确保每个人都使用相同的设置。本指南将向您展示如何使用Ansible和Vagrant来管理虚拟开发环境。


1
对于使用 inventory.txt 的用户,它看起来会像这样:
[vmgroup]
192.168.56.10

[vmgroup:vars]
ansible_ssh_user=vagrant
ansible_ssh_private_key_file=/Users/amar/centos7/.vagrant/machines/default/virtualbox/private_key

这个私钥文件的位置是从vagrant ssh-config命令的输出中观察到的;在使用vagrant init centos/7创建的文件夹内执行。

我需要传递哪些标志给 Ansible,以便它能够针对以此方式指定的 VM 组进行操作? - Erasmus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接