lae.travis-lxc

lae.travis-lxc

Build Status Ansible Galaxy Role

Konfiguriert und startet N LXC-Container für die Verwendung in der Travis CI-Umgebung, um einfachere Tests von Ansible-Rollen über verschiedene Distributionen hinweg durchzuführen.

Nutzung

Möchten Sie Ihre Ansible-Rollen in Travis CI testen, aber Docker nicht verwenden, weil es ein vollständiges OS nicht nachahmt? LXC ist das, was Sie verwenden möchten. Diese Rolle abstrahiert hoffentlich viel vom Boilerplate-Code, den Sie sonst benötigen würden.

Um zu beginnen, könnte eine minimale .travis.yml, die gründlich testet, ob Ihre Rolle gültig, idempotent und funktional ist, folgendermaßen aussehen:

---
language: python
sudo: erforderlich
dist: bionic
install:
- pip install ansible
- ansible-galaxy install lae.travis-lxc,v0.9.0
- ansible-playbook tests/install.yml -i tests/inventory
before_script: cd tests/
script:
# Überprüft die Syntax Ihres Deployment-Playbooks, das Ihre Rolle enthalten sollte
- ansible-playbook -i inventory deploy.yml --syntax-check
# Führt das Deployment-Playbook aus
- ansible-playbook -i inventory deploy.yml
# Führt das Deployment-Playbook erneut aus, speichert die Ausgabe in einer Datei namens play.log,
# und überprüft dann, ob es keine geänderten/fehlgeschlagenen Aufgaben gibt und schlägt fehl, wenn es welche gibt.
- 'ANSIBLE_STDOUT_CALLBACK=debug ANSIBLE_DISPLAY_SKIPPED_HOSTS=no ANSIBLE_DISPLAY_OK_HOSTS=no
  unbuffer ansible-playbook -vvi inventory deploy.yml &>play.log; printf "Idempotenz: ";
  grep -A1 "PLAY RECAP" play.log | grep -qP "changed=0 .*failed=0 .*"
  && (echo "PASS"; exit 0) || (echo "FAIL"; cat play.log; exit 1)'
# Integrationstests und ähnliches
- ANSIBLE_STDOUT_CALLBACK=debug ansible-playbook -i inventory -v test.yml

Sie werden feststellen, dass vier Dateien referenziert werden. Sie können entscheiden, wie Sie Ihren Build-Prozess definieren, aber Folgendes dient typischerweise den meisten Zwecken:

  • tests/install.yml: führt lae.travis-lxc und andere Vorinstallationsschritte aus
  • tests/deploy.yml: führt die Rolle aus, die Sie testen
  • tests/test.yml: führt Validierungstests gegen Ihr Deployment aus
  • tests/inventory: enthält eine Liste von LXC-Container-Hostnamen

install.yml könnte folgendermaßen aussehen:

---
- hosts: localhost
  connection: local
  roles:
    - lae.travis-lxc
  vars:
    test_profiles:
      - profile: debian-buster
      - profile: ubuntu-focal
      - profile: centos-7
      - profile: alpine-v3.11

# Fügen Sie alle anderen Einrichtungsaufgaben hinzu, die Sie möglicherweise benötigen, die aber nicht unbedingt in Ihrer Rolle erforderlich sind
- hosts: all
  tasks: []

Das erste Spiel bringt drei Container von drei verschiedenen Distributionen hoch. Das zweite Spiel könnte verwendet werden, um entweder andere Rollen oder Vorinstallationsaufgaben auszuführen, die Sie erwarten, dass Ihre Rolle nicht durchführt (zum Beispiel epel-release installieren oder einen Gerätknoten für FUSE erstellen (weil LXC das nicht für Sie tut)).

deploy.yml könnte folgendermaßen aussehen:

---
- hosts: all
  become: true
  any_errors_fatal: true
  roles:
    - ansible-role-strawberry-milk
  vars:
    number_of_cartons: 15

Dies ist im Grunde eine Wiedergabe dessen, was ansible-galaxy init in test.yml ausgeben würde. Dies hätte alles, was Sie benötigen, um Ihre Rolle richtig auszuführen. Für komplexere Rollen macht es Sinn, Variablen in den Ordner tests/group_vars auszulagern und Ihr Inventar entsprechend zu konfigurieren.

test.yml sollte Ihre Tests enthalten, wenn Sie welche durchführen möchten:

