【问题标题】:Ansible SSH forwarding doesn't seem to work with VagrantAnsible SSH 转发似乎不适用于 Vagrant
【发布时间】:2021-07-13 23:06:56
【问题描述】:

好的,奇怪的问题。我有 SSH 转发与 Vagrant 一起工作。但是当我使用 Ansible 作为 Vagrant 供应商时,我试图让它工作。

我确切地发现了 Ansible 正在执行什么,并自己从命令行尝试过,果然,它也在那里失败了。

[/common/picsolve-ansible/u12.04%]ssh -o HostName=127.0.0.1 \
 -o User=vagrant -o  Port=2222 -o UserKnownHostsFile=/dev/null \
 -o StrictHostKeyChecking=no -o PasswordAuthentication=no \
 -o IdentityFile=/Users/bryanhunt/.vagrant.d/insecure_private_key \
 -o IdentitiesOnly=yes -o LogLevel=FATAL \
 -o ForwardAgent=yes "/bin/sh  \
 -c 'git clone git@bitbucket.org:bryan_picsolve/poc_docker.git /home/vagrant/poc_docker' "
Permission denied (publickey,password).

但是当我只运行 vagrant ssh 时,代理转发工作正常,我可以 R/W 签出我的 github 项目。

[/common/picsolve-ansible/u12.04%]vagrant ssh
vagrant@vagrant-ubuntu-precise-64:~$ /bin/sh  -c 'git clone git@bitbucket.org:bryan_picsolve/poc_docker.git /home/vagrant/poc_docker'
Cloning into '/home/vagrant/poc_docker'...
remote: Counting objects: 18, done.
remote: Compressing objects: 100% (14/14), done.
remote: Total 18 (delta 4), reused 0 (delta 0)
Receiving objects: 100% (18/18), done.
Resolving deltas: 100% (4/4), done.
vagrant@vagrant-ubuntu-precise-64:~$

有人知道它是如何工作的吗?

更新:

通过ps awux,我确定了 Vagrant 正在执行的确切命令。

我复制了它并且 git checkout 工作了。

 ssh vagrant@127.0.0.1 -p 2222 \
  -o Compression=yes \
  -o StrictHostKeyChecking=no \
  -o LogLevel=FATAL \ 
  -o StrictHostKeyChecking=no \
  -o UserKnownHostsFile=/dev/null \
  -o IdentitiesOnly=yes \
  -i /Users/bryanhunt/.vagrant.d/insecure_private_key \
  -o ForwardAgent=yes \
  -o LogLevel=DEBUG \
   "/bin/sh  -c 'git clone git@bitbucket.org:bryan_picsolve/poc_docker.git /home/vagrant/poc_docker' "

【问题讨论】:

标签: ssh vagrant ansible ssh-agent


【解决方案1】:

从 ansible 1.5 (devel aa2d6e47f0) 最后更新 2014/03/24 14:23:18 (GMT +100) 和 Vagrant 1.5.1 开始,现在可以使用。

我的 Vagrant 配置包含以下内容:

config.vm.provision "ansible" do |ansible|
   ansible.playbook = "../playbooks/basho_bench.yml"
   ansible.sudo = true
   ansible.host_key_checking = false
   ansible.verbose =  'vvvv'
   ansible.extra_vars = { ansible_ssh_user: 'vagrant', 
                 ansible_connection: 'ssh',
                 ansible_ssh_args: '-o ForwardAgent=yes'}

明确禁用 sudo 使用也是一个好主意。例如,当使用 Ansible git 模块时,我会这样做:

- name: checkout basho_bench repository 
  sudo: no
  action: git repo=git@github.com:basho/basho_bench.git dest=basho_bench

【讨论】:

  • 根据我的经验,我认为您必须手动指定库存才能使其正常工作。如果我让 vagrant 做库存,这对我没有用。
  • 如果您销毁并重新创建 Vagrant 框,ssh-agent 转发将被静默禁用,除非您传递一个空的已知主机文件,根据 Ben Darnell 的回答:stackoverflow.com/a/23704069/459442
【解决方案2】:

主要区别似乎是 UserKnownHostFile 设置。即使关闭了 StrictHostKeyChecking,当已知主机文件中存在冲突条目时,ssh 也会悄悄地禁用某些功能,包括代理转发(这些冲突对于 vagrant 很常见,因为多个 VM 可能在不同时间具有相同的地址)。如果我将 UserKnownHostFile 指向 /dev/null,它对我有用:

