Jenkins und Ansible

Datum

In vielen Fällen lassen sich builds automatisch per Ansible und/oder Jenkins bauen. Das eine muss das andere aber nicht ausschließen…
Das Ausführen von Ansible-Playbooks steigert die Möglichkeiten beim bauen der Builds und des weiteren kann man auch einfach per Jenkins ein beliebiges Playbook per Remote-Trigger ausführen lassen.

Da stetig an Ansible weiter entwickelt wird, möchte man eine neue bzw. eine andere Version für seine Playbooks verwenden als wie sie per OS-Repo verfügbar ist. Dies ist vor allem dann notwendig wenn neue Funktionalitäten, welche man verwenden will, erst in den neueren Versionen, wenn nicht sogar erst in der Developer-Version, vorhanden sind.

Ich werde hier verschiedene Wege aufzeigen wie Ansible im Jenkins verwendet werden kann.

Anmerkung: Für die meisten der folgenden Schritte ist es erforderlich, dass das Ansible-Plugin installiert ist. Des weiteren sollten git und der python package manager pip installiert sein.

Es gilt auch zu beachten das Jenkins die zu verwendenden Ansible-Versionen in den Workspace des entsprechenden Jobs installiert. Dies ist vor allem dann wichtig wenn eingestellt ist, dass der Workspace vor jedem build geleert wird.

Die Systemweite Ansible-Version verwenden

Ansible sollte mittlerweile in den meisten Repos der verschiedenen Linux-Distros verfügbar sein.
Meist sogar in recht aktueller Version, falls nicht können zusätzlich externe Repos eingebunden werden.

$ yum info ansible
Installierte Pakete
Name       : ansible
Architektur : noarch
Version    : 2.7.5
Ausgabe    : 1.el7
Größe : 60 M
Quelle      : installed
Aus Quelle  : epel

Um nun die systemweit installierte Variante für die Ausführung von Playbooks zu verwenden, geht man unter Jenkins —> Konfiguration der Hilfsprogramme —> Ansible Installationen —> Ansible hinzufügen
Hier trägt man nun einen eindeutigen Namen ein, gibt den Pfad zur Binärdatei von Ansible an, welchen man z.B. per which ansible heraus bekommt und drückt auf speichern. Die Option Automatisch installieren sollte NICHT aktiviert sein.

Ansible in einem Virtualenv installieren und starten

virtualenv ist die Kurzform für „Virtual Environment“ und dient zum Einrichten von ein oder mehreren unabhängigen Python-Umgebungen.

Standardmäßig werden alle Python-Module – egal ob über die Paketverwaltung oder den Python Package Index installiert, in die allgemeine Systemumgebung installiert. Aus Kompatibilitätsgründen oder zu Testzwecken möchte man aber eventuell ältere oder neuere Module installieren, ohne die „Standardinstallation“ zu gefährden. Hier kommt virtualenv ins Spiel, welches voneinander isolierte Python-Umgebungen erzeugt, in welchen dann beliebige Python-Module installiert werden können, ohne das Hauptsystem oder andere Umgebungen zu „stören“.

Quelle: wiki.ubuntuusers.de

Dies hat den großen Vorteil das mehrere Ansible-Versionen parallel installiert sein können. Auf diese Weise kann man sich eine kleine Auswahl an verschiedenen Ansible-Versionen im Jenkins anlegen.

Auch hier navigiert man wieder zu: Jenkins —> Konfiguration der Hilfsprogramme —> Ansible Installationen —> Ansible hinzufügen

Nachdem wieder ein eindeutiger Name vergeben wurde aktiviert man die Option Automatisch installieren und gibt als Installationsverfahren Shell-Kommando ausführen an

Um nun beispielsweise Ansible in der Version 2.5.0 zu verwenden, trägt man in das Kommando Textfeld folgenden Block ein:

