Beschrijving
De Red Hat Certified Engineer (RHCE) met Ansible-focus is een van de meest gevraagde certificeringen in de DevOps- en Linux-wereld. Dit examen valideert dat je Ansible kunt inzetten om systemen op schaal te configureren en te beheren.
Wat leer je in deze cursus?
- Ansible Automation Platform installeren en configureren
- Inventory-bestanden en host-patronen schrijven
- Ad-hoc commando’s uitvoeren met
ansible - Playbooks schrijven met taken, variabelen en handlers
- Rollen (roles) structureren en hergebruiken via Ansible Galaxy
- Jinja2-templates inzetten voor dynamische configuratiebestanden
- Ansible Vault gebruiken voor wachtwoorden en geheime variabelen
- Systemen beheren: gebruikers, pakketten, services, cron en SELinux
- Storage configureren: partities, LVM en bestandssystemen
- Netwerkconfiguratie automatiseren
Examenformaat EX294
Het EX294-examen is een praktijkexamen van 4 uur waarbij je live in een Red Hat-omgeving werkt. Er zijn geen multiple-choice vragen — alles moet werkend opgeleverd worden. Je hebt toegang tot de man-pages en Red Hat-documentatie.
| Onderdeel | Gewicht |
|---|---|
| Ansible-basistaken | 20% |
| Playbooks en rollen | 35% |
| Systeemconfiguratie | 25% |
| Ansible Vault & templates | 20% |
Voor wie is deze cursus?
Deze cursus is geschikt voor Linux-beheerders en DevOps-engineers die al ervaring hebben met de basis van Linux (RHCSA-niveau). Kennis van de commandoregel en basisscripting is een pré.
Wat zit er in het pakket?
- 60 realistische oefenvragen met foutenanalyse
- Uitgebreide uitleg bij elk antwoord
- Cheatsheets: Ansible-module referentie
- 180 dagen toegang
- BTW-factuur op aanvraag
Wat leer je in EX294?
Het EX294-examen test of je Ansible kunt gebruiken om systemen op schaal te configureren en te beheren. Je schrijft playbooks, maakt rollen, gebruikt Vault en werkt met een inventorysysteem. Het examen is volledig hands-on — geen meerkeuze.
Studietijd: ~40 uur. Slagingspercentage: 70% van de beschikbare punten.
1. Ansible-basisprincipes
Hoe werkt Ansible?
Ansible is agentless — op de managed nodes hoeft niets geïnstalleerd te worden. De control node verbindt via SSH en voert Python-code uit. Taken zijn idempotent: ze controleren eerst de huidige toestand en maken alleen wijzigingen als dat nodig is.
Configuratie en inventory
# ansible.cfg (in de projectdirectory)
[defaults]
inventory = inventory/hosts remote_user = ansible private_key_file = ~/.ssh/id_rsa
[privilege_escalation]
become = true become_method = sudo become_user = root
# inventory/hosts (INI-formaat)
[webservers]
web1.example.com web2.example.com
[databases]
db1.example.com
[productie:children]
webservers databases # Host-variabelen web1.example.com ansible_user=admin ansible_port=2222
Essentiële opdrachten
# Verbinding testen
ansible all -m ping
# Ad-hoc commando uitvoeren
ansible webservers -m shell -a "uptime"
# Playbook uitvoeren
ansible-playbook playbook.yml
# Dry-run (geen wijzigingen)
ansible-playbook playbook.yml --check
# Dry-run met diff
ansible-playbook playbook.yml --check --diff
# Verbose output
ansible-playbook playbook.yml -v # basis
ansible-playbook playbook.yml -vvv # verbinding debug
# Beperken tot één host
ansible-playbook playbook.yml --limit web1.example.com
# Specifieke tags uitvoeren
ansible-playbook playbook.yml --tags installatie
2. Playbooks schrijven
Playbook-structuur
---
- name: Webserver configureren
hosts: webservers
become: yes
vars:
http_poort: 80
max_clients: 200
tasks:
- name: Apache installeren
ansible.builtin.dnf:
name: httpd
state: present
- name: Apache starten en inschakelen
ansible.builtin.systemd:
name: httpd
state: started
enabled: yes
- name: Configuratie deployen
ansible.builtin.template:
src: httpd.conf.j2
dest: /etc/httpd/conf/httpd.conf
notify: Herstart Apache
handlers:
- name: Herstart Apache
ansible.builtin.systemd:
name: httpd
state: restarted
Condities en loops
# Conditie
- name: Pakket installeren op RHEL
ansible.builtin.dnf:
name: httpd
state: present
when: ansible_os_family == "RedHat"
# Loop over een lijst
- name: Gebruikers aanmaken
ansible.builtin.user:
name: "{{ item }}"
state: present
loop:
- alice
- bob
- charlie
# Loop met dictionary
- name: Services beheren
ansible.builtin.systemd:
name: "{{ item.naam }}"
state: "{{ item.status }}"
loop:
- { naam: httpd, status: started }
- { naam: firewalld, status: started }
Variabelen en facts
# Variabele definiëren en gebruiken
vars:
app_map: /opt/myapp
tasks:
- name: Directory aanmaken
ansible.builtin.file:
path: "{{ app_map }}"
state: directory
# Output opslaan
- name: Huidige datum ophalen
ansible.builtin.command: date
register: datum_output
- name: Datum tonen
ansible.builtin.debug:
msg: "Datum: {{ datum_output.stdout }}"
# Custom fact instellen
- name: Fact instellen
ansible.builtin.set_fact:
app_versie: "2.5.1"
Foutafhandeling
# Doorgaan bij fout
- name: Optionele taak
ansible.builtin.command: /opt/optioneel.sh
ignore_errors: yes
# Block met rescue
- block:
- name: Risicovolle taak
ansible.builtin.command: /opt/update.sh
rescue:
- name: Herstelactie
ansible.builtin.command: /opt/rollback.sh
always:
- name: Altijd uitvoeren
ansible.builtin.debug:
msg: "Taak voltooid"
3. Rollen
Rolstructuur
mijn-rol/
├── tasks/
│ └── main.yml # Hoofdtaken
├── handlers/
│ └── main.yml # Handlers
├── templates/
│ └── config.j2 # Jinja2-templates
├── files/
│ └── script.sh # Statische bestanden
├── vars/
│ └── main.yml # Vaste variabelen (hoge prioriteit)
├── defaults/
│ └── main.yml # Standaardwaarden (laagste prioriteit)
└── meta/
└── main.yml # Afhankelijkheden
# Rol aanmaken
ansible-galaxy role init mijn-rol
# Rol vanuit Galaxy installeren
ansible-galaxy role install geerlingguy.apache
# Rol in playbook gebruiken
- name: Servers configureren
hosts: webservers
roles:
- mijn-rol
- { role: geerlingguy.apache, tags: [apache] }
requirements.yml
---
roles:
- name: geerlingguy.apache
version: "3.2.0"
- src: https://github.com/voorbeeld/rol
collections:
- name: ansible.posix
version: ">=1.4.0"
# Installeren vanuit requirements.yml
ansible-galaxy install -r requirements.yml
4. Jinja2-templates
# templates/httpd.conf.j2
ServerName {{ ansible_hostname }}
Listen {{ http_poort }}
MaxClients {{ max_clients }}
{% if ssl_ingeschakeld %}
SSLEngine on
SSLCertificateFile /etc/ssl/certs/server.crt
{% endif %}
{% for vhost in virtuele_hosts %}
<VirtualHost *:80>
ServerName {{ vhost.naam }}
DocumentRoot {{ vhost.pad }}
</VirtualHost>
{% endfor %}
Veelgebruikte filters
{{ tekst | upper }} # HOOFDLETTERS
{{ tekst | lower }} # kleine letters
{{ lijst | length }} # aantal elementen
{{ waarde | default('leeg') }} # standaardwaarde
{{ lijst | join(', ') }} # lijst naar string
{{ string | trim }} # whitespace verwijderen
{{ getal | int }} # naar integer converteren
5. Ansible Vault
# Nieuw versleuteld bestand aanmaken
ansible-vault create geheimen.yml
# Bestaand bestand versleutelen
ansible-vault encrypt vars/wachtwoorden.yml
# Versleuteld bestand bekijken
ansible-vault view vars/wachtwoorden.yml
# Versleuteld bestand bewerken
ansible-vault edit vars/wachtwoorden.yml
# Wachtwoord wijzigen
ansible-vault rekey vars/wachtwoorden.yml
# Bestand ontsleutelen
ansible-vault decrypt vars/wachtwoorden.yml
# Enkele string versleutelen
ansible-vault encrypt_string 'MijnGeheim' --name 'db_wachtwoord'
# Playbook uitvoeren met vault
ansible-playbook playbook.yml --ask-vault-pass
# Met wachtwoordbestand
ansible-playbook playbook.yml --vault-password-file .vault_pass
Vault in variabelen gebruiken
# vars/geheimen.yml (na "ansible-vault create")
db_wachtwoord: SuperGeheim123
api_sleutel: abc123xyz
# In playbook
vars_files:
- vars/geheimen.yml
tasks:
- name: Database configureren
ansible.builtin.template:
src: db.conf.j2
dest: /etc/app/db.conf
6. Veelgebruikte modules
# Pakket installeren
ansible.builtin.dnf:
name: [httpd, php, php-mysql]
state: present
# Bestand kopiëren
ansible.builtin.copy:
src: bestanden/app.conf
dest: /etc/app/app.conf
owner: root
group: root
mode: '0644'
# Regel in bestand aanpassen
ansible.builtin.lineinfile:
path: /etc/ssh/sshd_config
regexp: '^PermitRootLogin'
line: 'PermitRootLogin no'
# Directory aanmaken
ansible.builtin.file:
path: /opt/myapp/logs
state: directory
mode: '0755'
owner: app
group: app
# Gebruiker aanmaken
ansible.builtin.user:
name: deploy
groups: wheel
shell: /bin/bash
create_home: yes
# Firewall-poort openen (RHEL)
ansible.posix.firewalld:
port: 8080/tcp
permanent: yes
state: enabled
immediate: yes
# Host herstarten en wachten
ansible.builtin.reboot:
reboot_timeout: 300
Officiële documentatie
- Red Hat Ansible Automation Platform Documentation
- Ansible Community Documentation
- EX294 Examenpagina (officieel)
Tip: maak tijdens het examen altijd gebruik van ansible-doc voor module-documentatie: ansible-doc ansible.builtin.dnf





Beoordelingen
Er zijn nog geen beoordelingen.