Ansible Gids: Maak een Ansible Playbook voor LEMP Stack

Ansible is een eenvoudig automatiseringstool dat het uitrollen van software toepassingen, cloud provisioning, en configuratiebeheer automatiseert. Het is een server orkestratie gereedschap dat je helpt om een groot aantal server nodes te beheren en te besturen vanuit enkele plaatsen die ‘Control Machines’ heten. Ansible werd in 2012 gemaakt door Michael DeHaan en is geschreven in Python en Powershell.

In deze zelfstudie laten we je zien hoe je een basis Ansible Playbook maakt voor de provisioning van de LEMP Stack op Ubuntu 18.04 Server. Je leert hoe je een basis Ansible Playbook maakt dat kan worden opgeschaald voor andere PHP project toepassingen zoals WordPress, Nextcloud enz.

Voorwaarde

  • 2 Ubuntu OS.
    • 10.5.5.20 ansible
    • 10.5.5.26 voorziening
  • Kennis van basisgebruik Ansible
  • Root voorrechten

Wat we zullen doen:

  1. Ansible Playbook Project opzetten
  2. Genereer Ansible Playbook Rollen Directory Structuur
  3. Opzetten hosts en site.yml
  4. Opzetten ‘gewone’ Rollen – Basis instelling
  5. Setup ‘web’ Rollen – Nginx en PHP-FPM Configuratie
  6. Setup ‘db’ Rollen – MySQL Database Configuratie
  7. Testen van

Stap 1 – Opzetten Ansible Speelboek Project

Ansible Playbook is een reeks instructies die je stuurt om op een enkele of een groep server hosts uit te voeren. Het vertegenwoordigt de ansible-provisioning, waarbij de automatisering als taken wordt gedefinieerd, en alle klussen zoals het installeren van packages, het bewerken van bestanden, door ansible modules worden gedaan.

Het Ansible Speelboek bevat enkele basisinstellingen, waaronder hosts en gebruikersinformatie van de provision servers, een takenlijst die op de provision servers zal worden uitgevoerd, sjabloon en aangepaste configuraties, en een groep variabelen die deel uitmaken van sjablonen en taken.

Maak eerst de master project directory aan op de ‘ansible-control’ machine. In de master project directory zullen al onze playbook directories, bestanden, en configuraties worden opgeslagen.

Maak de Ansible projectdirectory ‘project-lemp’ en ga er in.

mkdir project-lemp/
cd project-lemp

Maak nu nieuwe configuratiebestanden ‘hosts’ en ‘site.yml’ aan, en maak dan een nieuwe directory met de naam ‘roles’.

touch hosts site.yml
mkdir -p roles/

Details over de configuraties:

hosts – Het is een inventarisbestand dat stukjes informatie bevat over door ansible beheerde servers. Je kunt er een groep servers mee aanmaken die je gemakkelijker kunt beheren en het inventarisbestand zelf kunt schalen. Het inventarisbestand kan met veel verschillende formaten gemaakt worden, waaronder de INI en YAML formaten.

site.yml – Het master playbook bestand dat bevat welke groep hosts beheerd zal worden met onze beschikbare rollen.

rollen – het is een groep Ansible playbooks die gebruikt zullen worden om de server te provisionen. De Ansible rollen hebben hun eigen directory structuren, elke rol zal directories bevatten zoals tasks, handlers, vars enz.

Stap 2 – Genereer Ansible rollen voor de mappenstructuur

In deze stap gaan we ansible rollen directory genereren met het ansible-galaxy commando. We zullen twee van rollen genereren, de ‘gewone’ rollen en de ‘web’ rollen.

Ga binnen de ‘project-lemp’ directory naar de directory ‘roles’.

cd roles/

Genereer de rollen structuur directory en bestanden voor de ‘common’ en ‘web’ rollen door het onderstaande ansible-galaxy commando uit te voeren.

ansible-galaxy init common
ansible-galaxy init web
ansible-galaxy init db

