Vagrant 1.7+でSSH接続エラーが出た場合の対処法
普段から、Vagrant + Ansibleを用いて、チームで共通の開発環境を作れるようにしています。先月、届いた13″ rMBP early 2015に開発環境を構築していた際、Ansibleがうまく実行できないトラブルにハマりました。
全く同じBox及びプロビジョニングを使って旧環境では問題なく構築できたのに、新環境ではできないことに頭を悩ませましたが、2時間ほど試行錯誤した結果、解決できたので、その事象と原因、対処法をメモしておきます。
環境
環境は以下の通りです。Vagrant, VirtualBox, AnsibleすべてをHomebrewでインストールしています。結果からいうとVirtualBoxやAnsibleは直接関係ありませんでしたが、一応、バージョン情報を示しておきます。
ソフトウェア | バージョン |
---|---|
MacOS | 10.10.2 |
Vagrant | 1.7.2 |
VirtualBox | 4.3.26 |
Ansible | 1.9.0.1 |
SSH Error: Permission deniedとなってしまう問題
まずは事象を振り返ります。
CentOS 6.x minimalのVagrant Box* を用いて、 vagrant provisionや ansible-playbookコマンドでプロビジョンしようとした際、次の様なエラーが表示され、それ以上、先に進めることができませんでした。
* 厳密には、minimalにVirtualBoxのツールやvagrantユーザの作成などを行った状態のものです
1 2 3 4 5 6 7 8 9 | vagrant provision 192.168.33.10 | FAILED => SSH Error: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password). while connecting to 192.168.33.10:22 It is sometimes useful to re-run the command using -vvvv, which prints SSH debug output to help diagnose the issue. ansible-playbook -i hosts/vagrant provision_vagrant.yml 192.168.33.10 | FAILED => SSH Error: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password). while connecting to 192.168.33.10:22 It is sometimes useful to re-run the command using -vvvv, which prints SSH debug output to help diagnose the issue. |
Ansibleのインベントリファイルである hosts/vagrantには、以下の様な内容を記述していました。
1 | 192.168.33.10 ansible_ssh_private_key_file=~/.vagrant.d/insecure_private_key ansible_ssh_user=vagrant |
原因と対処法
Vagrant作者のMitchell Hashimoto氏のツイートに、その答えがありました。
Vagrant 1.7 will replace its insecure keypair with a newly generated keypair on `vagrant up`. The little things 🙂 pic.twitter.com/TU6Hge0YVE
— Mitchell Hashimoto (@mitchellh) 2014, 10月 24
Vagrant 1.7からは、 insecure_private_keyが、 vagrant upする際に作られれるkeypairに置き換えられる仕様になったそうで、それに影響を受けていました。
対処法その1
Vagrantfileに config.ssh.insert_key = falseを指定することで、keypairの差し替えを停止することができます。
対処法その2
インベントリの ansible_ssh_private_key_fileに、 vagrant upする際に作られれるkeypairを指定することで接続できるようになります。せっかく新しい機能が追加になったわけなので、私はこちらの方法を選択しました。
1 | 192.168.33.10 ansible_ssh_private_key_file=~/.vagrant.d/insecure_private_key ansible_ssh_user=vagrant |
1 | 192.168.33.10 ansible_ssh_private_key_file=.vagrant/machines/default/virtualbox/private_key ansible_ssh_user=vagrant |
ちなみに、キーペアが作られるのは、初回の 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に関する情報収集
→ 原因特定
以上です。
PhpStormからVagrant上のMySQLに接続する | mawatari.jp
2015年4月7日 @ 5:41 PM
[…] くは以下を参照してください。 Vagrant 1.7+でSSH接続エラーが出た場合の対処法 […]