Bevor wir in die Details der einzelnen Tools eintauchen, ist es wichtig, die verschiedenen Arten der Qualitätssicherung zu verstehen:
| Kategorie | Tool | Ziel | Zeitpunkt |
|---|---|---|---|
| Linting | yamllint |
YAML-Format prüfen | Vor Ausführung |
| Linting | ansible-lint |
Ansible-Best-Practices | Vor Ausführung |
| Validierung | --syntax-check |
Syntax überprüfen | Vor Ausführung |
| Validierung | --check |
Trockenlauf ohne Änderungen | Vor Ausführung |
| Testing | molecule |
Rollentests mit Umgebung | In Testumgebung |
| Assertion-Tests | testinfra |
Prüfung Zielzustand (Python) | Nach Ausführung |
Ansible bietet eingebaute Validierungsmethoden, um die grundlegende Syntax zu überprüfen:
ansible-playbook --syntax-check playbook.ymlDer Check-Modus führt das Playbook aus, ohne tatsächliche Änderungen vorzunehmen:
ansible-playbook --check playbook.ymlDieser “Trockenlauf” ist besonders nützlich, um vorab zu prüfen, welche Änderungen ein Playbook vornehmen würde, ohne das System tatsächlich zu modifizieren.
ansible-lintansible-lint ist ein Werkzeug zur statischen Analyse von
Ansible-Playbooks, das überprüft, ob die Playbooks den empfohlenen Best
Practices folgen. Es kann häufige Fehler und potenzielle Probleme
identifizieren, bevor das Playbook in einer Produktionsumgebung
ausgeführt wird.
Installation:
pip install ansible-lintBeispiel für die Verwendung:
ansible-lint playbook.ymlansible-lint überprüft das Playbook und gibt Warnungen
oder Fehler aus, wenn gegen Ansible-Best-Practices verstoßen wird.
Konfiguration von ansible-lint: Erstellen Sie eine
.ansible-lint-Datei im Projektverzeichnis:
exclude_paths:
- .cache/
- .github/
- molecule/
skip_list:
- yaml[line-length]
- name[casing]yamllintDa Ansible-Playbooks in YAML geschrieben sind, ist die Überprüfung
der YAML-Syntax ein wichtiger Schritt, um sicherzustellen, dass die
Playbooks korrekt geparst werden können. yamllint ist ein
Werkzeug, das die YAML-Syntax überprüft und sicherstellt, dass sie den
YAML-Spezifikationen entspricht.
Installation:
pip install yamllintBeispiel für die Verwendung:
yamllint playbook.ymlyamllint überprüft das Playbook auf Syntaxfehler,
inkonsistente Einrückungen und andere potenzielle Probleme in der
YAML-Struktur.
Konfiguration von yamllint: Erstellen Sie eine
.yamllint.yml-Datei:
extends: default
rules:
line-length:
max: 120
indentation:
spaces: 2MoleculeMolecule ist ein beliebtes Framework für die Entwicklung
und das Testen von Ansible-Rollen und -Playbooks. Es bietet eine
einfache Möglichkeit, Testumgebungen zu erstellen, Playbooks auszuführen
und die Ergebnisse zu überprüfen.
Installation:
pip install moleculeGrundlegende Verwendung:
molecule init role my_role
molecule testMolecule unterstützt verschiedene Treiber für unterschiedliche Testumgebungen:
Beispiel einer molecule.yml mit Docker-Treiber:
---
dependency:
name: galaxy
driver:
name: docker
platforms:
- name: instance
image: ubuntu:20.04
pre_build_image: true
privileged: true
volumes:
- /sys/fs/cgroup:/sys/fs/cgroup:ro
command: /lib/systemd/systemd
provisioner:
name: ansible
inventory:
host_vars:
instance:
ansible_python_interpreter: /usr/bin/python3
verifier:
name: ansibleMolecule durchläuft mehrere Phasen:
TestinfraTestinfra ist ein Werkzeug zur Überprüfung der Zustände
von Servern nach der Ausführung von Ansible-Playbooks. Es integriert
sich gut mit Molecule und ermöglicht das Schreiben von
Tests in Python, um sicherzustellen, dass das Playbook das gewünschte
Ergebnis erzielt.
Installation:
pip install testinfraBeispiel für die Verwendung mit Molecule:
# molecule/default/tests/test_default.py
import os
import testinfra.utils.ansible_runner
testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner(
os.environ['MOLECULE_INVENTORY_FILE']
).get_hosts('all')
def test_apache_installed(host):
apache = host.package("apache2")
assert apache.is_installed
def test_apache_running_and_enabled(host):
apache = host.service("apache2")
assert apache.is_running
assert apache.is_enabled
def test_apache_config_file(host):
config = host.file("/etc/apache2/apache2.conf")
assert config.exists
assert config.is_file
def test_web_server_responds(host):
cmd = host.run("curl -f http://localhost")
assert cmd.succeededDie Integration von Ansible-Playbook-Tests in CI/CD-Pipelines ist eine Best Practice, um sicherzustellen, dass Änderungen an Playbooks automatisch überprüft und validiert werden.
Beispiel für eine GitLab CI-Konfiguration:
stages:
- lint
- test
variables:
PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"
cache:
paths:
- .cache/pip/
- venv/
before_script:
- python -m venv venv
- source venv/bin/activate
- pip install --upgrade pip
- pip install ansible ansible-lint yamllint molecule molecule-plugins[docker] testinfra
lint_playbooks:
stage: lint
script:
- source venv/bin/activate
- yamllint .
- ansible-lint .
test_playbooks:
stage: test
services:
- docker:dind
variables:
DOCKER_HOST: tcp://docker:2376
DOCKER_TLS_CERTDIR: "/certs"
script:
- source venv/bin/activate
- molecule testBeispiel für GitHub Actions:
name: Ansible CI
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.9'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install ansible ansible-lint yamllint
- name: Run yamllint
run: yamllint .
- name: Run ansible-lint
run: ansible-lint .
test:
runs-on: ubuntu-latest
needs: lint
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.9'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install molecule molecule-plugins[docker] testinfra
- name: Run Molecule tests
run: molecule testBeispiel für Jenkins Pipeline:
pipeline {
agent any
stages {
stage('Setup') {
steps {
sh 'python -m venv venv'
sh '. venv/bin/activate && pip install ansible ansible-lint yamllint molecule molecule-plugins[docker] testinfra'
}
}
stage('Lint') {
parallel {
stage('YAML Lint') {
steps {
sh '. venv/bin/activate && yamllint .'
}
}
stage('Ansible Lint') {
steps {
sh '. venv/bin/activate && ansible-lint .'
}
}
}
}
stage('Test') {
steps {
sh '. venv/bin/activate && molecule test'
}
}
}
post {
always {
cleanWs()
}
}
}Stellen Sie sicher, dass Ihre Playbooks in wiederverwendbare Rollen unterteilt sind. Dies fördert die Modularität und macht es einfacher, einzelne Komponenten zu testen und zu warten.
Verwenden Sie Testumgebungen, die isoliert von Ihrer
Produktionsumgebung sind, um sicherzustellen, dass Playbooks korrekt
funktionieren, bevor sie in der Produktion eingesetzt werden. Tools wie
Vagrant, Docker oder Cloud-basierte
Testumgebungen können hier hilfreich sein.
Nutzen Sie Pre-Commit-Hooks, um automatische Überprüfungen vor jedem Commit durchzuführen:
# .pre-commit-config.yaml
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.4.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
- repo: https://github.com/adrienverge/yamllint.git
rev: v1.28.0
hooks:
- id: yamllint
- repo: https://github.com/ansible/ansible-lint.git
rev: v6.10.0
hooks:
- id: ansible-lintVerwenden Sie Versionskontrollsysteme wie Git, um Ihre Playbooks zu verwalten und sicherzustellen, dass Änderungen nachverfolgt und dokumentiert werden. Kommentieren Sie Ihre Playbooks gut, um deren Zweck und Funktionsweise klar zu kommunizieren.
Wenn ein Playbook fehlschlägt, verwenden Sie verschiedene Debug-Parameter:
# Erhöhte Verbosity
ansible-playbook -vvv playbook.yml
# Kombiniert mit Check-Modus
ansible-playbook --check -vv playbook.yml
# Nur bestimmte Tags ausführen
ansible-playbook --tags "configuration" playbook.yml
# Ab einem bestimmten Task starten
ansible-playbook --start-at-task "Install packages" playbook.ymlÜberprüfen Sie regelmäßig Ihre Playbooks und Rollen, um sicherzustellen, dass sie den aktuellen Best Practices entsprechen und auf den neuesten Stand gebracht wurden. Technologien und Anforderungen ändern sich, und Ihre Playbooks sollten sich anpassen können.
Nutzen Sie Callback-Plugins, um die Performance Ihrer Playbooks zu überwachen:
# Profiling aktivieren
export ANSIBLE_CALLBACKS_ENABLED=profile_tasks
ansible-playbook playbook.ymlImplementieren Sie eine ausgewogene Test-Pyramide:
Dokumentieren Sie Ihre Test-Szenarien und erwarteten Ergebnisse:
# tests/README.md
## Test-Szenarien
1. **Grundinstallation**: Prüft die initiale Installation aller Komponenten
2. **Konfigurationsupdates**: Testet Änderungen an Konfigurationsdateien
3. **Service-Restart**: Überprüft das korrekte Neustarten von Services
4. **Idempotenz**: Stellt sicher, dass mehrfache Ausführung keine Änderungen bewirkt