Amazon Web Services is introduced term called “Infrastructure as a Code” where you no need to provisioning and maintenance manually everything is going to be peace of code. In this case Ansible AWS EC2 Instance creation using ansible playbook which provides automated provisioning of EC2 instances.
No need of manual login to AWS EC2 console and clicking and creating instances, use feature to provision/create ansible is the power full tool.
AWS EC2 Instance Creation Using Ansible
Preparing Environment before invoking playbook
I am using Centos 7.4 Operating System version as Ansible main node. To communicate with AWS we are going to use boto / boto3 aws.
# yum install python python-setuptools* ansible git curl wget
# curl -O https://bootstrap.pypa.io/get-pip.py
# python get-pip.py
$ python --version
Python 2.7.5
$ pip --version
pip 18.1 from /usr/lib/python2.7/site-packages/pip (python 2.7)
# pip install boto
# pip install boto3
Use this Amazon lab practice guide to create IAM user with programmatic access and user should have access to create/launch EC2 instance
Create a boto file with access key and access secret id to authenticate to aws
# vi ~/.boto
[Credentials]
aws_access_key_id = YOUR_ACCESS_KEY
aws_secret_access_key = YOUR_SECRET_KEY
Write Ansible Playbook to launch aws ec2 instance
Define Variables
Tasks
Create New Security Group
Launch EC2 Instance
Add Tags for identification
# git clone https://github.com/techtutorials/ansible-palybooks.git# cd ansible-playbooks
Look for spinawsec2.yml file
---
- name: Provision an EC2 Instance
hosts: localhost
connection: local
gather_facts: False
tags: provisioning
vars:
instance_type: t2.micro
security_group: webservers
image: ami-0080e4c5bc078760e
region: us-east-1
keypair: sshkeypair
count: 1
tasks:
- name: Create New security group with below given name
local_action:
module: ec2_group
name: "{{ security_group }}"
description: Security Group for Newly Created EC2 Instance
region: "{{ region }}"
rules:
- proto: tcp
from_port: 22
to_port: 22
cidr_ip: 0.0.0.0/0
- proto: tcp
from_port: 80
to_port: 80
cidr_ip: 0.0.0.0/0
rules_egress:
- proto: all
cidr_ip: 0.0.0.0/0
- name: Launch the new t2 micro EC2 Instance
local_action: ec2
group={{ security_group }}
instance_type={{ instance_type}}
image={{ image }}
wait=true
region={{ region }}
keypair={{ keypair }}
count={{count}}
register: ec2
- name: Wait for EC2 Instance to Spin-up and ready for SSH access
local_action: wait_for
host={{ item.public_ip }}
port=22
state=started
with_items: "{{ ec2.instances }}"
- name: Adding Tags to Identify
local_action: ec2_tag resource={{ item.id }} region={{ region }} state=present
with_items: "{{ ec2.instances }}"
args:
tags:
Name: Web Server
Owner: Ravi Kumar
PurPose: Testing EC2 Instance From Ansible
Pro’s and Con’s
Using this ansible playbook aws ec2 instance creation can be done, however every time when you want to launch remember to change below variable values
AMI ID
Region
Instance Type
Security Group Name
SSH Key Pair Name
Count of instances to be created
To make play book more flexible and interactive delete vars section and pass the same variables on playbook execution
vars:
instance_type: t2.micro
security_group: webservers
image: ami-0080e4c5bc078760e
region: us-east-1
keypair: NVirginia
count: 1
Example of passing variables while running ansible playbook
ansible-playbook spinawsec2.yml -e instance_type=t2.micro -e security_group=WebServers -e image=ami-0080e4c5bc078760e -e region=us-east-1 -e keypair=NVirginia -e count=1
That’s about aws ec2 instance creation using ansible playbook.