## Apache ansible-playbook

We gaan eerst een mappen structuur maken om onze Ansible-playbook bestanden netjes in weg te zetten. Maak in je ~/Documents een directory "ansible/apache". In deze directory gaan we werken en ervoor zorgen dat onze bestanden gestructureerd zijn voor het gebruik van Ansible.

Ik werk in Visual studio code omdat we hierin een gestructureerde editor en terminal tegelijk hebben. Mocht je dit niet fijn vinden dan is de CLI ook goed, vindt hierin je eigen werkwijze.

Laten we beginnen met de bestanden dat we minimaal nodig zijn. In de directory /vars/ die in de apache directory zit maken we een bestand `default.yml`

    ---
    app_user: "student"
    http_host: "scooters.inc"
    http_conf: "scooters.inc.conf"
    http_port: "80"
    disable_default: true

We zien een aantal default instellingen die we dadelijk in onze playbook kunnen gebruiken. Dit is een manier van werken, je kunt ze in je playbook ook elke keer uitschrijven.

Nu maken we een directory /files/ met daarin 2 bestanden. We maken onze apache configuratie hierin en de index.html voor de website.

`apache.conf.j2`

    <VirtualHost *:{{ http_port }}>
       ServerAdmin webmaster@localhost
       ServerName {{ http_host }}
       ServerAlias www.{{ http_host }}
       DocumentRoot /var/www/{{ http_host }}
       ErrorLog ${APACHE_LOG_DIR}/error.log
       CustomLog ${APACHE_LOG_DIR}/access.log combined
    </VirtualHost>

`index.html.j2`

    <html>
       <head>
           <title>Welcome to {{ http_host }} !</title>
       </head>
       <body>
           <h1>Success! The {{ http_host }} virtual host is working!</h1>
       </body>
    </html>

Als we deze bestanden hebben gemaakt kunnen we aan de slag met je playbook. In de ansible-playbook komen stap voor stap de configuraties die gedaan moeten worden. Bedenk welke stappen/installaties/instellingen je zelf hebt gedaan als Apache2 installeerd op 1 server. Deze stappen gaan we nu benoemen in de playbook.

in de apache directory maak je `playbook.yml`

    ---
    - hosts: ubuntu-server
      become: true
      vars_files:
        - vars/default.yml

      tasks:
        - name: Install prerequisites
          apt: name={{ item }} update_cache=yes state=latest force_apt_get=yes
          loop: [ 'aptitude' ]

        - name: Install Apache
          apt: name=apache2 update_cache=yes state=latest

        - name: Create document root
          file:
            path: "/var/www/{{ http_host }}"
            state: directory
            owner: "{{ app_user }}"
            mode: '0755'

        - name: Copy index test page
          template:
            src: "files/index.html.j2"
            dest: "/var/www/{{ http_host }}/index.html"

        - name: Set up Apache virtuahHost
          template:
            src: "files/apache.conf.j2"
            dest: "/etc/apache2/sites-available/{{ http_conf }}"

        - name: Enable new site
          shell: /usr/sbin/a2ensite {{ http_conf }}
          notify: Reload Apache

        - name: Disable default Apache site
          shell: /usr/sbin/a2dissite 000-default.conf
          when: disable_default
          notify: Reload Apache

        - name: "UFW - Allow HTTP on port {{ http_port }}"
          ufw:
            rule: allow
            port: "{{ http_port }}"
            proto: tcp

      handlers:
        - name: Reload Apache
          service:
            name: apache2
            state: reloaded

        - name: Restart Apache
          service:
            name: apache2
            state: restarted

Het is onzettend belangrijk dat je de .yml bestanden op de bovenstaanden manier opbouwd. Mochten hier fouten in zitten qua spaties en bestandsformaat dan gaat het niet werken en krijg je fout meldingen. Zoek eens uit hoe een yaml file wordt gemaakt, opgebouwd wordt en yaml kan alleen werken als je hier rekening mee houdt.

Belangrijk!

    ---
    - hosts: ubuntu-server
      become: true
      vars_files:
        - vars/default.yml

Bij hosts staat nu ubuntu-server, hier kan ook je serverblock staan als het om meerdere servers gaat.

`become: true` betekend dat je als root user dit gaat uitvoeren, vergelijk het met de opdracht `sudo`. Hiervoor moeten we 1 keer ons wachtwoord invullen, dit moeten we straks ook als we deze playbook gaan uitvoeren. Wil je dit niet, dan laat je het weg. Het kan zo zijn dat bepaalde opdrachten alleen als root uitgevoerd mogen worden binnen Linux.

## De playbook uitvoeren

Om deze playbook uit te voeren gebruiken we de volgende opdracht:

    ansible-playbook --ask-become-pass playbook.yml

Je voert je wachtwoord in en de playbook wordt uitgevoerd. Magie! (de eerste keer).

    PLAY [ubuntu-server] *************************************************************************************************************************************************************

    TASK [Gathering Facts] ***********************************************************************************************************************************************************
    ok: [ubuntu-server]

    TASK [Install prerequisites] *****************************************************************************************************************************************************
    changed: [ubuntu-server] => (item=aptitude)

    TASK [Install Apache] ************************************************************************************************************************************************************
    changed: [ubuntu-server]

    TASK [Create document root] ******************************************************************************************************************************************************
    changed: [ubuntu-server]

    TASK [Copy index test page] ******************************************************************************************************************************************************
    changed: [ubuntu-server]

    TASK [Set up Apache virtuahHost] *************************************************************************************************************************************************
    changed: [ubuntu-server]

    TASK [Enable new site] ***********************************************************************************************************************************************************
    changed: [ubuntu-server]

    TASK [Disable default Apache site] ***********************************************************************************************************************************************
    changed: [ubuntu-server]

    TASK [UFW - Allow HTTP on port 80] ***********************************************************************************************************************************************
    changed: [ubuntu-server]

    RUNNING HANDLER [Reload Apache] **************************************************************************************************************************************************
    changed: [ubuntu-server]

    PLAY RECAP ***********************************************************************************************************************************************************************
    ubuntu-server              : ok=10   changed=9    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

In de uitvoer zie je uiteindelijk dat er 10=ok zijn en changed=9. Er zijn dit 9 dingen aangepast op de server. Laten we naar het IP-adres gaan in je URL om de zien of het gelukt is.