LAUNCHING EC2 INSTANCE AND CONFIGURING WEBSERVER IN MANAGED NODE BY DYNAMIC INVENTORY USING ANSIBLE ON AWS
Deploy Web Server on AWS through ANSIBLE!
♦️ Provision EC2 instance through ansible.
♦️ Retrieve the IP Address of instance using dynamic inventory concept.
♦️ Configure the web server through ansible!
♦️ Create role for web server to customize the Instance and deploy the webpage to root directory.
Optional : Write a playbook for testing of the tasks.
For Example: If the task is installation of httpd package then for checking the status of package, ansible has the module named as package_facts.
just like that search modules for checking status of each task! if u don’t find any module then command module can be useful
Note: Complete process have to be automated!
Prerequisites for this project:
1. AWS account should be created and, AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY are required.
2. Ansible version 2.9 should be installed.
First we have to update with update command we used dnf you used yum also both work on redhat8
sudo yum update
Then we install Python3 in redhat8 they have pre-install but check to install
sudo yum install python3
Install Pip also
sudo dnf install python3-pip
Now all set, now install Ansible
pip3 install ansible — user
Step 1. Launch ec2 instance
- hosts: localhost
gather_facts: no
vars_files:
- awspass.yml
tasks:
- name: Launching ec2 Instance
ec2:
key_name: "awskey"
instance_type: "t2.micro"
image: "ami-0ebc1ac48dfd14136"
wait: "yes"
count: 1
vpc_subnet_id: "subnet-11b3b479"
assign_public_ip: yes
region: "ap-south-1"
state: present
group_id: "sg-010258f611d46ff66"
aws_access_key: "{{ myuser }}"
aws_secret_key: "{{ mypass }}"
register: ec2
- debug:
var: ec2.instances[0].public_ipvim awspass.yml
myuser: “Paste Your ACCESSKEY here “
mypass: “Paste your SECRETKEY here”
ansible-playbook playbook_name.yml
Step 2. Updating inventory dynamically
Now, we will create a dynamic inventory that will update dynamically according to the instances present in the AWS.
For this purpose, Ansible provides us pre-created files for EC2. Just download the ec2.py and ec2.ini files form the Ansible on the GitHub branch stable-2.9 and place these files in the folder that has all of the inventory files.
wget https://raw.githubusercontent.com/ansible/ansible/stable-2.9/contrib/inventory/ec2.pywget https://raw.githubusercontent.com/ansible/ansible/stable-2.9/contrib/inventory/ec2.ini
chmod +x ec2.py chmod +x ec2.ini
Now, update the ec2.ini file
Also add your access key and secret access in the file
AWS_ACCESS_KEY=XXXX
AWS_SECRET_KEY=XXXX
After this export all these commands
export AWS_REGION='ap-south-1'
export AWS_ACCESS_KEY=XXXX
export AWS_SECRET_KEY=XXXX
Finally, we had successfully done the setup for updating inventory dynamically and according to our requirements.
But what is dynamic inventory in ansible ??
As described in Working with dynamic inventory, Ansible can pull inventory information from dynamic sources, including cloud sources, using the supplied inventory plugins. If the source you want is not currently covered by existing plugins, you can create your own as with any other plugin type.
After that you need to give this /mydb path location in /etc/ansible/ansible.cfg file. Now ansible will know that how many ec2 instances are running on AWS. You can check via below commands.
Step 3. Configure the web server through ansible.
What is Role?
Roles provide a framework for fully independent, or interdependent collections of variables, tasks, files, templates, and modules. In Ansible, the role is the primary mechanism for breaking a playbook into multiple files. This simplifies writing complex playbooks, and it makes them easier to reuse.
So now we are creating one role by using command:
ansible-galaxy init ec2-web
Now I have created a web.yml file to call the role in a playbook, and after running the playbook it will configure a web server on ec2 instance.
- hosts: all
- roles: ec2-web
In the tasks sub-directory there is a main.yml file which contains the role’s task definition.
#task for ec2-web
tasks:
- name: "Configure webserver"
package:
name: "httpd"
state: present
- name: "Copy webpage"
copy:
dest: "{{ dcdir }}"
src: "files/home.html"
- name: Start the service
service:
name: "httpd"
state: started
enabled: yes
Now, finally run the ansible-playbook
ansible-playbook web.yml
As the code Successfully run. then we can check the webpage via. public ip of ec2 instance/home.html
And it works..!!