ansible-playbook コマンド一発で EC2 インスタンス起動、EIP 設定、プロビジョニングまで一気にやる

Ansible 2.0 で追加された ec2_ami_find モジュールを使うと使用したいディストリビューションの最新版の AMI を動的に取得できるようになりました。この記事では、

  • ec2_ami_find モジュールで AMI を探す
  • ec2 モジュールで EC2 インスタンスを起動
  • 起動した EC2 インスタンスに ec2_eip モジュールで EIP を関連づける
  • 起動した EC2 インスタンスを add_host モジュールで動的に inventory に追加する
  • wait_for モジュールで EC2 インスタンスの初期化が終わるのを待つ
  • roles を順に実行してプロビジョニングを行う

までを ansible-playbook コマンド一発で行う方法を紹介します。

% ansible-playbook --extra-vars "hostname=ginyu" site.yml

ホスト名と IP アドレスの対応関係は group_vars/all に書きました(ドメインを設定しているので IP アドレスは EIP で固定したい)。

---
# group_vars/all

hosts:
  ginyu:
    ip: 93.184.216.34
  guldo:
    ip: 93.184.216.35
  recoome:
    ip: 93.184.216.36
  jeice:
    ip: 93.184.216.37
  burter:
    ip: 93.184.216.38

site.yml では launch.ymlconfigure.yml を読み込んでいるだけです。

---
# site.yml

- include: launch.yml
- include: configure.yml

launch.yml では EC2 インスタンスの起動と EIP の設定を行っています。

---
# launch.yml

- hosts: localhost
  gather_facts: False
  tasks:
    - ec2_ami_find:
        name: "ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-*"
        owner: 099720109477
        region: ap-northeast-1
        sort: name
        sort_order: descending
        sort_end: 1
      register: ami

    - ec2:
        image: "{{ ami.results[0].ami_id }}"
        key_name: my-key
        group: default
        instance_type: t2.medium
        count: 1
        wait: yes
        region: ap-northeast-1
        volumes:
          - device_name: /dev/sda1
            volume_size: 100
        vpc_subnet_id: subnet-1c9a1945
        instance_tags:
          Name: "{{ hostname }}"
      register: ec2

    - ec2_eip: device_id={{ ec2.instances[0].id }} region=ap-northeast-1 ip={{ hosts[hostname].ip }}

configure.yml では roles を実行してプロビジョニングを行っています。 wait_for しているのは EC2 インスタンスの初期化が終わるのを待つためです。

---
# configure.yml

- hosts: localhost
  gather_facts: False
  tasks:
    - add_host: groups=ec2hosts hostname={{ hosts[hostname].ip }}
    - wait_for: host={{ hosts[hostname].ip }} port=22 timeout=360 state=started

- hosts: ec2hosts
  become: yes
  become_method: sudo
  gather_facts: true
  user: ubuntu
  roles:
    - common
    - user
    - mysql
    - nginx
    - ruby

サーバ/インフラエンジニア養成読本 DevOps編 [Infrastructure as Code を実践するノウハウが満載! ] (Software Design plus)

サーバ/インフラエンジニア養成読本 DevOps編 [Infrastructure as Code を実践するノウハウが満載! ] (Software Design plus)