web-dev-qa-db-ja.com

AnsibleSSH転送がVagrantで機能しないようです

OK、奇妙な質問です。 VagrantでSSH転送を使用しています。しかし、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 [email protected]:bryan_picsolve/poc_docker.git /home/vagrant/poc_docker' "
Permission denied (publickey,password).

しかし、vagrant sshを実行するだけで、エージェント転送は正しく機能し、githubプロジェクトのR/Wをチェックアウトできます。

[/common/picsolve-ansible/u12.04%]vagrant ssh
vagrant@vagrant-ubuntu-precise-64:~$ /bin/sh  -c 'git clone [email protected]: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チェックアウトが機能しました。

 ssh [email protected] -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 [email protected]:bryan_picsolve/poc_docker.git /home/vagrant/poc_docker' "
24

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 [email protected]:basho/basho_bench.git dest=basho_bench
20

主な違いは、UserKnownHostFileの設定にあるようです。 StrictHostKeyCheckingがオフになっている場合でも、既知のhostsファイルに競合するエントリがある場合、sshはエージェント転送を含む特定の機能を静かに無効にします(複数のVMが異なる時間に同じアドレスを持つ可能性があるため、これらの競合はvagrantで一般的です)。 UserKnownHostFileを/ dev/nullにポイントすると、うまくいきます。

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

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

回避策は次のとおりです。

次の行を使用して、Vagrantfileと同じディレクトリにansible.cfgファイルを作成します。

[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o ForwardAgent=yes
7
Lorin Hochstein

この行をVagrantfileに追加するだけで、ssh転送を有効にできます。

config.ssh.forward_agent = true

注:become: falseでタスクを実行することを忘れないでください

うまくいけば、これが役立つでしょう。

2
Arbab Nazar

私はそれを機能させるために(Ubuntu12.04で)2つの別々のことをする必要があることに気づきました:

  • -o ForwardAgent @ Lorinが言及していること
  • 追加/etc/sudoers.d/01-make_SSH_AUTH_SOCK_AVAILABLEこれらの内容で:

    Defaults env_keep += "SSH_AUTH_SOCK"
    
2
offby1

私は数時間、非常によく似た問題に苦しんでいました。 Vagrant 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 [email protected]
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.

@Lorinが指摘したように、ansible.cfgファイルが設定され、Vagrantfileがconfig.ssh.forward_agent = trueに設定されていることを確認した後、まだ不足していました。

solutionは、ホストの〜/ .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

3行目には面白いIPアドレスがあることに注意してください。確かではありませんが、その線が原因だったと思います。これらの行は、vagrantVMを破棄して作成するときに作成されます。

2
Brian