AnsibleでEC2サーバーを立ててApacheを導入するところまで。

概要

AWS上にEC2サーバーを立て、そこにApacheをインストールするところまで。

事前準備

pythonにboto/boto3を入れる

AnsibleはPythonで動いており、pythonAWSライブラリである。botoを利用してawsにアクセスするため

pip install boto boto3

AWS環境の事前準備

  1. マネジメントコンソールからAWS_SECRET_ACCESS_KEY / AWS_SECERT_ACCESS_KEY を取得して環境変数に設定する。
export AWS_ACCESS_KEY_ID='< マネジメントコンソールで取得したやつ >'
export AWS_SECRET_ACCESS_KEY='< マネジメントコンソールで取得したやつ >'
  1. EC2用のkeypairを作成し、ダウンロードしておく

作成したインスタンスにそのままアクセスできるように。 /.ssh/keypair.pemとして配置しておく。
Ansibleで作成することもできるが今回の本題ではないので省略。

Ansibleの設定

homahi-2:ansible homahi$ tree .
.
├── ansible.cfg
├── aws.retry
├── aws.yml
├── hosts
├── roles
│   ├── apache
│   │   └── tasks
│   │       └── main.yml
│   └── ec2
│       └── tasks
│           └── main.yml
├── site.yml
└── ssh_config

最終的にこんな感じにする。

Ansibleでやること

  1. AWSセキュリティグループを作る
  2. EC2を立てる
  3. Apacheを入れて再起動する

EC2を立てるまでと、Apacheを入れる部分は別のplaybookにした。

AWSの設定

hosts

[localhost]
127.0.0.1

[localhost:vars]
# /usr/bin/pythonというデフォルトパスを通常はみてしまう
ansible_python_interpreter=/Users/homahi/.pyenv/shims/python

ansible_python_interpreterはpyenvなどでデフォルトとpythonのパスが異なる時に必要になる。
これが無いと/usr/bin/pythonとかを見に行ってこける。
ちょっと詰まった。

aws.yml

- hosts: localhost
  connection: local
  gather_facts: no
  roles:
    - role: ec2

roles/ec2/tasks

- name: セキュリティグループを作成
  ec2_group:
    name: Test Security Group
    description: server security group
    region: us-east-1
    rules:
      - proto: tcp
        from_port: 22
        to_port: 22
        cidr_ip: """my_ip"""
      - proto: tcp
        from_port: 80
        to_port: 80
        cidr_ip: """my_ip"""
    rules_egress:
      - proto: all
        from_port: 0
        to_port: 65535
        cidr_ip: 0.0.0.0/0
- name: EC2を作成する
  ec2:
    image: ami-8c1be5f6
    instance_type: t2.micro
    key_name: keypair
    group: Test Security Group
    wait: yes
    wait_timeout: 300
    region: us-east-1
  register: _ec2
- debug: var=_ec2
- name: SSHで接続できるようになるまで待機
  wait_for: port=22 host="{{ item.public_ip }}" timeout=300 state=started
  with_items: "{{_ec2.instances}}"
ansible-playbook aws.yml -i hosts

これで22,80番portのみが自分のサイトに対して開いているEC2が立つ。 本当はdinamic inventoryで動的にIPを取得したいけど、今回は対象外。

Apacheを入れる

site.yml

- hosts: web
  become: yes
  remote_user: ec2-user
  roles:
    - role: apache

hosts(追記)

[web]
webserver

ssh_config

Host webserver
    HostName <<EC2のipアドレス>>
    Port 22
    User ec2-user
    IdentityFile ~/.ssh/keypair.pem

ansible.cfg

[ssh_connection]
control_path = %(directory)s/%%h-%%r
ssh_args = -o ControlMaster=auto -o ControlPersist=60s -F ssh_config
ansible-playbook site.yml -i hosts

正常に動けば、EC2にApacheが入っていることが確認できる。