Ansible: Deploying Web Applications

Lab Steps

Logging in to the Amazon Web Services Console
Connecting to the Ubuntu Virtual Machine using EC2 Instance Connect
Creating an Ansible role to install a LAMP stack
Setting default variables and using notifications
Deploying a web application

The hands-on lab is part of this learning path

Ready for the real environment experience?

Time Limit1h


This lab is going to keep building on what was covered in the Lab: Getting Started with Ansible.

In this lab, you will be deploying a simple Python-based web application. This will be a basic LAMP stack, with the P representing Python.

The goal of this lab is to introduce you to roles, templates, and handlers. Here is a quick refresher on each of these.



Roles are a way to reuse functionality by putting all of the logic for a particular use case in the same place. As an example, if you have tasks that you might run on all servers regardless of what the server is used for, that logic might be put in a role called common.

And if you have logic to configure a web server, then you may have another role named webserver. And whenever you need to install a new web application, you can include these two roles in your playbook.



Templates at their core are a way to copy files to a remote server. However, the difference between templates and static files is that templates will be processed before they are copied to the remote host. This allows you to include variables, conditionals, loops, etc. Ansible uses Jinja2 as its template engine.



Handlers are basically tasks that are run when some event happens. As an example, if you change a web server’s configuration file, you will need to restart the web server service. This is an ideal use case for handlers.


Before you start


This Lab includes YAML and Python, and both are sensitive to whitespace. This means the potential for running into errors caused by copy and paste is higher. It is something to keep in mind as you proceed.


Text editor

Nano will be used for editing any text files. However, if you have your own preference you can use it. If you are new to nano, here is the high level info:

Once in nano, you can close out by pressing CTRL+X.

When closing nano, it will prompt you to save if you have made any changes. To do that press the Y key.

If you chose to save, it will ask you for the filename, if the filename is already set, then you can press the Enter/Return key.

That is how we will save files going forward. CTRL+X to close out of nano, then press Y to save, then press Enter to save to the file name listed.



October 8th, 2021 - Addressed the erroring main.yml file spacing issue

September 9th, 2021 - Reduced lab startup time by half

August 18th, 2020 - Resolved a package dependency issue causing the lab instance to fully provision

August 7th, 2020 - Updated lab to use EC2 instance connect and added a validation check for the web application deployment

June 3rd, 2020 - Addressed an issue with the Ansible version

March 23rd, 2020 - Updated a lab step to avoid a yaml formatting issue

January 10th, 2019 - Added a validation Lab Step to check the work you perform in the Lab

July 13th, 2018 - Updated to use the latest version of Ansible

About the Author

With in-depth experience in solution design, large scale infrastructure and capacity planning; Vincenzo is the man with the plan when it comes to hands-on learning. With years of knowledge and capabilities with both AWS and Microsoft Azure, Vincenzo really knows how to simplify the core assets of the task at hand and acts as a true Oracle for the cloud world.