はじめに
前回の続きでAnsibleでEC2インスタンスを構築を目指していこうと思います。
まずは、VPCの構築。
前提
OS X El Capitan (バージョン 10.11.4 )
Python 2.7.10
Ansible 2.0.1.0
AWSのIAMアカウントのアクセスキー
-->アクセスキーはAWSのコンソールでIAMから作成しておいてください。
botoのインストール
ここを参考にAWS SDK For Python (Boto)をインストール
$ sudo pip install boto
Password:
Collecting boto
Downloading boto-2.39.0-py2.py3-none-any.whl (1.3MB)
100% |████████████████████████████████| 1.4MB 435kB/s
Installing collected packages: boto
Successfully installed boto-2.39.0
アクセスキーの設定
aws configureコマンドで~/.awsディレクトリ配下にファイルを作成します。
リージョンは特に理由がなければ、東京リージョンであるap-northeast-1にします。
$ aws configure
AWS Access Key ID []: <アクセスキーの入力>
AWS Secret Access Key []: <シークレットキーの入力>
Default region name [None]: ap-northeast-1
Default output format [None]: json
$ ls ~/.aws
config credentials
プレイブックの作成
以下のファイルを作ってください。
VPCの作成には、ec2_vpcモジュールを使います。
---
- name: "create vpc"
include: create_vpc.yml
---
- name: "create vpc"
ec2_vpc:
cidr_block: "{{ vpc.cidr_block }}"
resource_tags: { "Name":"{{ vpc.vpc_name }}" }
subnets:
- cidr: "{{ vpc.sabnet_cidr1 }}"
az: "{{ vpc.az1 }}"
resource_tags: { "Name":"{{ vpc.sabnet_name1 }}" }
- cidr: "{{ vpc.sabnet_cidr2 }}"
az: "{{ vpc.az2 }}"
resource_tags: { "Name":"{{ vpc.sabnet_name2 }}" }
internet_gateway: True
route_tables:
- subnets:
- "{{ vpc.sabnet_cidr1 }}"
- "{{ vpc.sabnet_cidr2 }}"
routes:
- dest: 0.0.0.0/0
gw: igw
region: "{{ vpc.region }}"
state: present
wait: true
register: vpc_regst
- debug: var=vpc_regst
when: vpc_regst | success
---
vpc:
vpc_name: "AnsibleVPC"
region: "ap-northeast-1"
cidr_block: "172.22.0.0/16"
sabnet_name1: "sabnet1"
sabnet_name2: "sabnet2"
sabnet_cidr1: "172.22.1.0/24"
sabnet_cidr2: "172.22.2.0/24"
az1: "ap-northeast-1a"
az2: "ap-northeast-1c"
---
- hosts: localhost
roles:
- aws
[localhost]
127.0.0.1
lamp.ymlのrolesには、実行するロールを定義します。(roles/<ココ>/tasks/)
tasks/main.ymlには、実行するPlaybookを定義します。
./roles/aws/vars/main.ymlに変数を定義します。
プレイブックの実行
Playbookの実行には、ansible-playbookでlamp.ymlを指定します。
$ ansible-playbook lamp.yml
[WARNING]: provided hosts list is empty, only localhost is available
PLAY ***************************************************************************
TASK [setup] *******************************************************************
ok: [localhost]
TASK [aws : create vpc] ********************************************************
included: /Users/XXXX/ansible/roles/aws/tasks/create_vpc.yml for localhost
TASK [aws : create vpc] ********************************************************
changed: [localhost]
TASK [aws : debug] *************************************************************
ok: [localhost] => {
"vpc_regst": {
"changed": true,
"igw_id": "igw-37fa4052",
"subnets": [
{
"az": "ap-northeast-1a",
"cidr": "172.22.1.0/24",
"id": "subnet-0f7f4c78",
"resource_tags": {
"Name": "sabnet2"
}
},
{
"az": "ap-northeast-1c",
"cidr": "172.22.2.0/24",
"id": "subnet-0eade557",
"resource_tags": {
"Name": "sabnet1"
}
}
],
"vpc": {
"cidr_block": "172.22.0.0/16",
"dhcp_options_id": "dopt-e660868e",
"id": "vpc-e88cd98d",
"region": "ap-northeast-1",
"state": "available"
},
"vpc_id": "vpc-e88cd98d"
}
}
PLAY RECAP *********************************************************************
localhost : ok=4 changed=1 unreachable=0 failed=0
詳細を出力したい場合は、vvvvオプションつけてください。
ansible-playbook lamp.yml -vvvv
その他
./roles/aws/vars/main.ymlでアベイラビリティゾーンの指定間違えてたら
ansible実行時に以下のエラーがでました。
AttributeError: 'NoneType' object has no attribute 'get_all_vpcs'
botoインストールするの忘れてると以下のエラーがでました。
※間違えてboto3だけ入れてたらでました。
fatal: [localhost]: FAILED! => {"changed": false, "failed": true, "invocation": {"module_name": "ec2_vpc"}, "parsed": false}
#まとめ
これでVPCが作成されます。
次に、debugモジュールで出力した情報を元にec2を作成していきます。
それにしても、ansible実行すると毎回、ステータスがchange=1になるのが不思議です。