Deploying and Configuring Web Servers on AWS EC2 Instances with Ansible.

Deploying and Configuring Web Servers on AWS EC2 Instances with Ansible.


In this blog, we will walk through the process of deploying and configuring an Apache web server on AWS EC2 instances using Ansible. This automation tool allows us to define infrastructure as code, making it easier to manage and scale. You can find the codes for this project on my Github,Link Below. Let's Start-

Project Structure

The project has the following structure:

├── inventory.ini
├── playbooks
│   └── main.yml
├── roles
│   └── software
│       ├── handlers
│       │   └── main.yml
│       └── tasks
│           └── main.yml
└── success.html

1. inventory.ini

This file defines the inventory of hosts, specifying the target EC2 instances:

[ec2-instances] ansible_user=ubuntu ansible_ssh_private_key_file=/home/prashant/.ssh/id_rsa.pem

Replace the IP address and key file path with your own EC2 instance details.

2. playbooks/main.yml

This playbook orchestrates the deployment and configuration tasks:

- hosts: ec2-instances
  become: yes
    - ./roles/software
    ansible_ssh_private_key_file: "~/.ssh/id_rsa.pem"

This playbook targets the hosts in the "ec2-instances" group, uses privilege escalation (become: yes), includes the "software" role, and sets the SSH private key file path.

3. roles/software/tasks/main.yml

This file within the "software" role contains tasks to install Apache, copy website files, and start the Apache service:

- name: Install Apache web server
    name: apache2
    state: present

- name: Copy website files
    src: /home/prashant/ansiblelearning/success.html
    dest: /var/www/html

- name: Copy success page
    src: /home/prashant/ansiblelearning/success.html
    dest: /var/www/html
    - Restart Apache service

- name: Start Apache service
    name: apache2
    state: started
    enabled: yes

These tasks install Apache, copy a success page to the web directory, and start the Apache service. A notification is set to restart the Apache service when the success page is copied.

4. roles/software/handlers/main.yml

This handler file restarts the Apache service:

- name: Restart Apache service
    name: apache2
    state: restarted
    enabled: yes

- name: Show Website URL
    msg: "Website URL: http://{{ ansible_host }}/success.html"

This file helps you in restaring the webserver when it is called i.e. in the previous block 'notify:' under the 'Copy Success Page' . After that, 'name: show website url ' will help you in giving a output link that you can use to access the website.

5. success.html

This HTML file is the success page that will be served by the Apache web server.

!DOCTYPE html>

<html lang="en">

<head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>My DevOps Project</title></head>
 <h1>Welcome to My DevOps Project!</h1>
 <!-- Animated Pikachu Emoji --> <img src="" alt="Animated Pikachu Emoji">
 <p>Deployment and configuration were successful!</p>

Commands and Execution

  1. Run the Ansible Playbook:

     ansible-playbook -i inventory.ini playbooks/main.yml

    This command executes the main playbook, deploying and configuring Apache on the specified EC2 instances.After Applying the above command ,it'll show some output like this and that means you're successful in your journey of migrating a web server to aws-ec2-instance using Ansible.For seeing your website you can use the next step.

  2. Access the Website:

    After successful execution, you can access the deployed website by visiting:

    http://<your-instance-ip>/success.html .

    Replace <your-instance-ip> with the actual IP address of your EC2 instance

Help Needed

As you can see, in this file - roles/software/handlers/main.yml.

i.e. Number 4 in the blog ,I tried to print the website accessing link but in the output you can see it's not printed .If you helped me in solving this problem,I'll give you a shoutout in any of my blog.Thanks.


With Ansible, deploying and configuring a web server on multiple instances becomes a streamlined process. I,ve learnt alot while making this project and looking forward to grasp some more challenging topics like this.