We will learn how to create Ansible Playbook for provisioning a new EC2 instance in AWS cloud. Please follow the below steps in the machine where you have installed Ansible.

Watch here for YouTube Video:
Pre-requisites:
Ansible is installed and Boto is also installed on Ubuntu EC2 instance
Make sure you create an IAM role with AmazonEC2FullAccess policy and attach the role to EC2 instance.
Steps to create EC2 instance using Ansible:
Login to EC2 instance using Git bash or ITerm/putty where you installed Ansible. Execute the below command:
Create an Inventory file first
sudo mkdir /etc/ansible
Edit Ansible hosts or inventory file
sudo vi /etc/ansible/hosts
Add the below two lines in the end of the file:
[localhost]
local
Add the below two lines in the end of the file:
[localhost]
local
cd ~
mkdir playbooks
mkdir playbooks
cd playbooks
Create Ansible playbook
sudo vi create_ec2.yml
(copy the below content in green color)
(copy the below content in green color)
edit the create_jenkins_ec2.yml to make sure you update the key which is red marked below:
---
- name: provisioning EC2 instances using Ansible
hosts: localhost
connection: local
gather_facts: False
tags: provisioning
vars:
keypair: yourEC2Key
instance_type: t2.small
image: ami-007855ac798b5175e
wait: yes
group: webserver
count: 1
region: us-east-1
security_group: my-jenkins-security-grp
tasks:
- name: Task # 1 - Create my security group
local_action:
module: ec2_group
name: "{{ security_group }}"
description: Security Group for webserver Servers
region: "{{ region }}"
rules:
- proto: tcp
from_port: 22
to_port: 22
cidr_ip: 0.0.0.0/0
- proto: tcp
from_port: 8080
to_port: 8080
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
register: basic_firewall
- name: Task # 2 Launch the new 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: Task # 3 Add Tagging to EC2 instance
local_action: ec2_tag resource={{ item.id }} region={{ region }} state=present
with_items: "{{ ec2.instances }}"
args:
tags:
Name: MyTargetEc2Instance
An exception occurred during task execution. To see the full traceback, use -vvv. The error was: botocore.exceptions.NoCre
ReplyDeletedentialsError: Unable to locate credentials
fatal: [local -> localhost]: FAILED! => {"boto3_version": "1.20.30", "botocore_version": "1.23.30", "changed": false, "msg
": "Error in describe_security_groups: Unable to locate credentials"}
Getting this error while use yoyr above script
Did you attach your IAM role to Ansible machine ?
DeleteTASK [Task] *******************************************************************************************************************************************
ReplyDeletefatal: [localhost]: FAILED! => {"msg": "The module ec2\n was not found in configured module paths"}
Below is the error I'm getting; can you please help?
ReplyDeletefatal: [local -> localhost]: FAILED! => {"changed": false, "msg": "Failed to import the required Python library (botocore or boto3) on ip-172-31-30-99.ec2.internal's Python /usr/bin/python3.8. Please read the module documentation and install it in the appropriate location. If the required library is installed, but Ansible is using the wrong Python interpreter, please consult the documentation on ansible_python_interpreter"}
i got the same error, did u found any solution, tony?
DeleteJ'ai eu la même erreur, avez-vous trouvé une solution?
DeleteHi. I am new to devops.
ReplyDeletei tried to provide ec2 instalce through playbook. but i got below error
Python, ansible, pip, boto, boto3 and botocore are installed here.
Can you please advice me?
root@test-my-test () ~ # ansible-playbook ec2.yml
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'
PLAY [provisioning EC2 instances using Ansible] *********************
TASK [Task] ********************************************************
ok: [localhost -> localhost]
TASK [Task] ************************************************
*fatal: [localhost -> localhost]: FAILED! => {"changed": false, "msg": "boto required for this module”}*
PLAY RECAP ******************************************************
localhost : ok=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
root@test-my-test () ~ # pip list | grep boto
boto 2.49.0
boto3 1.26.3
botocore 1.29.3
root@test-maltesh-test () ~ #
root@test-my-test () ~ # python -c "import botocore"
root@test-my-test () ~ # python -c "import boto"
root@test-my-test () ~ # ansible --version
ansible 2.9.27
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.18 (default, May 25 2022, 14:30:51) [GCC 7.3.1 20180712 (Red Hat 7.3.1-15)]
root@test-my-test () ~ # python --version
Python 3.7.10