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