---
- hosts: all
  tasks:
    - name: Sicherstellen, dass der Strawberry Milk HTTP-Dienst läuft
      uri:
        url: "http://{{ inventory_hostname }}:1515"
    - block:
      - name: Strawberry Milk-Konfiguration ausgeben
        shell: cat /etc/strawberry_milk.conf
        changed_when: false
      - name: Systemprotokolle ausgeben
        shell: "cat /var/log/messages || cat /var/log/syslog || journalctl -xb"
      ignore_errors: yes

Dies kann nützlich sein, um sicherzustellen, dass ein Dienst läuft, dass ein Cluster in einem gesunden Zustand ist und dass bestimmte Dateien erstellt werden... Sie verstehen das Prinzip. Der block, den ich hier habe, ist ein Bereich, in dem ich diagnostische Aufgaben ausführe, um Probleme zu debuggen, einschließlich des Ausgebens von Protokollen und Ähnlichem. Es ist mit ignore_errors umschlossen, damit diese Aufgaben den Build nicht beeinflussen (eine häufige Fehlerquelle ist die Protokollierungsaufgabe beim Testen mehrerer Distributionen).

Und schließlich, das Inventar:

debian-buster-01
ubuntu-focal-01
centos-7-01
alpine-v3-11-01

Die Hostnamen werden aus zwei Teilen generiert, einem Präfix und einem Nachsatz. Standardmäßig werden sie aus dem Schlüssel profile in test_profiles im Format {{ profile }}-{{ suffix }} generiert, wobei der Nachsatz standardmäßig 01 ist.

Sobald Sie diese Dateien geschrieben haben, sind Sie bereit, Ihre Rolle in Travis CI zu testen. Sie möchten wahrscheinlich mehr daraus machen, daher lassen Sie uns einige andere Themen durchgehen.

Testen mehrerer Ansible-Versionen

Es ist wahrscheinlich, dass Sie Ihre Rolle gegen den Entwicklungszweig sowie alle aktuell unterstützten Ansible-Versionen testen möchten. Dies ist etwas, das Sie in .travis.yml konfigurieren möchten, und es gibt verschiedene Möglichkeiten, dies zu tun:

env:
- ANSIBLE_GIT_VERSION='devel'
- ANSIBLE_VERSION='~=2.9.0'
- ANSIBLE_VERSION='~=2.9.0'
- ANSIBLE_VERSION='~=2.7.0'
install:
- if [ "$ANSIBLE_GIT_VERSION" ]; then pip install "https://github.com/ansible/ansible/archive/${ANSIBLE_GIT_VERSION}.tar.gz";
  else pip install "ansible${ANSIBLE_VERSION}"; fi
- ansible --version

Hier haben wir eine Installationsaufgabe hinzugefügt, die entweder ANSIBLE_GIT_VERSION als gültigen Verweis im Ansible-Git-Repository oder ANSIBLE_VERSION, eine gültige Versionszeichenfolge, die während der Installation an pip übergeben werden kann, übernimmt.

Ansible-Leistung und Profiling

Sie können fast alles in tests/ansible.cfg ablegen.

[defaults]
callback_whitelist=profile_tasks
forks=20
internal_poll_interval = 0.001

Dies führt den profile_tasks Callback in Ihrem Playbook aus, der hilft zu identifizieren, welche Aufgaben am längsten dauern. Sie könnten dies verwenden, um Leistungsregressionen zu identifizieren. Wenn Sie Ihr Playbook gegen mehrere Container ausführen, geben Sie forks an. internal_poll_interval ist eine gute allgemeine Einstellung, die Sie haben sollten, wenn Sie mehrere Aufgaben/Schleifen haben.

Caching

LXC-Images können zwischengespeichert werden, um die Bootstrap-Zeit zu verkürzen, insbesondere wenn Sie gegen mehrere Profile testen. Fügen Sie Folgendes in Ihre .travis.yml ein, und diese Rolle kümmert sich um den Rest.

cache:
  directories:
  - "$HOME/lxc"
  pip: true

(pip: true hat für diese Rolle keine Bedeutung, ist aber hier enthalten, da Sie möglicherweise auch Ihre Ansible-Installation zwischenspeichern möchten.)

Rollenvariablen

Um festzulegen, gegen welche Distributionen getestet werden soll, verwenden Sie test_profiles. Unterstützte Profile sind (fühlen Sie sich frei, neue anzufordern/beizutragen):

test_profiles:
  - profile: alpine-v3.11
  - profile: alpine-v3.10
  - profile: alpine-v3.9
  - profile: centos-7
  - profile: debian-buster
  - profile: debian-stretch
  - profile: ubuntu-focal
  - profile: ubuntu-bionic
  - profile: ubuntu-xenial