Controleer daarna alle beschikbare ansible rollen directory structuren met het volgende commando.

tree .

Je krijgt het resultaat te zien zoals hieronder.

Directory structuur

Stap 3 – Stel ‘hosts’ en ‘site.yml’ in

Het ‘hosts’ bestand zal de lijst en groep bevatten van de server die door Ansible beheerd wordt. Voor deze gids maken we een groep met de naam ‘lemp’ met het lid ‘server01’ en het IP adres 10.5.5.26.

Bewerk het ‘hosts’ bestand met vim editor.

vim hosts

Plak de configuratie hieronder.

[lemp]
server01 ansible_host=10.5.5.26

Bewaar en sluit.

Bewerk vervolgens het configuratiebestand site.yml.

vim site.yml

Plak de configuraties hieronder.

---

- hosts: lemp
  remote_user: hakase
  become: yes

  roles:
    - common
    - web
    - db

Bewaar en sluit.

Stel hosts en site.yml in

Stap 3 – Gemeenschappelijke rollen instellen

In deze stap gaan we de gemeenschappelijke rollen instellen. En om dat te doen, moeten we een lijst maken van taken die we gaan uitvoeren.

Hieronder de lijst van taken die we op de ‘gemeenschappelijke’ rollen gaan doen.

  1. Verander repository
  2. Ververs repository
  3. Upgrade pakketten naar de nieuwste versie
  4. Stel de server tijdzone in

Ga nu naar de ‘common’ map en bewerk de ’tasks/main.yml’ configuratie.

cd common/
vim tasks/main.yml

Maak een taak voor het veranderen van de repository, en we zullen de ‘copy’ module gebruiken die de basis ‘sources.list’ op de ‘files’ directory naar de remote host ‘/etc/apt/’ zal kopiëren.

- name: Change repository Ubuntu 18.04Step 4 - Setup 'web' Roles
  copy:
    src: sources.list
    dest: /etc/apt/
    backup: yes

Maak een taak voor het bijwerken van de repository en upgrade alle pakketten naar de nieuwste versie met de ‘apt’ module.

- name: Update repository and Upgrade packages
  apt:
    upgrade: dist
    update_cache: yes

Maak nu de taak voor het instellen van de systeemtijdzone met de ‘ansible timezone’ module.

- name: Setup timezone to Asia/Jakarta
  timezone:
    name: Asia/Jakarta
    state: latest

Bewaar en sluit.

Gemeenschappelijke rollen instellen

Maak daarna een nieuwe repository configuratie ‘sources.list’ binnen de map ‘files’.

vim files/sources.list

Kies de dichtstbijzijnde repository van je server locatie, hieronder staat de mijne.

deb http://buaya.klas.or.id/ubuntu/ bionic main restricted
deb http://buaya.klas.or.id/ubuntu/ bionic-updates main restricted
deb http://buaya.klas.or.id/ubuntu/ bionic universe
deb http://buaya.klas.or.id/ubuntu/ bionic-updates universe
deb http://buaya.klas.or.id/ubuntu/ bionic multiverse
deb http://buaya.klas.or.id/ubuntu/ bionic-updates multiverse
deb http://buaya.klas.or.id/ubuntu/ bionic-backports main restricted universe multiverse
deb http://buaya.klas.or.id/ubuntu/ bionic-security main restricted
deb http://buaya.klas.or.id/ubuntu/ bionic-security universe
deb http://buaya.klas.or.id/ubuntu/ bionic-security multiverse

Bewaar en sluit.

Als laatste is de ‘common’ rollen configuratie voltooid.

Stap 4 – Instellen van ‘web’ rollen

In deze stap gaan we de ‘web’ rollen instellen. Het zal enkele taken uitvoeren, waaronder het installeren van de Nginx webserver, PHP-FPM met enkele basisuitbreidingen, en het configureren van de PHP-FPM met Nginx.

