Soms krijg ik weer eens een Laravel-project waarbij de deployment volledig handmatig gebeurde. Elke keer dat er een nieuwe versie uitgerold moest worden, was het een kwestie van SSH-verbindingen maken, bestanden uploaden, databases migreren en services herstarten. Na een paar van deze sessies besloot ik dat het tijd was om Ansible in te zetten. Wat begon als een tijdsbesparende maatregel, groeide uit tot een complete automatisering van mijn serverbeheer.
Ansible spreekt me aan omdat het gebruik maakt van YAML-bestanden die gemakkelijk te lezen en te onderhouden zijn. Geen complexe programmeertalen of eindeloze scripts, gewoon duidelijke instructies die stap voor stap uitgelegd worden. Bij mijn laatste project had ik binnen een paar uur een volledig geautomatiseerd deployment-systeem opgezet dat voorheen uren handmatig werk kostte.
---
- name: Install dependencies
hosts: all
become: yes
tasks:
- name: Install apt dependencies
apt:
name: "{{ item }}"
state: present
with_items:
- git
- curl
- php7.4-fpm
- php7.4-cli
- php7.4-mysql
- name: Install composer dependencies
composer:
command: install
working_dir: /var/www/html
Inleiding tot Ansible en Laravel
Waar ik eerst urenlang bezig was met het handmatig configureren van servers, kan ik nu met een enkel commando een complete Laravel-omgeving opzetten. Ansible werkt met een push-model waarbij je vanaf je lokale machine instructies verstuurt naar een of meerdere servers. Dit betekent dat je geen agents hoeft te installeren op de doelservers, alleen SSH-toegang is voldoende. Voor Laravel-projecten is dit ideaal omdat je vaak met meerdere omgevingen werkt: development, staging en productie.
YAML-syntax maakt het mogelijk om complexe serverconfiguaties op een overzichtelijke manier vast te leggen. Elke task heeft een duidelijke naam en specifieke parameters die precies aangeven wat er moet gebeuren. Bij Laravel-projecten betekent dit dat je taken kunt definiëren voor database-setup, webserver-configuratie en applicatie-deployment in één coherent geheel.
---
- name: Configure Laravel application
hosts: all
become: yes
tasks:
- name: Create database
mysql_db:
name: laravel
state: present
- name: Create user
mysql_user:
name: laravel
password: laravel
priv: 'laravel.*:ALL,GRANT'
- name: Configure nginx
template:
src: templates/nginx.conf.j2
dest: /etc/nginx/sites-available/laravel
notify: restart nginx
Handlers in Ansible zorgen ervoor dat services alleen herstart worden wanneer er daadwerkelijk een wijziging heeft plaatsgevonden. Dit playbook toont hoe je een database aanmaakt, een gebruiker configureert en een nginx-configuratie installeert. De notify directive zorgt ervoor dat nginx alleen herstart wordt als het configuratiebestand daadwerkelijk is gewijzigd.
Configuratie van Ansible voor Laravel
Mijn approach bij het opzetten van Ansible voor Laravel-projecten begint altijd met het definiëren van de inventory file. Hier specificeer je welke servers tot je infrastructuur behoren en hoe Ansible er verbinding mee kan maken. Voor een typisch Laravel-project heb je vaak minimaal een webserver en een database server, soms aangevuld met een cache server zoals Redis.
Templates spelen een cruciale rol in mijn Ansible-setup. Jinja2-templates maken het mogelijk om configuratiebestanden dynamisch te genereren op basis van variabelen. Voor nginx-configuraties gebruik ik bijvoorbeeld templates waarin servername, document root en PHP-versie variabel zijn. Dit betekent dat hetzelfde playbook gebruikt kan worden voor verschillende projecten door simpelweg de variabelen aan te passen.
---
- name: Configure Laravel application
hosts: all
become: yes
tasks:
- name: Install dependencies
apt:
name: "{{ item }}"
state: present
with_items:
- git
- curl
- php7.4-fpm
- php7.4-cli
- php7.4-mysql
- name: Configure nginx
template:
src: templates/nginx.conf.j2
dest: /etc/nginx/sites-available/laravel
notify: restart nginx
- name: Configure mysql
mysql_db:
name: laravel
state: present
mysql_user:
name: laravel
password: laravel
priv: 'laravel.*:ALL,GRANT'
Ansible Vault gebruik ik consequent voor het beveiligen van gevoelige informatie zoals database-wachtwoorden en API-keys. Het encrypteren van variabelen-bestanden zorgt ervoor dat je veilig je complete infrastructuur-configuratie in version control kunt opslaan. Bij Laravel-projecten betekent dit dat je .env-bestanden veilig kunt templaten zonder dat wachtwoorden in plaintext opgeslagen worden.
Automatiseren van Deployementen met Ansible
Deployments waren vroeger een bron van stress in mijn workflow. Nu draai ik een enkel ansible-playbook commando en weet ik zeker dat alles consistent wordt uitgerold. Mijn deployment-playbooks bevatten altijd een rollback-mechanisme waarbij de vorige versie behouden blijft tot de nieuwe versie succesvol is getest.
Git-integratie in Ansible playbooks maakt het mogelijk om automatisch de nieuwste code op te halen van je repository. Combined met Composer-tasks die automatisch dependencies installeren en Laravel-specifieke commando's zoals cache clearing en database migraties uitvoeren, krijg je een volledig geautomatiseerd deployment-proces.
---
- name: Deploy Laravel application
hosts: all
become: yes
tasks:
- name: Clone repository
git:
repo: https://github.com/laravel/laravel.git
dest: /var/www/html
- name: Install dependencies
composer:
command: install
working_dir: /var/www/html
- name: Configure environment
template:
src: templates/.env.j2
dest: /var/www/html/.env
- name: Restart services
service:
name: nginx
state: restarted
service:
name: php7.4-fpm
state: restarted
Zero-downtime deployments realiseer ik door gebruik te maken van symlinks en atomic operations. Het nieuwe code wordt uitgerold naar een aparte directory en pas na succesvolle verificatie wordt de symlink omgezet naar de nieuwe versie. Mocht er iets misgaan, dan is rollback een kwestie van de symlink terugzetten naar de vorige versie.
Geavanceerde Automatisering en Monitoring
Monitoring integreren in je Ansible-playbooks geeft je real-time inzicht in de gezondheid van je Laravel-applicatie. Log-monitoring playbooks kunnen automatisch reageren op error-patronen en preventieve acties ondernemen voordat gebruikers problemen ervaren. Performance-metrics verzamelen en dashboards automatisch configureren maakt onderdeel uit van mijn standaard deployment-routine.
Scheduled tasks via Ansible cron-modules zorgen ervoor dat Laravel-specifieke onderhoudswerk zoals cache-clearing, log-rotatie en database-optimalisatie automatisch plaatsvindt. Queue-workers monitoren en herstarten bij crashes is een andere taak die ik volledig heb geautomatiseerd via Ansible.
---
- name: Monitor nginx logs
hosts: all
become: yes
tasks:
- name: Monitor logs
shell:
cmd: tail -f /var/log/nginx/error.log
register: logs
- name: Restart nginx
service:
name: nginx
state: restarted
when: logs.stdout.find('error') != -1
Health checks implementeren in mijn playbooks betekent dat elke deployment automatisch gevalideerd wordt voordat de nieuwe versie live gaat. HTTP-status checks, database-connectiviteit tests en Laravel-specifieke health endpoints worden automatisch gecontroleerd. Als een van deze checks faalt, wordt automatisch een rollback uitgevoerd.
Backup-automatisering via Ansible zorgt ervoor dat zowel database als bestanden regelmatig en betrouwbaar gebackupt worden. Encrypted backups worden automatisch naar externe opslag gestuurd en oude backups worden volgens een retention-policy opgeruimd. Voor Laravel-projecten betekent dit dat zowel de database, uploaded files als de complete applicatie-code veilig bewaard blijven.
De tijdsbesparing die Ansible me oplevert is enorm, maar belangrijker nog is de betrouwbaarheid die het biedt. Fouten door handmatige stappen behoren tot het verleden en ik kan me volledig concentreren op het ontwikkelen van features in plaats van het beheren van servers.