Ansible is a powerful configuration management tool. For developing and distributing ansible-roles we use Gitlab at Toscom. In this article I’ll describe how to automatically test ansible-roles for different Linux-Distributions in Docker-Container using Gitlab-Runner whenever someone pushes changes into our Gitlab-Repository.
Creating a Ansible-Debian-Docker-Image
First I created the following Dockerfile:
# This Dockerfile was tested with debian jessie
#
# Build with: docker build -t ansible/debian_jessie .
#
FROM debian
MAINTAINER hoti
ENV DEBIAN_FRONTEND noninteractive
RUN echo "deb http://ftp.debian.org/debian jessie-backports main" > /etc/apt/sources.list.d/backports.list
RUN apt-get update && apt-get upgrade -y
RUN apt-get install -y build-essential git python python-dev libffi-dev libssl-dev python-pip libyaml-dev libgmp-dev libgmp10 libyaml-0-2 apt-utils
RUN apt-get install -y -t jessie-backports python-pyasn1 python-setuptools
RUN git clone https://github.com/ansible/ansible.git /usr/local/src/ansible
RUN cd /usr/local/src/ansible && git checkout v2.1.2.0-1 && git submodule update --init --recursive && make && make install
USER root
WORKDIR /var/tmp
This Dockerfile is easily built by calling the follwing command
docker build -t ansible/debian_jessie .
Configuring the Gitlab-Repository
It’s very important to install the Gitlab-Runner and Docker on the same host. The Gitlab-Runner can easily installed using this instructions.
Now we can create the gitlab-runer-control-file(.gitlab-ci.yml) in our Gitlab-Repository of our ansible-role(let’s call it “fancy-ansible-role”):
debian:jessie:
image: ansible/debian_jessie
before_script:
- mkdir -p roles/fancy-ansible-role
- rsync -ar --exclude=.git --exclude=roles . roles/fancy-ansible-role
script:
- ansible-playbook .playbook.yml
And for our tests we create in our fancy-ansible-role-repository a file called .playbook.yml:
- hosts: localhost
roles:
- fancy-ansible-role
To complete our ansible-role I’ll create a simple task and add it to the fancy-ansible-role. This simple code I’ll place at tasks/main.yml:
---
- name: Fancy Ansible Role Debug
debug: msg="HELLO WORLD"
This role simply prints out “HELLO WORLD”.
Our Result
Finally we can push any changes in our repository and we can monitor the output of our tests in Gitlab:
Conclusio
In this article I just created a playbook for one Linux-Distribution but it could be easily extended to perform those tests on multiple Distributions. This clearly shows that Continous Integration-Tools can be very handy for Systemadministrators too.