Hieronder staan detailtaken die we op de ‘web’ rollen zullen doen:

  1. Installeer Nginx
  2. Installeer PHP-FPM
  3. Configureer php.ini
  4. Maak een virtuele host
  5. Voeg het bestand phpinfo toe

Ga naar de ‘web’ directory en bewerk het ’tasks/main.yml’ bestand.

cd web/
vim tasks/main.yml

Maak de eerste taak voor de installatie van nginx met de apt module.

- name: Install Nginx
  apt:
    name: nginx
    state: latest

Maak nu de taak voor de installatie van PHP-FPM met enkele basisuitbreidingen. En voor de installatie van meerdere pakketten kunnen we python ‘list’ formaat gebruiken, zoals hieronder.

- name: Instal PHP-FPM
  apt:
    name: ['php','php-fpm','php-common','php-cli','php-curl']
    state: latest

Vervolgens voegen we nieuwe regels toe aan de php.ini configuratie met de ‘blockinfile’ module. En aan het eind van de regel laten we ansible weten dat hij de php-fpm dienst moet herstarten na de configuratie van het php.ini bestand.

- name: Configure php.ini
  blockinfile:
    dest: /etc/php/{{ php_version }}/fpm/php.ini
    block: |
      date.time = Asia/Jakarta
      cgi-fix_pathinfo = 0
    backup: yes
  notify: restart php-fpm

Nu zullen we de nginx virtual host configuratie kopiëren met de ’template’ module. De sjabloon module zal de configuratie uit de ’templates’ directory naar de externe server kopiëren. We gaan het jinja2 virtuele host sjabloon ‘vhost.j2’ kopiëren naar de ‘/etc/nginx/sites-enabled/’ directory, en als laatste melden we ansible dat hij de nginx dienst opnieuw moet starten.

- name: Create Nginx virtual host
  template:
    src: vhost.j2
    dest: /etc/nginx/sites-enabled/vhost-{{ domain_name }}
  notify: restart nginx

Daarna maken we nieuwe taken aan voor het maken van de web-root directory met de ‘file’ module en kopiëren het index.php sjabloon erin.

- name: Create web-root directory
  file:
    path: /var/www/{{ domain_name }}
    state: directory

- name: Upload index.html and info.php files
  template:
    src: index.php.j2
    dest: /var/www/{{ domain_name }}/index.php

Opslaan en sluiten.

Nu gaan we de handlers configureren voor het herstarten van de nginx en php-fpm dienst. Bewerk de ‘handlers/main.yml’ configuratie met een vim editor.

vim handlers/main.yml

Plak de configuraties hieronder.

- name: restart nginx
  service:
    name: nginx
    state: restarted
    enabled: yes

- name: restart php-fpm
  service:
    name: php{{ php_version }}-fpm
    state: restarted
    enabled: yes

Opslaan en sluiten.

Ansible web rollen

Vervolgens bewerken we de ‘vars/main.yml’ configuratie. Bovenaan de configuraties zie je de variabele configuraties ‘{{ php_version }}’ en ‘{{ domain_name }}’. Die variabelen geven onze omgevingsinstelling weer voor de php versie en de domeinnaam die gebruikt zal worden. De variabelen maken ansible herbruikbaarder omdat we alleen de variabele configuratie ‘vars/main.yml’ hoeven te bewerken en niet de basis configuratie.

Bewerk de variabelen configuratie ‘vars/main.yml’ met vim editor.

vim vars/main.yml

Plak de configuraties hieronder.

php_version: 7.2
domain_name: hakase-labs.io

Bewaar en sluit.

Nu maken we jinja2 sjabloon configuraties ‘index.php.j2’ en ‘vhost.j2′ op de ’templates/’ directory.

vim templates/index.php.j2

Plak de configuratie hieronder.

<html>
<body>

<h1><center>index.html for domain {{ domain_name }}</center></h1>

<p>
<p>

<?php
phpinfo();
?>

</body>
</html>

Bewaar en sluit.

Maak daarna het sjabloon voor nginx virtuele host configuratie ‘vhost.j2’.

