【Ansible】AWSのネットワークを構築するPlaybookを書いてみた

こんにちは。お久しぶりです。
SS チームのしめじです。
本日は Ansible を使って AWS のネットワークを構築する Playbook についてです。
※ 先輩方が Terraform や CloudFormation で AWS のネットワークを構築する記事を書いているので、僕も肖ろうと思います。
今回構築するネットワークは下記のような形となります。

ディレクトリ構成
Playbook のディレクトリ構成は下記のような形となります。
├── README.md ├── ansible.cfg ├── hosts ├── roles │ └── aws_vpc │ ├── tasks │ │ └── main.yml │ └── vars │ └── main.yml └── vpc_create.yml
Playbook
inventoryファイル
root@DESKTOP-MOGIJIA:/opt/playbook/aws-vpc-2layer# cat hosts [localhost] 127.0.0.1
inventory ファイルにはローカルホストを指定して下さい。
Role
Ansible は Playbook を役割毎に「Role」という単位でモジュール化することができます。
今回は別途「aws_vpc」という Role を作って、main の Playbook から include することにします。
root@DESKTOP-MOGIJIA:/opt/playbook/aws-vpc-2layer# cat roles/aws_vpc/tasks/main.yml
---
# tasks file for aws_vpc
- name: create_vpc
ec2_vpc_net:
name: "{{ vpc_name }}"
cidr_block: "{{ vpc_cidr }}"
region: "{{ region }}"
dns_hostnames: yes
dns_support: yes
register: vpc_info
# PUBLIC_SUBNET 作成
- name: create_public_subnet
ec2_vpc_subnet:
vpc_id: "{{ vpc_info.vpc.id }}"
cidr: "{{ item.pub_subnet_cidr }}"
az: "{{ item.subnet_az }}"
region: "{{ region }}"
resource_tags: { "Name":"{{ item.pub_subnet_name }}" }
register: pubsub_info
with_items:
- "{{ pub_subnet }}"
# PRIVATE_SUBNET 作成
- name: create_private_subnet
ec2_vpc_subnet:
vpc_id: "{{ vpc_info.vpc.id }}"
cidr: "{{ item.pri_subnet_cidr }}"
az: "{{ item.subnet_az }}"
region: "{{ region }}"
resource_tags: { "Name":"{{ item.pri_subnet_name }}" }
register: prisub_info
with_items:
- "{{ pri_subnet }}"
# IGW 作成
- name: create_igw
ec2_vpc_igw:
vpc_id: "{{ vpc_info.vpc.id }}"
region: "{{ region }}"
tags: { "Name":"{{ igw_name }}" }
register: igw_info
# ROUTETABLE 作成(IGW)
- name: create_route_table
ec2_vpc_route_table:
vpc_id: "{{ vpc_info.vpc.id }}"
subnets: "{{ atache_igw_subnet }}"
routes:
- dest: 0.0.0.0/0
gateway_id: "{{ igw_info.gateway_id }}"
region: "{{ region }}"
resource_tags: { "Name":"{{ rttable_pub_name }}" }
Ansible では「ec2_vpc_xxx」モジュールを使用することで、AWS の vpc やサブネット、インターネットゲートウェイ等を構築することができます。
それと、諸々の値は後で変更できるように変数化しておきます。
変数の定義
root@DESKTOP-MOGIJIA:/opt/playbook/aws-vpc-2layer# cat roles/aws_vpc/vars/main.yml
---
# vars file for aws_vpc
# REGION
region: "ap-northeast-1"
# VPC
vpc_name: "shimeji-wd-vpc"
vpc_cidr: "10.0.0.0/16"
# IGW
igw_name: "shimeji-igw"
# ROUTETABLE(PUBLIC)
rttable_pub_name: "shimeji-pub-rt"
# PUBLIC_SUBNET
pub_subnet:
- { pub_subnet_cidr: "10.0.10.0/24" ,subnet_az: "ap-northeast-1a" ,pub_subnet_name: "shimeji-wd-public-subnet-a" }
- { pub_subnet_cidr: "10.0.20.0/24" ,subnet_az: "ap-northeast-1c" ,pub_subnet_name: "shimeji-wd-public-subnet-c" }
# PRIVATE_SUBNET
pri_subnet:
- { pri_subnet_cidr: "10.0.30.0/24" ,subnet_az: "ap-northeast-1a" ,pri_subnet_name: "shimeji-wd-private-subnet-a" }
- { pri_subnet_cidr: "10.0.40.0/24" ,subnet_az: "ap-northeast-1c" ,pri_subnet_name: "shimeji-wd-private-subnet-c" }
# IGW に紐付けるサブネット
atache_igw_subnet:
- "10.0.10.0/24"
- "10.0.20.0/24"
今回はそれぞれのリソースの名前に「shimeji」の prefix をつけてみます。
Playbook
はい、メインの Playbook です。
↑で作成した Role を include します。
root@DESKTOP-MOGIJIA:/opt/playbook/aws-vpc-2layer# cat vpc_create.yml
---
# VPC CREATE Playbook
- name: create vpc subnet igw routetable
hosts: localhost
connection: local
gather_facts: False
become: False
roles:
- aws_vpc
今回はサーバをプロビジョニングするわけではないので、「gather_facts」「become」は不要です。
これで準備完了です。
実行
root@DESKTOP-MOGIJIA:/opt/playbook/aws-vpc-2layer# ansible-playbook -i hosts vpc_create.yml
PLAY [create vpc subnet igw routetable] ********************************************************************************
TASK [aws_vpc : create_vpc] ********************************************************************************************
changed: [127.0.0.1]
TASK [aws_vpc : create_public_subnet] **********************************************************************************
changed: [127.0.0.1] => (item={u'pub_subnet_name': u'shimeji-wd-public-subnet-a', u'subnet_az': u'ap-northeast-1a', u'pub_subnet_cidr': u'10.0.10.0/24'})
changed: [127.0.0.1] => (item={u'pub_subnet_name': u'shimeji-wd-public-subnet-c', u'subnet_az': u'ap-northeast-1c', u'pub_subnet_cidr': u'10.0.20.0/24'})
TASK [aws_vpc : create_private_subnet] *********************************************************************************
changed: [127.0.0.1] => (item={u'pri_subnet_cidr': u'10.0.30.0/24', u'pri_subnet_name': u'shimeji-wd-private-subnet-a', u'subnet_az': u'ap-northeast-1a'})
changed: [127.0.0.1] => (item={u'pri_subnet_cidr': u'10.0.40.0/24', u'pri_subnet_name': u'shimeji-wd-private-subnet-c', u'subnet_az': u'ap-northeast-1c'})
TASK [aws_vpc : create_igw] ********************************************************************************************
changed: [127.0.0.1]
TASK [aws_vpc : create_route_table] ************************************************************************************
changed: [127.0.0.1]
PLAY RECAP *************************************************************************************************************
127.0.0.1 : ok=5 changed=5 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
うん、正常に実行出来てますね。
終わりに
僕の尊敬する先輩方の記事はこちら
■ CloudFormation
https://beyondjapan.com/blog/2019/03/cloudformation1/
■ Terraform
https://beyondjapan.com/blog/2018/07/terraform-aws-network-module/
0