P
imvdmolen.nl
Blog

Automatiseren van serverbeheer taken met Ansible in een Laravel-omgeving

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.