Vagrantで仮想環境を構築する


## Boxを取得する

**Vagrantbox.es**
http://www.vagrantbox.es/

ここにboxがたくさんある

### CentOS7.0を入れてみる

```
$ vagrant box add centos70 https://github.com/tommy-muehle/puppet-vagrant-boxes/releases/download/1.1.0/centos-7.0-x86_64.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'centos70' (v0) for provider: 
    box: Downloading: https://github.com/tommy-muehle/puppet-vagrant-boxes/releases/download/1.1.0/centos-7.0-x86_64.box
==> box: Box download is resuming from prior download progress
```

```
$ vagrant box list
centos70            (virtualbox, 0)
```

vagrantのファイル群は vagrant.d 配下に集約される

```
$ ls ~/.vagrant.d/boxes/centos70/0/virtualbox/
Vagrantfile     box-disk1.vmdk  box.ovf         metadata.json
```

## 仮想マシンを初期化する

### 環境構築先のディレクトリ

仮想マシンを管理するためのディレクトリを作成しておくと良いかもしれない。

### 仮想マシンを初期化する

```
$ vagrant init centos70
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
```

初期化後、Vagrantfileが作成される。

```
$ ls
Vagrantfile
```

メッセージに従って、 vagrant up する。

```
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'centos70'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: myCentOS_default_1479087622947_47240
==> 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: 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:
    default: Vagrant insecure key detected. Vagrant will automatically replace
    default: this with a newly generated keypair for better security.
    default:
    default: Inserting generated public key within guest...
    default: Removing insecure key from the guest if it's present...
    default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
    default: The guest additions on this VM do not match the installed version of
    default: VirtualBox! In most cases this is fine, but in rare cases it can
    default: prevent things such as shared folders from working properly. If you see
    default: shared folder errors, please make sure the guest additions within the
    default: virtual machine match the version of VirtualBox you have installed on
    default: your host and reload your VM.
    default:
    default: Guest Additions Version: 4.3.28
    default: VirtualBox Version: 5.1
==> default: Mounting shared folders...
    default: /vagrant => /Users/user/vm
```

## 仮想環境にSSH接続する

### SSH接続する

Vagrantfileがあるディレクトリで

```
$ vagrant ssh
```

### どこからでもssh接続できるようにする

デフォルトだと、Vagrantfileがあるディレクトリからしかログインできないので

```
$ vagrant ssh-config --host myCentOS >> ~/.ssh/config
$ cd
$ ssh myCentOS
Last login: Mon Nov 14 04:51:59 2016 from 10.0.2.2
Welcome to your Vagrant-built virtual machine.
[vagrant@localhost ~]$ pwd
/home/vagrant
```

## ホストから仮想環境にIP経由で接続する

### Apacheを入れる

```
$ sudo yum -y install httpd
$ sudo systemctl enable httpd.service
```

### FireWallを無効にする

```
$ sudo systemctl stop firewalld
$ sudo systemctl disable firewalld.service
```

### VagrantFileのPublicNetworkを有効にする


```VagrantFile
# Create a private network, which allows host-only access to the machine
# using a specific IP.
config.vm.network "private_network", ip: "192.168.33.10"
```

設定を変更したため、vagrantを再起動する
```
$ vagrant reload
```

適当なファイルを /var/www/html に配置する

ブラウザから、 192.168.33.10 にアクセスすれば、配置したファイルが表示できる。

### ホストPCとフォルダを共有する

仮想環境上の /vagrant と ホストPCの Vagrantfile が格納されているディレクトリは同期されている。

そのため、以下の準備をしておくことで、Vagantfile配下に配置したファイルを動的に確認することができる。

**ドキュメントルートを同期できるディレクトリに設定する**

```
$ sudo rm -rf /var/www/html
$ sudo ln -fs /vagrant /var/www/html
```

シンボリックリンクを設定した後、Vagrantfile配下に適当なファイルを配置すると、 192.168.33.10 から表示することができる。

Vagrantfile配下のファイル内容を変更すると、同期されているため、
192.168.33.10 をリロードすれば変更後の内容が表示される。

## Provision を使ってみる

Vagrantfile内に起動時のコマンドを設定することができる。

```Vagrantfile
# Every Vagrant development environment requires a box. You can search for
# boxes at https://atlas.hashicorp.com/search.
config.vm.box = "centos70"

;; 以下のコマンドを指定すると、起動時に指定したコマンドが実行できる
config.vm.provision :shell, :inline => "echo hogehoge"

;; 以下のコマンドを指定すると、起動時に指定したファイルのコマンドが実行できる
config.vm.provision :shell, :path => "provision.sh"

```

**既に仮想マシンが立ち上がっている場合は provision を行う

```
$ vagrant provision
```

とりあえずここまでで、
Vagrantの立ち上げは完了。