TESTEN VON ANSIBLE ROLES MIT MOLECULE
Molecule ist ein Testing Framework, das designed wurde um die Entwicklung von Ansible Rollen bzw. Playbooks zu erleichtern. Die Verwendung ermöglicht dem User sich mehr auf das eigentliche Erstellen des Codes zu konzentrieren und sich weniger um die Wartung der Test-Infrastruktur kümmern zu müssen.
Um Tests gegen ein “frisches” System laufen zu lassen, nutzt Molecule Docker Container um virtualisierte Hosts zu provisionieren, die Tasks auszuführen und den erfolgreichen Durchlauf zu prüfen. Molecule verbindet sich nicht über SSH zum Container, sonder nutzt eine vorher festgelegte, installierte Ansible Version innerhalb des Containers. Deshalb empfiehlt es sich, ein Custom Build Container Image zu verwenden (z.B. für die Verwendung von systemd).
Bevor wir zur Installation kommen hier noch eine kurze Erklärung zu Docker und Ansible:
Was ist Docker?
Docker ist eine Container-Virtualisierungsstechnologie die die Erstellung und den Betrieb von Linux Containern, also “Software-Containern” für Applikationen, ermöglicht. Hierbei wird das containerisierte System vom Host-Betriebssystem isoliert, jedoch wird im Gegensatz zu virtuellen Maschinen der Kernel von diesen verwendet, was weniger Overhead bedeutet. Docker bzw. Container im allgemeinen reduzieren den Aufwand für die Bereitstellung einer Applikation, so kann z.B. ein einfacher Webserver innerhalb weniger Minuten provisioniert werden.
Was ist Ansible?
Ansible ist ein Automatisierungswerkzeug zur Konfiguration bzw. Administration von Servern. Eine Besonderheit von Ansible sind die minimalen Vorraussetzungen: OpenSSH und Python - welche sich auf jedem UNIX-System wiederfinden. Das heißt es wird im Vergleich zu anderen Werkzeugen kein zusätzlicher Agent benötigt. Konfigurationsmanagement mit Ansible wird durch die Beschreibung eines gewünschten Zustandes des Hosts über sogennante Playbooks erzielt. Für diese Beschreibung verwendet Ansible die leicht zu verstehende YAML-Syntax.
Installation
Molecule benötigt Python 3 als Execution Environment, sowie Docker zur Virtualisierung der Testumgebung (Vagrant und OpenStack werden ebenfalls unterstützt). Außerdem sind python3-pip sowie python3.8-venv für die Installation erforderlich. Die folgenden Schritte beschreiben, wie ein Python3 Virtual Environment erstellt und aktiviert werden kann:
[kem@testhost ~]$ python3 -m venv molecule-virtualenv
[kem@testhost ~]$ source molecule-virtualenv/bin/activate
Die Aktivierung des Virtual Environments isoliert die Python Umgebung von der default Installation, weiterhin müssen ansible, pip und docker in ein Virtual Environment für den User molecule-virtualenv installiert werden (daher nicht sudo verwenden!):
(molecule-virtualenv) [kem@testhost ~]$ pip3 install --upgrade pip
(molecule-virtualenv) [kem@testhost ~]$ pip3 install ansible==2.9.15
(molecule-virtualenv) [kem@testhost ~]$ pip3 install molecule[docker]
Dementsprechend ist es nicht möglich Molecule außerhalb des Virtual Environments zu verwenden.
Folgende Verzeichnisstruktur wird in dem Rollenordner benötigt:
[kem@testhost repository]$ tree molecule/
molecule/
└── default
├── converge.yml
├── molecule.yml
└── prepare.yml
Beispiel converge.yml - Das Playbook, welches die Rolle inkludiert
---
- name: Converge
hosts: molecule
become: yes
roles:
- repository
Beispiel prepare.yml - Wie der Name schon sagt, wird hier der Container vor dem eigentlichen Ausführen der Rollen vorbereitet, etwa um Abhängigkeiten zu erfüllen.
---
- name: Prepare
hosts: test
become: yes
vars:
# Lokale(VEnv Host) Dateien
package_bundle: "package.tar.gz"
package_dir: "~/files"
tasks:
- name: Add http proxy address to yum config
ini_file:
path: /etc/yum.conf
section: main
option: proxy
value: "{{ molecule_http_proxy }}"
no_extra_spaces: yes
state: present
- name: install rsync
yum:
state: present
name: rsync
- name: unarchive packe archive
unarchive:
src: "{{ package_dir }}/{{ package_bundle }}"
dest: "{{ package_dir }}/"
extra_opts: [--strip-components=3]
remote_src: yes
molecule.yml - Enthält die Container, ansible.cfg und Sequenz Beschreibung - kann die Inventorydefinition enthalten
---
###Docker
driver:
name: docker
platforms:
- name: molecule-repository-${USER}
groups:
- molecule
image: kem/centos7-molecule
tmpfs:
- /run
- /tmp
volumes:
- /sys/fs/cgroup:/sys/fs/cgroup:ro
privileged: true
command: "/usr/sbin/init"
pre_build_image: true
exposed_ports:
- 80/tcp
- 443/tcp
published_ports:
- 0.0.0.0:13080:80/tcp
- 0.0.0.0:13443:443/tcp
###ansible.cfg
provisioner:
name: ansible
env:
ANSIBLE_FILTER_PLUGINS: ../../../../plugins/filter
ANSIBLE_LIBRARY: ../../../../library
options:
D: true
extra-vars: "@defaults/main.yml"
connection_options:
ansible_user: ansible
config_options:
defaults:
interpreter_python: auto_silent
verbosity: 4
callback_whitelist: profile_tasks, timer, yaml
stdout_callback: yaml
vault_password_file: "${PWD}/../../.vault-password"
ssh_connection:
pipelining: false
inventory:
links:
hosts: ../../../../inventory/hosts
group_vars: ../../../../inventory/group_vars
host_vars: ../../../../inventory/host_vars
###Molecule Szenario
scenario:
create_sequence:
- create
- prepare
converge_sequence:
- converge
- idempotence
destroy_sequence:
- destroy
test_sequence:
- destroy
- create
- prepare
- converge
- idempotence
- destroy
Erklärungen
In obigem Beispiel erstellen wir lediglich einen Container - Clusterkonstrukte sind aber ebenfalls möglich
*_sequenz
sind die Kommandos die wir im Anschluss auf der CLI ausführen können:
Erstellung des Containers und sowie Ausführung prepare.yml
(molecule-virtualenv) [kem@testhost repository]$ molecule create
Ausführung der Rolle und Prüfung der Idempotenz
(molecule-virtualenv) [kem@testhost repository]$ molecule converge
Zerstörung des Containers
(molecule-virtualenv) [kem@testhost repository]$ molecule converge
Vollständiger Durchlauf
(molecule-virtualenv) [kem@testhost repository]$ molecule test
Container Login
(molecule-virtualenv) [kem@testhost repository]$ molecule login
Deaktivierung des Virtual Environments
(molecule-virtualenv) [kem@testhost ~]$ deactivate
Ein Artikel von Tobias