Ec2 user data ansible when

は じ め に

は じ め ま し て 、 多 田 で す。

最近 は 環境 構築 に Ansible を 利用 す る こ と が 多 く な り ま し た が, 調 べ て い る と AWS の よ う な ク ラ ウ ド 環境 の 構築 に つ い て も Ansible は そ の 多 く を 標準 モ ジ ュ ー ル と し て 備 え て い る よ う で す の で, い く つ か 試 し てみ ま し た。

ど こ ま で や る か

標準 モ ジ ュ ー ル を 利用 し た Playbook を 作成 し 、 以下 の 内容 の 構築 ・ 設定 を 行 え る よ う に す る。

  • セ キ ュ リ テ ィ グ ル ー プ の 作成
  • EC2 イ ン ス タ ン ス の 作成
  • AMI の 作成
  • CloudWatch の 設定 (オ ー ト リ カ バ リ)

前提

  • AWS マ ネ ジ メ ン ト コ ン ソ ー ル で 、 サ ー バ ー 構築 に 使用 す る IAM ユ ー ザ が 作成 さ れ て い る こ と
  • AWS マ ネ ジ メ ン ト コ ン ソ ー ル で 、 キ ー ペ ア を 登録 し て あ る こ と

準備

Python イ ン ス ト ー ル

pyenv で python を イ ン ス ト ー ル し ま す。

[vagrant @ ansible ~] $ sudo yum install git
[vagrant @ ansible ~] $ curl-Lhttps: //raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash
[vagrant @ ansible ~] $ echo'export PATH = "$ HOME / .pyenv / bin: $ PATH" '>> ~ / .bashrc
[vagrant @ ansible ~] $ echo'eval "$ (pyenv init -)" '>> ~ / .bashrc
[vagrant @ ansible ~] $ echo'eval "$ (pyenv virtualenv-init -)" '>> ~ / .bashrc
[vagrant @ ansible ~] $ source ~ / .bashrc
[vagrant @ ansible ~] $ pyenv install2.7.10
[vagrant @ ansible ~] $ pyenv rehash
[vagrant @ ansible ~] $ pyenv global2.7.10
[vagrant @ ansible ~] $ python - version

Ansible イ ン ス ト ー ル

pip で Ansible を イ ン ス ト ー ル し ま す。

[vagrant @ ansible ~] $ pip install ansible
[vagrant @ ansible ~] $ ansible - version

boto イ ン ス ト ー ル

pip で boto を イ ン ス ト ー ル し ま す (Ansible の AWS 関 連 モ ジ ュ ー ル を を 利用 す る の に 必要)。

[vagrant @ ansible ~] $ pip install boto
[vagrant @ ansible ~] $ pip list | grep "boto"

API 接 続 情報 設定

IAM ユ ー ザ 作成 時 に 設定 し た API の 接 続 情報 を 、 環境 環境 変 数 に 設定 し ま す。

[vagrant @ ansible ~] $ export AWS_ACCESS_KEY_ID = ア ク セ ス キ ー
[vagrant @ ansible ~] $ export AWS_SECRET_ACCESS_KEY = シ ー ク レ ッ ト ア ク セ ス キ ー
[vagrant @ ansible ~] $ env | grep "AWS_"
AWS_SECRET_ACCESS_KEY = シ ー ク レ ッ ト ア ク セ ス キ ー

Dynamic Inventory フ ァ イ ル ダ ウ ン ロ ー ド

Ansible の リ ポ ジ ト リ か ら
ec2.ini と
ec2.py を ダ ウ ン ロ ー ド し て お く。

Playbook の 構成

├─ansible-playbook
├─development.yml
├─hosts
│ └─development
│ └─ec2.ini (準備 段 階 で ダ ウ ン ロ ー ド し た ec2.ini を 設置 す る)
│ └─ec2.py (準備 段 階 で ダ ウ ン ロ ー ド し た ec2.py を 設置 す る。 実 行 権 限 を 付 与 し て お く)
├─roles
│ ├─ami
│ │ └─tasks
│ │ └─main.yml
│ ├─cloud_watch
│ │ └─tasks
│ │ └─main.yml
│ ├─ec2
│ │ └─tasks
│ │ └─main.yml
│ ├─security_group
│ │ └─tasks
│ │ └─main.yml

Playbook の 中 身

development.yml

master playbook で す。

connection: local
gather_facts: no
- role: security_group
- role: ec2
ami_image: ami-cbf90ecb
key_name: ec2-key # AWS に 登録 し た キ ー ペ ア 名 を 入 力
my_ip: xxx.xxx.xxx.xxx/32 # ア ク セ ス 元 の IP ア ド レ ス
group_name: "development"
instance_type: "t2.micro"
device_name: "/ dev / xvda"
device_type: "gp2"
volume_size: 20 # EBS の デ ィ ス ク サ イ ズ (GB)
- hosts: tag_Name_development
remote_user: ec2-user
gather_facts: no
- role: ami
- role: cloud_watch

roles / security_group / tasks / main.yml

ec2_group モ ジ ュ ー ル を 使 っ て 、 セ キ ュ リ テ ィ グ ル ル プ を 作成 し ま す。
イ ン バ ウ ン ド は ssh の み を 許可 し 、 ア ウ ト バ ウ ン ド は 全 て て の 通信 を 許可 し ま す。

