Ansible to setup LAMP application on VMs hosted in Azure
Automating IT tasks is crucial to systems administration as we move towards a more digital working realm. The use of software to execute job tasks is called task automation. Task automation enhances workflow accuracy and consistency while also enabling more efficient operations. Above all, task automation automates manual procedures and reduces the effort necessary to achieve a specific outcome.
Here, let us consider configuration management tools such as Ansible.
What is Ansible?
If you are in IT, you have probably often come across Ansible.
Ansible is a comprehensive automation tool or platform used for IT activities, including configuration management, intra service orchestration, application deployment, and provisioning. Automation is critical these days, with complex IT infrastructures that need to expand frequently. This is tedious for system administrators and developers to keep up if everything is done manually. Automation simplifies complicated tasks, making developers’ jobs easier and allowing them to focus their attention on other functions that offer more value to the organization.
These tools enable faster execution when configuring infrastructure and aim to provide visibility to help other teams across the enterprise work quickly and more efficiently.
This article explains how to use Ansible to deploy a LAMP (Linux, Apache, MySQL, and PHP) stack application on the Virtual Machines runs in Azure.
Prerequisites
To execute the Ansible playbook, you’ll need:
- Ansible control node with Ansible installed and configured to connect to web and database Ansible hosts using SSH keys
- One Ansible host to deploy web stack
- One Ansible host to deploy database stack

What does this Playbook do?
Ansible Playbooks allow you to direct the Ansible control node to configure your Ansible hosts. Playbooks are expressed in YAML format with a minimum of syntax and are human-readable. Jinja2 templates are used to enable dynamic expressions and access to variables from inventory.
Running this Playbook will perform the following actions on your Ansible hosts:
- Install the required packages on the respective hosts
- Install MariaDB on the database host
- Configure firewall rules for web and database host
- Configure database, setup user and privilege on the database host
- Load sample data to database
- Configure and start httpd on the web host
- Move the index.php file to the web host
- Update the index.php file to connect to the database host
Once the Playbook has finished running, you will have a web PHP web page running on top of httpd, based on the options you defined within your inventory file.
How to use this Playbook?
The first thing you need to do is clone this repository to a local folder inside the Ansible Control Node and edit the Playbook’s inventory file to update the configurations. Once you update the inventory file, save and close this file. You are now ready to run this Playbook on one or more servers.
To execute the Playbook, you can use the following command:
ansible-playbook playbook-centos.yml -i inventory (OR) ansible-playbook playbook-redhat.yml -i inventory
When the Playbook is finished running, go to your web browser and access the website with the IP address of the web host, as configured in the inventory file, followed by index.php
http://web_host_or_ip/index.php
You will see a page like this:

Conclusion
In this article, we used Ansible to automate installing and setting up a LAMP stack web application on virtual machines hosted on Azure. Feel free to modify these to suit your individual needs within your workflow.
Published on:
Learn moreRelated posts
Vasanam Studio: How I Built a Bible Verse Video Generator for My Church as a Hobby Project
Every morning at 5 AM, the women of my church gather for prayer. At the end of the session, our pastor’s wife shares a Bible verse and sends a...
The demo worked. That was the problem.
Over a weekend I built a small Kubernetes demo to play with zero trust. Three little services calling each other in a chain, a login page in f...
Notes from building an agent on AgentCore end to end
I wanted a reason to use AgentCore end to end. Runtime, memory, guardrails, identity, the whole thing. A Bible Q&A agent felt like a good ...
Building a Rust gRPC AI Security Gateway for LLM Traffic
I wanted a small, honest implementation of the GenAI governance shape in code: a component on every LLM call that applies policy first, option...
Claude Code Security: The Smart Way to Integrate AI
Anthropic just dropped Claude Code Security, and if you’re anywhere near AppSec or DevSecOps, you’ve probably already seen the debate lighting...
How I Built a Semantic Cache Using Only AWS Services
LLM calls are expensive and slow, but here’s the thing - users ask the same questions in different ways all the time. “What’s your refund poli...
How to Build Better AI Agent Tools: Cut Costs by 70% (MCP Server Case Study)
Building tools for AI agents isn’t the same as building regular APIs. This guide shows you how to design tools that reduce token costs by 60-7...
Building a DevSecOps Pipeline on AWS (And You Can Too)
I have been working with CI/CD pipelines for a while now, and honestly, most of them just focus on getting code deployed fast. But what about ...
AWS DevOps Agent: AI-Powered Incident Investigation in Seconds
Stop spending 30 minutes investigating incidents. Let AI do it in seconds. Here is a hands-on demo you can practice in 15 minutes. The Proble...
DynamoDB Just Made Your Life Easier: Multi-Attribute Composite Keys Explained
AWS just dropped a feature on November 19, 2025 that is going to save you from one of DynamoDB’s most annoying workarounds: multi-attribute co...