ansible_version=2.5.0
export PATH=$(pwd)/ansible_${ansible_version}/bin/:~/.local/bin/:$PATH
if [ "$(which ansible)" == "$(pwd)/ansible_${ansible_version}/bin/ansible" ]; then
  ansible --version | grep "ansible ${ansible_version}" && echo "${ansible_version} bereits installiert" && source ansible_${ansible_version}/bin/activate
else
    pip install --user virtualenv
    virtualenv ansible_${ansible_version}
    source ansible_${ansible_version}/bin/activate
    pip install --upgrade setuptools
    pip install ansible==${ansible_version}
    pip install bigsuds deepdiff cryptography pycrypto
    pip uninstall -y requests && pip install requests
fi

Dieses Snippet prüft zuerst ob es bereits einen Ordner mit einer entsprechenden Ansible-Version gibt und falls nicht wird diese lokal (im Workspace des Jenkins) in einem virtualenv installiert. Sollte dieser Job ein weiteres Mal mit der gleichen Ansible-Version gebaut werden, ist ein erneutes installieren nicht nötig und es wird die bereits vorhandene Instanz verwendet.
Als weiterer Paramter muss auch hierbei der Pfad zur entsprechenden Binärdatei von Ansible angegeben werden. Dies ist hierbei ansible_<Versionsnummer>/bin/.
Z.B.: ansible_2.7.4/bin/

Ansible in der aktuellsten Developer Version verwenden

Wenn man schon mal die neusten Funktionen von Ansible testen möchte, kann man sich auch eine Instanz der Developer Version verwenden. Diese findet sich in dem entsprechenden Ansible-Repo.

Ein weiteres Mal navigiert man zu Jenkins —> Konfiguration der Hilfsprogramme —> Ansible Installationen —> Ansible hinzufügen.

Hier heißt es wieder einen eindeutigen Namen vergeben und folgenden Block in das Kommando Textfeld eintragen:

INSTALLDIR="/tmp/ansible_dev"
if [ -d "${INSTALLDIR}" ] ; then
  rm -rf ${INSTALLDIR} 
fi
git clone https://github.com/ansible/ansible.git ${INSTALLDIR}
source ${INSTALLDIR}/hacking/env-setup
pip install --user -r ${INSTALLDIR}/requirements.txt
ansible --version

Am Anfang wird hier wieder geprüft ob schon ein entsprechender Ordner existiert und falls ja, weird dieser gelöscht um immer die neuste Version zu verwenden.
Das kann jeder für sich individuell regeln.
Anschließend wird die aktuellste Version des githib-Repos lokal geklont und eventuelle Abhängigkeiten werden lokal in den entsprechenden Ordner installiert.
Ich lasse mir hierbei immer noch einmal die gerade verwendete Ansible-Version per ansible --version anzeigen.
Bsp.: ansible 2.8.0.dev0 (devel 7ec82cdfc9) last updated 2018/12/23 10:49:39 (GMT +200)

Playbooks ausführen

Um nun ein Ansible-PLaybook auszuführen, erstellt man ein entsprechendes Projekt und richtet sich in der Konfiguration eine Quelle für das Playbook ein, z.B. github:

Im Anschluss daran fügt man, unter Buildverfahren, den Schritt Invoke Ansible Playbook hinzu. Hier kann man als erstes zwischen den vorher eingerichteten Ansible-Instanzen die passende auswählen.
Nun gibt man noch den Pfad zum entsprechenden Playbook an. Da hier bereits als vorgelagerter Schritt ein entsprechendes github-Repo mit passendem Playbook gklont wird, befindet sich das Playbook direkt im Workspace.

Eine Angabe von Hosts per Inventory_Datei ist bei meinem Beispiel nicht notwendig, da hierbei nur eine Mitteilung mit Hello World! ausgegeben wird.

PLAY [127.0.0.1] ***************************************************************

TASK [Hello World!] ************************************************************
ok: [127.0.0.1] => {
    "msg": "Hello world!"
}

PLAY RECAP *********************************************************************
127.0.0.1                  : ok=1    changed=0    unreachable=0    failed=0   

Finished: SUCCESS

Autor
Kategorien Jenkins, Ansible

PRTG Map