name: "{{group_name}}"
description: "{{group_name}} serversecuritygroup"
region: ap-northeast-1
rules:
- proto: tcp
from_port: 22
to_port: 22
cidr_ip: "{{my_ip}}"
rules_egress:
- proto: all
from_port: 0
to_port: 65535
cidr_ip: 0.0.0.0/0

roles / ec2 / tasks / main.yml

ec2 モ ジ ュ ー ル を 使 っ て 、 EC2 イ ン ス タ ン ス を 作成 し ま す。
EC2 イ ン ス タ ン ス に は development と い う タ グ を 付 け ま す。

image: "{{ami_image}}"
instance_type: "{{instance_type}}"
region: ap-northeast-1
key_name: "{{key_name}}"
group: "{{group_name}}"
instance_tags:
Name: "{{group_name}}"
wait: yes
wait_timeout: 300
volumes:
- device_name: "{{device_name}}"
device_type: "{{device_type}}"
volume_size: "{{volume_size}}"
delete_on_termination: yes
register: ec2
- name: SSH で 接 続 で き る よ う に な る ま で 待機
wait_for: port = 22 host = "{{item.public_ip}}" timeout = 300 state = started
with_items: ec2.instances
- name: 作成 し た EC2 イ ン ス タ ン ス を イ ン ベ ン ト リ に 追加
add_host: hostname = "{{item.public_ip}}" groupname = "tag_Name _ {{group_name}}"
with_items: ec2.instances

roles / ami / tasks / main.yml

ec2_ami モ ジ ュ ー ル を 使 っ て 、 AMI を 作成 し ま す。

local_action:
module: ec2_ami
delete_snapshot: "yes"
description: "{{ansible_ec2_security_groups}} serverAMI"
instance_id: "{{ansible_ec2_instance_id}}"
name: "{{ansible_ec2_security_groups}}"
no_reboot: "no"
region: "ap-northeast-1"
state: "present"
wait: "yes"
wait_timeout: 600

roles / cloud_watch / tasks / main.yml

ec2_metric_alarm モ ジ ュ ー ル を 使 っ て 、 CloudWatch の 設定 を 行 い ま す。
Amazon Web Services ブ ロ グ を 参考 に 、 オ ー ト リ カ バ リ を 設定 設定 し て み ま す。

local_action:
module: ec2_metric_alarm
alarm_actions: ["arn: aws: automate: ap-northeast-1: ec2: recover"]
comparison: "> ="
description: "Created fromAnsiblePlaybook"
dimensions: "{'InstanceId': '{{ansible_ec2_instance_id}}'}"
evaluation_periods: 3
metric: "StatusCheckFailed_System"
name: "awsec2 - {{ansible_ec2_instance_id}} - High-Status-Check-Failed-System-"
namespace: "AWS / EC2"
period: 60
region: "ap-northeast-1"
state: "present"
statistic: "minimum"
threshold: 1.0

Playbook の 実 行

以下 の よ う に し て Playbook を 実 行 す る と 、 環境 構築 が 行 わ れ ま す。

[vagrant @ ansible ~] $ ansible-playbook-ihosts / development / ec2.pydevelopment.yml - private-key = EC2 の 秘密 鍵

ポ イ ン ト

role の う ち 、
ami と
cloud_watch
の 実 行 に は 、 対 象 EC2 イ ン ス タ ン ス の イ ン ス タ ン ス ID が 必要 と な り ま す。
イ ン ス タ ン ス ID は 、 ec2_facts モ ジ ュ ー ル で 取得 で き ま す が 、 そ そ の 前 に 対 象 ホ ホ ス ト を 特定 す る 必要 が あ り ま す。
対 象 ホ ス ト の IP ア ド レ ス を 直接 指定 す る こ と も で き ま す が 、 Ansible に は dynamic_inventory と い う 仕 組 み が 用意 さ れ て い る の ト し て を ち ち ト し て を ち ち で て を こ ち 利用 で し て 指定 ち ち ト し て 指定 ち ち で て 指定 ち ち ト で て 指定 ち ち で て す ス ち
嬉 し い 事 に 、 Ansible に は EC2 用 の dynamic_inventory が 標準 で 用意 さ れ て い ま す。
※ 準備 段 階 で ダ ウ ン ロ ー ド し た
ec2.ini と
ec2.py で す。

development.yml (master playbook) で
hosts: tag_name_development
と い う 形 で 対 象 ホ ス ト を 指定 し て い ま す が 、 こ の 場合 は development と い う タ グ を 付 け た EC2 イ ン ス タ ン ス が 対 象 ホ ス ト ま す な り

Ec2.py

"hostvars": {
      "52.68.9.18": {
      }
    }
"ami-cbf90ecb": [
    "52.68.9.18"
"ap-northeast-1": [
    "52.68.9.18"
"ap-northeast-1a": [
    "52.68.9.18"
    "52.68.9.18"
"i-d2d3f721": [
    "52.68.9.18"
"security_group_manage": [
    "52.68.9.18"
"tag_Name_manage": [
    "52.68.9.18"
"type_t2_micro": [
    "52.68.9.18"
"vpc_id_vpc-b04d44d2": [
    "52.68.9.18"
Comments are closed, but you can leave a trackback: Trackback URL.