Joeri Timmermans
Joeri Timmermans
PHP/Symfony Developer with
a passion for food and drinks
Developer @ Intracto

How to create a LAMP stack with Ansible

Friday July 25, 2014 - Permalink - Tags: ansible, lamp, playbook

This guide wil help you create a basic playbook with roles. I'll be showing you some of the issues i ran into so you don't have to worry about them. You can also download all files used in this example on my github: Pix-art LAMP-playbook

Assumptions

You have installed Ansible on your os. (If you haven't check out Step 1 and 2 on my other Protip)

STEP 1: Create our hosts file

Our host file will contain all info about the places where we want to run our playbook. Here is an example for a vagrant box:

10.0.0.10    ansible_ssh_user=vagrant ansible_ssh_private_key_file=~/.vagrant.d/insecure_private_key

STEP 2: Create our playbook.yml

This file should contain at least 2 things: 1) Which hosts we want this playbook to run on 2) Which roles we want to execute on them

---
- hosts: all
  roles:
    - apache2
    - mariadb

By defining roles Ansible will try to look up these roles in the Roles folder. This should be created as following :

playbook.yml
roles/
    <your role>
        tasks
            main.yml
        files
            <your files>

For more info about best practices and why we structure our folders this way i would suggest reading the tips on the Ansible Website.

STEP 3: Create our Apache role

roles/
    apache2
        tasks
            main.yml
        files
            index.php

In our main.yml we'll be listing all our commands to execute for this role.

---
- name: 1. install Apache
  apt: name=apache2 state=present

- name: 2. install PHP module for Apache
  apt: name=libapache2-mod-php5 state=present

- name: 3. start Apache
  service: name=apache2 state=running enabled=yes

- name: 4. install Hello World PHP script
  copy: src=index.php dest=/var/www/html/index.php mode=0664

In our index.php we'll place a simple hello world.

<?php
echo "Hello World!";

STEP 4: Create our MariaDB role

roles/
    mariadb
        tasks
            main.yml
        files
            db.php
            dump.sql

In our main.yml we'll be listing all our commands to execute for this role.

---
- name: 1. Install MariaDB server package
  apt: name=mariadb-server state=present

- name: 2. Start Mysql Service
  service: name=mysql state=started enabled=true

- name: Install python Mysql package #required for mysql_db tasks
  apt: name=python-mysqldb state=present

- name: 3. Create a new database
  mysql_db: name=demo state=present collation=utf8_general_ci

- name: 4. Create a database user
  mysql_user: name=demo password=demo priv=*.*:ALL host=localhost state=present

- name: 5a. Copy sample data
  copy: src=dump.sql dest=/tmp/dump.sql

- name: 5b. Insert sample data
  shell: cat /tmp/dump.sql | mysql -u demo -pdemo demo

- name: 6a. Install MySQL extension for PHP
  apt: name=php5-mysql state=present

- name: 6b. Restart Apache
  service: name=apache2 state=restarted

- name: 7. install Hello World PHP script with database
  copy: src=db.php dest=/var/www/html/db.php mode=0664

In our dump.sql we do a create + insert to have some data

CREATE TABLE IF NOT EXISTS demo (
  message varchar(255) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO demo (message) VALUES('Hello World!');

In our db.php we'll place a simple hello world with a DB connection.

<?php

$connection = new PDO('mysql:host=localhost;dbname=demo', 'demo', 'demo');
$statement  = $connection->query('SELECT message FROM demo');

echo $statement->fetchColumn(); 

STEP 5: Run our playbook

ansible-playbook -i hosts playbook.yml --sudo

This command has 3 parts. -i hosts = a link to our inventory(hosts file) so Ansible knows where to run which commands

playbook.yml = this is our playbook file to tell Ansible what commands to run on which hosts

--sudo This tells Ansible to run all commands as Sudo.

This guide should have shown you how to create a basic LAMP setup with Ansible. You also have 2 example files that should work on your servers root. Index.php and DB.php both should show you 'Hello world'.

If you want more info on how to use this playbook on a Digital Ocean droplet checkout my other Protip)

comments powered by Disqus