Forschen

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

×
×

Nehmen Sie Kontakt zu uns auf!

Mit * gekennzeichnete Felder sind Pflichtfelder.

Wir haben Ihre Kontaktanfrage erhalten und melden uns kurzfristig bei Ihnen!

×

Ich möchte eine Frage einreichen!

Vielen Dank für das Einreichen Ihrer Frage!