Vagrant 1.7+でSSH接続エラーが出た場合の対処法


普段から、Vagrant + Ansibleを用いて、チームで共通の開発環境を作れるようにしています。先月、届いた13″ rMBP early 2015に開発環境を構築していた際、Ansibleがうまく実行できないトラブルにハマりました。
全く同じBox及びプロビジョニングを使って旧環境では問題なく構築できたのに、新環境ではできないことに頭を悩ませましたが、2時間ほど試行錯誤した結果、解決できたので、その事象と原因、対処法をメモしておきます。

環境

環境は以下の通りです。Vagrant, VirtualBox, AnsibleすべてをHomebrewでインストールしています。結果からいうとVirtualBoxやAnsibleは直接関係ありませんでしたが、一応、バージョン情報を示しておきます。

ソフトウェアバージョン
MacOS10.10.2
Vagrant1.7.2
VirtualBox4.3.26
Ansible1.9.0.1

SSH Error: Permission deniedとなってしまう問題

まずは事象を振り返ります。
CentOS 6.x minimalのVagrant Box* を用いて、 vagrant provisionansible-playbookコマンドでプロビジョンしようとした際、次の様なエラーが表示され、それ以上、先に進めることができませんでした。
* 厳密には、minimalにVirtualBoxのツールやvagrantユーザの作成などを行った状態のものです

Ansibleのインベントリファイルである hosts/vagrantには、以下の様な内容を記述していました。

原因と対処法

Vagrant作者のMitchell Hashimoto氏のツイートに、その答えがありました。

Vagrant 1.7からは、 insecure_private_keyが、 vagrant upする際に作られれるkeypairに置き換えられる仕様になったそうで、それに影響を受けていました。

対処法その1

Vagrantfileconfig.ssh.insert_key = falseを指定することで、keypairの差し替えを停止することができます。

対処法その2

インベントリの ansible_ssh_private_key_fileに、 vagrant upする際に作られれるkeypairを指定することで接続できるようになります。せっかく新しい機能が追加になったわけなので、私はこちらの方法を選択しました。

ちなみに、キーペアが作られるのは、初回の vagrant up時のみです。つまりはプロジェクトディレクトリに .vagrantディレクトリが作られるタイミングです。特に設定しなければ、プロジェクトごとに違うキーペアが作られるようになるということですね。
ローカルマシン内であれば、 ~/.vagrant.d/insecure_private_keyの使い回しでも特に問題はなかったでしょうし、ステージング環境やプロダクト環境で ~/.vagrant.d/insecure_private_keyのキーペアを使うことはなかったでしょうが、この仕様変更と同時にHeroku等へのデプロイ機能がついたりしたので、これによってVagrantが作るキーペアを手軽にセキュアに使えるようになるってところでしょうか。便利。

原因究明までの経緯

エラーメッセージを頼りにやってみたこと等。

関連ファイルやディレクトリのchownやchmod

→ 変化なし

Vagrant, VirtualBox, Ansibleの再インストール

→ 変化なし

Homebrewを用いず、ディスクイメージからVagrant, VirtualBox, Ansibleをインストール

→ 変化なし

ssh -vvvv, ansible -vvvv

→ エラーメッセージにあったとおり、デバッグ情報を出力してみる。鍵認証に失敗している模様。

vagrant sshとssh

vagrant sshでは、ゲストOSに接続できる!?
ssh vagrant@192.168.33.10ではパスワード認証になってしまう。
ssh vagrant@192.168.33.10 -i ~/.vagrant.d/insecure_private_keyで鍵を指定しても同様。
原因究明には至らなかったが、ここで糸口をつかむ。

vagrant ssh-config

→ GitHubのイシューで vagrant ssh-configというコマンドを知る。
Vagrant documentation about default insecure key should be updated – GitHub

vagrant sshでは利用している鍵が違うことがわかった。

Vagrant 1.7に関する情報収集

→ 原因特定

以上です。