vim templates/vhost.j2

Plak de configuraties hieronder.

server {
    listen 80;
    listen [::]:80;

    root /var/www/{{ domain_name }};
    index index.php index.html index.htm index.nginx-debian.html;

    server_name {{ domain_name }};

    location / {
        try_files $uri $uri/ =404;
    }

    # pass PHP scripts to FastCGI server
    #
        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass unix:/var/run/php/php{{ php_version }}-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }

}

Bewaar en sluit de configuratie, en we zijn klaar met de web rollen configuratie.

Stap 5 – Instelling ‘db’ rollen

Bij deze stap gaan we de ‘db’ rollen instellen voor de MySQL database installatie en configuratie.

Hieronder staan detailtaken die aan de ‘db’ rollen zullen doen.

  1. installeer mysql
  2. Maak een MySQL database
  3. Maak een MySQL gebruiker
  4. Herstart mysql

Ga naar de ‘db’ directory en bewerk de ’tasks/main.yml’ configuratie.

cd db/
vim tasks/main.yml

Installeer nu de MySQL pakketten met de ‘apt’ module en python ‘list’ formaat voor de installatie van meerdere pakketten.

- name: Install MySQL
  apt:
    name: ['mysql-server','mysql-client','python-mysqldb']
    state: latest
  notify: restart mysql

Maak dan nieuwe taken aan voor het aanmaken van de MySQL database en gebruiker, en verleen dan alle rechten van de gebruiker aan de database.

- name: Create database
  mysql_db:
    name: '{{ db_name }}'
    state: present

- name: Create user for the database
  mysql_user:
    name: '{{ db_user }}'
    password: '{{ db_pass }}'
    encrypted: yes
    priv: '{{ db_name }}.*:ALL'
    state: present

Bewaar en sluit.

Instellen van databank rollen

Bewerk daarna de ‘handlers/main.yml’ configuratie.

vim handlers/main.yml

Plak de configuratie van de taak voor het herstarten van de MySQL dienst.

- name: restart mysql
  service:
    name: mysql
    state: restarted
    enabled: yes

Bewaar en sluit.

Bewerk daarna de configuratie vars-variabelen ‘vars/main.yml’.

vim vars/main.yml

Plak deze variabelen voor de configuratie van de MySQL database en de gebruikers hieronder.

db_name: hakase-db
db_user: hakase
db_pass: '*C960D382DB42E57D3BAC33891CF87900DCB1A869'

Opslaan en sluiten.

De ‘db_pass’ variabele heeft het MySQL versleutelde wachtwoord, en je kunt een versleuteld MySQL wachtwoord genereren met online hulpmiddelen.

Stap 6 – Voer het Ansible speelboek uit

Ga naar de Ansible project directory.

cd project-lemp/

Voer het onderstaande ansible-playbook commando uit.

ansible-playbook -i hosts site.yml

Nu zal de ansible alle rollen uitvoeren die we aan de host toekennen. Als het klaar is, krijg je het resultaat te zien zoals hieronder.

Voer het Ansible speelboek uit

Zorg ervoor dat je geen foutmelding krijgt.

Stap 7 – Testen

Open je web browser en typ de domeinnaam in de adresbalk http://hakase-labs.io.

En je krijgt de indexpagina met phpinfo te zien zoals hieronder.

Testen

De PHP-FPM en Nginx werken.

Ga nu terug naar de server terminal en log in op de MySQL server met de gebruiker en het wachtwoord die we op de ‘mysql’ rollenvariabele hebben aangemaakt.

mysql -u hakase -p
PASSWORD: hakasepass

Controleer de lijst van databases die de gebruiker bezit.

show databases;

En je wordt ingelogd op de MySQL shell en krijgt op de lijst de database met de naam ‘hakase-db’ te zien.

Databasetest

Tenslotte is het Ansible Speelboek voor de LEMP Stack installatie en configuratie met succes gemaakt en getest.

Referentie

https://docs.ansible.com/ansible/latest/index.html