VagrantとAnsibleでEC2インスタンスを起動してみる

試します。

前提

Vagrantインストール

まずはVagrantをインストールします。

wget https://dl.bintray.com/mitchellh/vagrant/vagrant_1.7.4_x86_64.rpm
rpm -i vagrant_1.7.4_x86_64.rpm

次に、Vagrantプラグインをとってきます。

// EC2インスタンスをVagrantから簡単に扱うためのプラグイン
vagrant plugin install vagrant-aws

// 環境変数の管理を簡単にするプラグイン
vagrant plugin install dotenv

// AnsibleをVagrantのprovisionerに指定するためのプラグイン
vagrant plugin install ansible

Ansibleインストール

Ansibleのインストールはpipで行います。

pip install ansible==1.8.1

ここで 1.8.1 を指定しているのは、1.8.2 以降だと後に記述する公開鍵の配備モジュールがバグで動かないケースがあるようだからです。
最新版では動きませんでしたorz。

Vagrantfile編集

先程とってきたプラグインを使用して、VagrantからEC2インスタンスを起動できるようにします。

# -*- mode: ruby -*-
# vi: set ft=ruby :

Dotenv.load

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  # EC2インスタンスの起動にBoxは必要ないのですが、Vagrantの仕様上何かしら指定する必要があるのでダミーが容易されています。
  config.vm.box = "dummy"
  config.vm.box_url = "https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box"

  # ここからAWSの設定をしていきます。
  config.vm.provider :aws do |aws, override|
    aws.access_key_id          = ENV['AWS_ACCESS_KEY_ID']
    aws.secret_access_key      = ENV['AWS_SECRET_ACCESS_KEY']
    aws.keypair_name           = ENV['AWS_KEYPAIR_NAME']

    aws.region                 = "リージョン" # ap-northeast-1 など 
    aws.availability_zone      = "アベイラビリティーゾーン" # ap-northeast-1a など
    aws.ami                    = "AMIのID" # ami-9a2fb89a など
    aws.instance_type          = "インスタンスタイプ" # t2.micro など

    aws.security_groups        = ['セキュリティグループ1','セキュリティグループ2', ...] # sg-abcdefg など 複数指定可能
    aws.subnet_id = "サブネットID" # subnet-abcdefg など
    aws.private_ip_address = "プライベートIPアドレス" # 10.0.1.100 など

    aws.tags                   = {
      "Name"        => "名前を記述します。",
      "Description" => "説明を記述します。",
    }

    # IAMロールを指定する場合
    aws.use_iam_profile = true or false 
    aws.iam_instance_profile_arn = 'IAMのARN' # arn:aws:iam::123456789:instance-profile/s3FullAccessRole など

    override.ssh.username = "SSHのユーザ名" # ec2-user など 
    override.ssh.private_key_path   = "SSHキーへのパス" # ~/.ssh/ec2-user.pem など
    override.vm.synced_folder  = "共有フォルダの設定" # ".", "/home/ec2-user/vagrant" など
    
    # Ansibleでプロビジョンするように設定
    override.vm.provision "ansible" do |ansible|
      ansible.playbook = "playbookを指定" # site.yml など
    end
  end
end

今回は2つのインスタンスが同じサブネット内に存在することが前提なので、特にElasticIPなどを使用してパプリックIPを割り当てなくてもSSHで接続できます。

Ansible作業ディレクトリ作成

適当な場所に作業ディレクトリを作成します。
Ansibleのディレクトリ構成のベストプラクティスは公式に書いてあります。

Best Practices — Ansible Documentation

今回は試しにこんな感じに作成しました。

common.yml
site.yml
roles
   └ common
        ├ files
        ├ tasks
        └ vars

Ansibleのファイル編集

今回はユーザを追加するタスクを実行してみます。

site.yml
common.ymlをインクルードするだけです。

---
- include: common.yml

common.yml
rolesにcommonを指定します。

---
- hosts: all
  sudo: yes
  roles:
    - common

tasks/add_user.yml
ユーザを追加するタスクです。
vars で定義されている変数 users を使用し、ユーザを追加します。

---
- name: add users
  user: name={{item.name}} password={{item.password}}
  with_items: users

tasks/main.yml
実行するタスクを指定します。

---
- include_vars: users.yml
- include: add_user.yml

vars/users.yml
変数 users を定義します。

---
users:
- { name: 'user1', password: '$1$pasuwado$tekitounaatai' }
- { name: 'user2', password: '$1$pasuwado$tekitounaatai' }
- { name: 'user3', password: '$1$pasuwado$tekitounaatai' }

EC2インスタンスを起動する

あとは以下のコマンドを実行するだけです。

vagrant up

これでEC2インスタンスが起動され、ユーザの追加処理も行われます。

おわり

Vagrantの便利な部分は少しずつ理解できてきましたが、分からない部分が多いのでもっと触っていきたいなあと。
あと、今回Ansibleに軽く触れてみましたがChefに比べると覚えることが少ない気がするので、個人的にはAnsibleのほうが使いやすいです。
Chef-Solo オワコン説が話題になったりしているしどうしようかな、と思ってる人はAnsibleを選択肢に入れてもいいかもしれませんね。