Die folgenden Profile sind definiert, werden aber nicht unbedingt aktiv als Ziele von dieser Rolle unterstützt (d.h. Tests werden nicht mehr gegen diese durchgeführt), sei es, weil sie offiziell EOL upstream sind oder relativ alt sind. Es werden keine Garantien gegeben, dass sie noch funktionsfähig sind (aber sie sind wahrscheinlich noch funktionsfähig).

test_profiles:
  - profile: alpine-v3.8
  - profile: alpine-v3.7
  - profile: alpine-v3.6
  - profile: centos-6
  - profile: debian-jessie
  - profile: debian-wheezy
  - profile: fedora-28
  - profile: fedora-27
  - profile: fedora-26
  - profile: fedora-25
  - profile: ubuntu-trusty

Sie können vars/main.yml für weitere Informationen zu diesen Profilen einsehen.

Ein Testcontainer, wenn kein Präfix angegeben ist, erhält einen Hostnamen von {{ profile }}-{{ suffix }}, wobei profile für die Verwendung in einem DNS-Namen aufbereitet wird. Standardpräfixe sind in vars/main.yml definiert, also schauen Sie nach, wenn Sie sich nicht sicher sind, was das Präfix eines bestimmten Profils ist. Wenn test_host_suffixes nicht definiert ist, wird suffix hier zu einer null-paddierten zweiziffrigen Ganzzahl, die bei 1 beginnt (bis zur angeforderten Anzahl von Hosts, die durch test_hosts_per_profile angegeben wird).

Beispielsweise erstellt Folgendes debian01, debian02 und debian03:

test_profiles:
  - profile: debian-buster
    prefix: debian
test_hosts_per_profile: 3

Folgendes erstellt ubuntu-app-python2 und ubuntu-app-python3:

test_profiles:
  - profile: ubuntu-focal
    prefix: ubuntu-
test_host_suffixes:
  - app-python2
  - app-python3

Sie können auch die verwendete Containerkonfiguration nach Bedarf überschreiben (z. B. zum Mounten eines freigegebenen Ordners):

container_config:
  - "lxc.aa_profile=unconfined"
  - "lxc.mount.auto=proc:rw sys:rw cgroup-full:rw"
  - "lxc.cgroup.devices.allow=a *:* rmw"

Falls notwendig (Fehlende Pakete sollten standardmäßig innerhalb dieser Rolle installiert werden, also eröffnen Sie ein Ticket), können Sie auch zusätzliche Pakete innerhalb der Testcontainer installieren:

additional_packages:
  - make

Wenn Caching in .travis.yml aktiviert ist, können Sie eine Teilmenge Ihrer Testprofile auswählen, die zwischengespeichert werden soll, indem Sie sie in lxc_cache_profiles angeben. Diese müssen gültige Profile sein und in test_profiles vorhanden sein.

Um in ein anderes Verzeichnis als $HOME/lxc zu cachen, ändern Sie lxc_cache_directory.

Wenn Sie die Verwendung von OverlayFS in den LXC-Containern deaktivieren müssen (z. B. wenn Sie versuchen, OverlayFS innerhalb des LXC-Containers zu verwenden), setzen Sie lxc_use_overlayfs auf no (oder jede False-Variante).

Mitwirkende

Musee Ullah (@lae, lae@lae.is)
Wilmar den Ouden (@wilmardo)

Stabilität

Diese Rolle befindet sich derzeit noch in der Version vor 1.0 und ist daher nicht garantiert stabil. Wenn Sie beim Verwenden dieser Rolle auf ein Problem stoßen, eröffnen Sie bitte ein Ticket mit einer kurzen Beschreibung und den entsprechenden Protokollen, damit es behoben werden kann und wir einen Schritt näher an unserer ersten stabilen Version sind.

Bitte stellen Sie sicher, dass Sie eine spezifische Version angeben (das Festlegen auf minor könnte in Ordnung sein), wenn Sie diese Rolle verwenden. Andernfalls können Ihre Tests beginnen zu fehlschlagen, aufgrund von breaking Changes in einer Minor-Version vor einer 1.0-Version.

Über das Projekt

Builds and configures LXC container hosts to use for integration testing Ansible roles on Travis CI

Installieren
ansible-galaxy install lae.travis-lxc
GitHub Repository
Lizenz
mit
Downloads
19.1k
Besitzer