Vagrant 公開鍵認証でタイムアウト対策

# はじめに

### 環境

- Ubuntu18.04server※ゲストOS
- Windows10 Professional ※ホストOS
- VirtualBox5.2.12
- Vagrant2.1.1

### この記事の目的

UbuntuのBOXを作って`vagrant up`したらSSH公開鍵認証のところでタイムアウトしてうまく行きませんでした。
回避方法について共有します。

### 参考情報

BOXファイルの作り方は以下の記事を参考にしました。
[VagrantでCentOS7のBOXを作成する（Mac）](https://qiita.com/reflet/items/423d9640e90d65730c32)
[vagrantのboxを自作する](https://qiita.com/reflet/items/423d9640e90d65730c32)

SSH公開鍵認証について正攻法で攻めるなら以下の記事が参考になるでしょうか。
（私はめんどくさいので別の方法に逃げました）
[Vagrantの公開鍵、秘密鍵を用いたssh接続の設定](https://qiita.com/deco/items/d33395e30875b2923fac)

Ubuntuサーバ版のインストール方法はこちら
[【Ubuntu 18.04 LTS Server】インストールする](https://www.yokoweb.net/2018/05/04/ubuntu-18_04-lts-server-install/)

# 作業内容

### 事前作業

今回はUbuntuなのでCentOS系との違いを少し記載します。

Ubuntuの場合はCentOSと違ってOSインストール時にユーザ登録します。（CentOSではrootのパスワードを設定）
vagrantなのでユーザ：vagrant、パスワード：vagrant

このvagrantはsudoグループに属しているので最初からsudoできますが、パスワードが必要な設定になっています。
パスワード不要にします。
terminalから以下の設定を行います。（これを行わないと`vagrant up`時にうまくいかない）

```sh:visudo
$ sudo visudo
#以下の行を変更
%sudo ALL=(ALL:ALL) ALL
↓
%sudo ALL=(ALL) NOPASSWD:ALL

```

rootのパスワードを設定します。
パスワード設定しないとrootにsuできません。（絶対rootで作業しない人は必要ありません）

```sh:passwd
$ sudo passwd root
```

リモートログインするための準備が必要です。
CentOSでBOX作ったときはこの作業は必要ありませんでした。
編集するファイルはssh_configではなく、sshd_configです。（1回間違えた）

```sh:リモートログインに必要な手順
#SSHサーバソフトをインストールする必要がある
$ sudo apt install -y openssh-server
$ sudo vi /etc/ssh/sshd_config
#以下の行のコメントを外す
 PasswordAuthentication yes

```

エディタ、開発環境一式もインストールしましょう。
ubuntuはCentOSと全然違います。vimも最初から入ってなかったし。

```sh:開発環境、エディタ
#開発環境一式（C++など）
$ sudo apt install -y build-essential
#好みのエディタを入れよう
$ sudo apt install -y vim neovim emacs

```

### SSH認証でタイムアウト

VM環境を作ってからBOXファイルを作って、さあ```vagrant up```で起動しようとしたらAuthentication failure.が延々と出て最後にタイムアウトとなりました。```vagrant ssh```で入れるのだけどネットワーク設定が反映されないのでターミナルソフトからリモートで入れないのがストレス。


```sh
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Authentication failure. Retrying...
    default: Warning: Authentication failure. Retrying...
    default: Warning: Authentication failure. Retrying...
    default: Warning: Authentication failure. Retrying...

```

### 対処（案）

まず、一旦該当仮想マシン環境を破壊(destroy)し、Vagrantfileを編集します。boxのremoveは必要ないです。
以下の方法で```vagrant up```し直せばSSH公開鍵認証ではなく、Password認証に切り替わりSSH認証で延々Warningが出ることがなくなりスッキリ。
ターミナルソフトからリモートログインもできるようになりました。

```sh:リカバリ
#起動している場合、シャットダウンする。
$ vagrant halt

#破壊(destroy)する。破壊って言い方が強烈だな。
$ vagrant destroy

#Vagrantfileを編集する。（好みのエディタで。私はWin環境でもVimを使っている。）
$ vim Vagrantfile
#以下を追加する
config.ssh.password = "vagrant"

#仮想マシン起動
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: password
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
    default: /vagrant => C:/usr/local/virtualBox/ubuntu_1804server

```

# おわりに

正しいやり方が他にあるのだろうけど追々調査してみます。