Vagrant による仮想サーバー管理 (WIP)


Vagrant はサーバー管理の共通インターフェースって感じがする。みんな覚えたら良いと思う。

尚、シークレットトークンとかは `.env` に記入するので `dotenv` を Vagrant にインストールしておく:

```bash
vagrant plugin install dotenv
```

* [dotenvを利用して環境ごとでVagrantfileの設定値を変更してみる - Glide Note - グライドノート](http://blog.glidenote.com/blog/2014/02/26/vagrant-dotenv/)

# Amazon Web Services

* [Amazon Web Services (AWS) - Cloud Computing Services](http://aws.amazon.com/)

## アクセスキー

アクセスキー (access key ID と secret access key) を確認しておく:

* [IAM Management Console](https://console.aws.amazon.com/iam/home?#security_credential)

## プロジェクト作成

### AMI

AMI の ID を確認しておく。

* [Amazon Linux AMI](http://aws.amazon.com/amazon-linux-ami/)
* [Cloud/AWS - CentOS Wiki](https://wiki.centos.org/Cloud/AWS)
* [Ubuntu Amazon EC2 AMI Finder](http://cloud-images.ubuntu.com/locator/ec2/)

※ [先日登場した t2.micro インスタンス](http://aws.typepad.com/aws_japan/2014/07/low-cost-burstable-ec2-instances.html)を使用する場合は、[仮想化方式](http://kanny.hateblo.jp/entry/2014/01/19/182759)が HVM の AMI を使用する必要がある。 

### Instance Types

* [AWS | Amazon EC2 | Instance Types](http://aws.amazon.com/ec2/instance-types/)

### Key Pair

インスタンス用の Key Pair を準備しておく。

* [AWS Management Console](https://console.aws.amazon.com/ec2/v2/home?region=ap-northeast-1)

### Security Group

インスタンス用の Secuirty Group を準備しておく。

* [AWS Management Console](https://console.aws.amazon.com/ec2/v2/home?region=ap-northeast-1)

## Vagrant

Vagrant AWS Provider プラグインをインストール:

* [mitchellh/vagrant-aws](https://github.com/mitchellh/vagrant-aws)

```bash
vagrant plugin install vagrant-aws
```

### Vagrantfile

AWS 用の `Vagrantfile` を作成:

```ruby
Dotenv.load
Vagrant.configure("2") do |config|
  # AWS の設定
  # https://github.com/mitchellh/vagrant-aws#configuration
  config.vm.provider :aws do |provider, override|
    provider.access_key_id = "#{ENV['YOUR_KEY']}"
    provider.secret_access_key = "#{ENV['YOUR_SECRET_KEY']}"

    provider.ami = "ami-bb562fba"
    provider.instance_type = "t2.micro"
    provider.keypair_name = "#{ENV['KEYPAIR_NAME']}"
    provider.region = "ap-northeast-1"

    provider.security_groups = [
      "vagrant"
    ]
    provider.tags = {
      "Name" => "Amazon Linux"
    }

	# ダミー Box の指定
    override.vm.box = "aws"
    override.vm.box_url = "https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box"

    override.ssh.username = "ec2-user"
    override.ssh.private_key_path = "#{ENV['PATH_TO_YOUR_PRIVATE_KEY']}"
  end
end
```

AWS インスタンスを起動:

```bash
vagrant up --provider=aws
```

AWS インスタンスを破棄:

```bash
vagrant destroy
```

# Google Compute Engine

* [Google Compute Engine - Cloud Computing & Infrastructure As A Service — Google Cloud Platform — Google Cloud Platform](https://cloud.google.com/products/compute-engine/)

## gcutil

Google Compute Engine の CLI "gcutil" が途中で必要になるのでインストールしておく。

* [gcutil Tool - Google Compute Engine — Google Developers](https://developers.google.com/compute/docs/gcutil/)

インストール後、予め使用する Google アカウントにログインしておく:

```bash
gcloud auth login
```

## プロジェクト作成

Google Developer Console から Vagrant で管理するプロジェクトを作成する。

* [Google Developers Console](https://console.developers.google.com/)

プロジェクトを作成したら、下記工程を済ませておく:

1. "Google Compute Engine" を プロジェクトの "APIs" ページから有効にする。
2. 課金の請求先登録に移るのでクレジットカード情報等を登録する。
3. プロジェクトの "Credentials" ページの "Create new Client ID" ボタンから "Service account" を作成する。
4. 秘密鍵のダウンロード実行と、鍵のパスワード表示がされるので控えておく。
5. "VM instances" ページから、何でも良いので、手動で一つインスタンスを作成する。
6. インスタンスが作成されると "VM instances" ページにインスタンス一覧が表示される。
7. 一覧に "SSH" ボタンがあるのでクリックすると gcutil で実行するコマンドが表示される。
8. コマンドをコピーして CLI から実行する。
9. 初回は SSH のパスフレーズ設定があるので、必要に応じて設定する。
10. 完了すると、NIX 環境では `~/.ssh` 下に秘密鍵 `google_compute_engine` と公開鍵 `google_compute_engine.pub` が自動生成され、インスタンスに SSH ログインする。
11. この時、ログインユーザー名が決定されるが、これはローカルユーザーと同一になる模様。
11. `exit` コマンド等でインスタンスの SSH からログアウトする。

うーん、面倒くさい... ><

### Images

* [Images - Google Compute Engine — Google Developers](https://developers.google.com/compute/docs/images)
* [Operating Systems - Google Compute Engine — Google Developers](https://developers.google.com/compute/docs/operating-systems)

### Machine Types

* [Machine Types - Google Compute Engine — Google Developers](https://developers.google.com/compute/docs/machine-types)

### Network

* [Networking and Firewalls - Google Compute Engine — Google Developers](https://developers.google.com/compute/docs/networking)

## Vagrant

Vagrant Google Compute Engine (GCE) Provider プラグインをインストール:

* [mitchellh/vagrant-google](https://github.com/mitchellh/vagrant-google)

```bash
vagrant plugin install vagrant-google
```

### Vagrantfile

GCE 用の `Vagrantfile` を作成:

```ruby
Dotenv.load
Vagrant.configure("2") do |config|
  # GCE の設定
  # https://github.com/mitchellh/vagrant-google#configuration
  config.vm.provider :google do | provider, override|
    provider.google_project_id = "#{ENV['YOUR_GOOGLE_CLOUD_PROJECT_ID']}"
    provider.google_client_email = "#{ENV['YOUR_SERVICE_ACCOUNT_EMAIL_ADDRESS']}"
    provider.google_key_location = "#{ENV['PATH_TO_YOUR_PRIVATE_KEY']}"

    provider.image = "centos-6-v20140619"
    provider.machine_type = "f1-micro"

    provider.name = "my-instance"
    provider.network = "vagrant"

	# ダミー Box の指定
    override.vm.box = "gce"
    override.vm.box_url = "https://github.com/mitchellh/vagrant-google/raw/master/google.box"

    override.ssh.username = "#{ENV['USERNAME']}"
    override.ssh.private_key_path = "~/.ssh/google_compute_engine"
  end
end
```

GCE インスタンスを起動:

```bash
vagrant up --provider=google
```

GCE インスタンスを破棄:

```bash
vagrant destroy
```

# DigitalOcean

* [SSD Cloud Server, VPS Server, Simple Cloud Hosting | DigitalOcean](https://www.digitalocean.com/?refcode=d965c47c6bf7)

## アカウント設定

### SSH Key

"SSH Keys" ページより、SSH 鍵を生成して公開鍵を登録しておく。

* [DigitalOcean Control Panel](https://cloud.digitalocean.com/ssh_keys)

### Personal Access Token

"Apps & API" ページより、Personal Access Token を生成して確認しておく。

* [DigitalOcean Control Panel](https://cloud.digitalocean.com/settings/applications)

## Vagrant

Digital Ocean Vagrant Provider プラグインをインストール:

* [smdahlen/vagrant-digitalocean](https://github.com/smdahlen/vagrant-digitalocean)

```bash
vagrant plugin install vagrant-digitalocean
```

### Vagrantfile

DigitalOcean 用の `Vagrantfile` を作成:

```ruby
Dotenv.load
Vagrant.configure('2') do |config|
  # DigitalOcean の設定
  # https://github.com/smdahlen/vagrant-digitalocean#configure
  config.vm.provider :digital_ocean do |provider, override|
    # Personal Access Token
    # https://cloud.digitalocean.com/settings/applications
    provider.token = "#{ENV['PERSONAL_ACCESS_TOKEN']}"

    # Image
    # https://developers.digitalocean.com/#list-all-images
    provider.image = "CentOS 7.0 x64"

    # Region
    # https://developers.digitalocean.com/#list-all-regions
    provider.region = "sfo1"

    # Size
    # https://developers.digitalocean.com/#list-all-sizes
    provider.size = "512mb"

    # SSH Key
    # https://cloud.digitalocean.com/ssh_keys
    provider.ssh_key_name = "#{ENV['SSH_KEY_NAME']}"

    # SSH ユーザー名を指定
    override.ssh.username = "vagrant"

	# ダミー Box の指定
    override.vm.box = "digitalocean"
    override.vm.box_url = "https://github.com/smdahlen/vagrant-digitalocean/raw/master/box/digital_ocean.box"

    override.ssh.private_key_path = "#{ENV['SSH_KEY_PATH']}"
  end
end
```

DigitalOcean インスタンスを起動:

```bash
vagrant up --provider=digital_ocean
```

DigitalOcean インスタンスを破棄:

```bash
vagrant destroy
```

# Docker

* [Docker - Build, Ship, and Run Any App, Anywhere](https://www.docker.com/)

## Vagrant

Docker Provider は Vagrant で標準搭載されている。

* [Docker Provider - Vagrant Documentation](https://docs.vagrantup.com/v2/docker/index.html)

Docker では Box ファイルではなく、Docker イメージファイルから起動する。

Docker イメージから起動する場合の `Vagrantfile`:

```ruby
Vagrant.configure("2") do |config|
  config.vm.provider "docker" do |d|
    # イメージ foo/bar を指定
    d.image = "foo/bar"
  end
end
```

Docker イメージファイルを `Dockerfile` から生成する場合の `Vagrantfile`:

```ruby
Vagrant.configure("2") do |config|
  config.vm.provider "docker" do |d|
    # Vagrantfile と同階層の Dockerfile を指定
    d.build_dir = "."
  end
end
```

Docker インスタンスを起動:

```bash
vagrant up --provider=docker
```

# 物理サーバー

物理サーバーの場合は OS のインストールと SSH 接続環境の設定までは手動で終わらせておく必要がある。

## Vagrant

Vagrant ManagedServers Provider プラグインをインストール:

* [tknerr/vagrant-managed-servers](https://github.com/tknerr/vagrant-managed-servers)

```bash
vagrant plugin install vagrant-managed-servers
```

ManagedServers 用の `Vagrantfile` を作成:

```ruby
Vagrant.configure("2") do |config|
  # ManagedServers
  # https://github.com/tknerr/vagrant-managed-servers#configuration
  config.vm.provider :managed do |managed, override|
    managed.server = "ip-or-hostname"

	# ダミー Box の指定
    override.vm.box = "managed"
    override.vm.box_url = "https://github.com/tknerr/vagrant-managed-servers/raw/master/dummy.box"

    override.ssh.username = "ubuntu"
    override.ssh.private_key_path = "PATH TO YOUR PRIVATE KEY"
  end
end
```

ManagedServer インスタンスを起動:

```bash
vagrant up --provider=managed
```