config.vm.provision "ansible" do |ansible|
  ansible.playbook = "playbook.yml"

  ansible.raw_ssh_args = ['-o UserKnownHostsFile=/dev/null']
end

【讨论】:

  • 哇,这东西有多少种方法可以破坏,我以前可以用,但又坏了,按照你的建议,它成功了。这些东西是非常必要的,但非常脆弱,没有 ssh 命令的脆弱性,该 util 真的显示它的年龄/cruft。
【解决方案3】:

这里有一个解决方法:

在与您的 Vagrantfile 相同的目录中创建一个 ansible.cfg 文件,其中包含以下行:

[ssh_connection]
ssh_args = -o ForwardAgent=yes

【讨论】:

  • 在没有 Vagrant 的情况下使用 Ansible 时有效(我使用相同的配置),但在与 Vagrant 一起使用时无效(如果我没记错的话)。恕我直言,让这些东西正常工作所涉及的麻烦是一个非常棒的工具的弱点。
  • ansible 在配置中使用 ssh,并将您的 vagrant VM 添加到 ~/.ssh/known_hosts。 AgentForwarding 依赖于经过验证的主机密钥,因此在您运行 ansible 以更好地配置之前删除任何过时的密钥:ssh-keygen -R [127.0.0.1]:2222
【解决方案4】:

您可以简单地将这一行添加到您的 Vagrantfile 以启用 ssh 转发:

config.ssh.forward_agent = true

注意:别忘了用become: false执行任务

希望,这会有所帮助。

【讨论】:

  • 这是唯一对我有用的东西,即使我在 ansible.cfg 中设置了ssh_args = -A(并且不要忘记使用become: false 执行任务)。
【解决方案5】:

我发现我需要做两件事(在 Ubuntu 12.04 上)才能让它工作:

  • @Lorin 提到的-o ForwardAgent 事情
  • 用这些内容添加/etc/sudoers.d/01-make_SSH_AUTH_SOCK_AVAILABLE

    Defaults env_keep += "SSH_AUTH_SOCK"
    

【讨论】:

  • 我很确定我都试过了。下周末我会用最新的 Ansible 再试一次,还有你的建议,谢谢,bryan
  • @binarytemple_picsolve 当心 ControlMaster!据我所知,这会让你的 SSH 连接保持 60 秒 即使 Vagrant 已经停止。因此,如果您进行了影响 ssh 工作方式的更改,那么如果原始连接正在运行,它将不会生效。我建议您至少在调试时从 ansible.cfg 中删除 ControlMaster 和 ControlPersist 选项。
【解决方案6】:

我在一个非常相似的问题上苦苦挣扎了几个小时。 流浪者 1.7.2 ansible 1.9.4

我的症状:

failed: [vagrant1] => {"cmd": "/usr/bin/git ls-remote '' -h refs/heads/HEAD", "failed": true, "rc": 128}
stderr: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

msg: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

FATAL: all hosts have already failed -- aborting

SSH 进入来宾,我发现我的 ssh-agent 正在按预期转发:

vagrant@vagrant-ubuntu-trusty-64:~$ ssh -T git@github.com
Hi baxline! You've successfully authenticated, but GitHub does not provide shell access.

但是,我无法从主机打开连接:

$ ansible web -a "ssh-add -L"
vagrant1 | FAILED | rc=2 >>
Could not open a connection to your authentication agent.

在确认我的 ansible.cfg 文件已设置后,正如 @Lorin 所指出的,我的 Vagrantfile 设置为 config.ssh.forward_agent = true,我仍然做不到。

解决方案是删除我的主机的 ~/.ssh/known_hosts 文件中与我的客人关联的所有行。对我来说,它们是以以下开头的几行:

[127.0.0.1]:2201 ssh-rsa
[127.0.0.1]:2222 ssh-rsa
[127.0.01]:2222 ssh-rsa
[127.0.0.1]:2200 ssh-rsa

注意第三行有一个有趣的 ip 地址。我不确定,但我相信那条线是罪魁祸首。这些行是在我销毁和创建 vagrant VM 时创建的。

【讨论】:

  • 关于主机(不是虚拟机)上 known_hosts 文件的重要提示。这也是我的问题
猜你喜欢
  • 2016-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-24
  • 1970-01-01
  • 2018-11-27
  • 2014-10-03
相关资源
最近更新 更多