LAMP stack playbook example – combining all the concepts
We will look at how to write a LAMP stack playbook using the skills we have learned so far. Here is the high-level hierarchy structure of the entire playbook:
inventory # inventory file group_vars/ # all.yml # variables site.yml # master playbook (contains list of roles) roles/ # common/ # common role tasks/ # main.yml # installing basic tasks web/ # apache2 role tasks/ # main.yml # install apache templates/ # web.conf.j2 # apache2 custom configuration vars/ # main.yml # variables for web role handlers/ # main.yml # start apache2 php/ # php role tasks/ # main.yml # installing php and restart apache2 db/ # db role tasks/ # main.yml # install mysql and include harden.yml harden.yml # security hardening for mysql handlers/ # main.yml # start db and restart apache2 vars/ # main.yml # variables for db role
Let's start with creating an inventory file. The following inventory file is created using static manual entry. Here is a very basic static inventory file where we will define a since host and set the IP address used to connect to it.
Configure the following inventory file as required:
[lamp] lampstack ansible_host=192.168.56.10
The following file is group_vars/lamp.yml, which has the configuration of all the global variables:
remote_username: "hodor"
The following file is the site.yml, which is the main playbook file to start:
The following is the roles/common/tasks/main.yml file, which will install python2, curl, and git:
# In ubuntu 16.04 by default there is no python2 - name: install python 2 raw: test -e /usr/bin/python || (apt -y update && apt install -y python-minimal)
The following task, roles/web/tasks/main.yml, performs multiple operations, such as installation and configuration of apache2. It also adds the service to the startup process:
- name: install apache2 server apt: name: apache2 state: present
- name: update the apache2 server configuration template: src: web.conf.j2 dest: /etc/apache2/sites-available/000-default.conf owner: root group: root mode: 0644
Similarly, we will write database roles as well. The following file roles/db/tasks/main.yml includes installation of the database server with assigned passwords when prompted. At the end of the file, we included harden.yml, which executes another set of tasks:
- name: set mysql root password debconf: name: mysql-server question: mysql-server/root_password value: "{{ mysql_root_password | quote }}" vtype: password
- name: removes the mysql test database mysql_db: db: test state: absent login_password: "{{ mysql_root_password }}" login_user: root
- name: enable mysql on startup systemd: name: mysql enabled: yes
notify: - start mysql
The db server role also has roles/db/handlers/main.yml and local variables similar to the web role:
- name: start mysql systemd: state: started name: mysql
- name: stop mysql systemd: state: stopped name: mysql
- name: restart mysql systemd: state: restarted name: mysql daemon_reload: yes
The following file is roles/db/vars/main.yml, which has the mysql_root_password while configuring the server. We will see how we can secure these plaintext passwords using ansible-vault in future chapters:
mysql_root_password: R4nd0mP4$$w0rd
Now, we will install PHP and configure it to work with apache2 by restarting the roles/php/tasks/main.ymlservice:
Then execute the following command against the Ubuntu 16.04 server to set up LAMP stack. Provide the password when it prompts for system access for user hodor:
$ ansible-playbook -i inventory site.yml
After successful completion of the playbook execution, we will be ready to use LAMP stack in a Ubuntu 16.04 machine. You might have observed that each task or role is configurable as we need throughout the playbook. Roles give the power to generalize the playbook and customize easily using variables and templating.