How to test Ansible playbook using Docker

I've created a role for this vary scenario: https://github.com/chrismeyersfsu/provision_docker. Easily start Docker containers and use them in your role or playbook, as inventory, to test.

Includes:

  • Curated Dockerfile for Ubuntu 12.04 & 14.04 as well as CentOS 6 & 7 that put back in the distro-removed init systems
  • start ssh

Also note the examples all have a .travis.yml file to form a CI pipeline using Travis CI.

Examples:

  • Simple: https://github.com/chrismeyersfsu/provision_docker/tree/master/test
  • Simple: https://github.com/chrismeyersfsu/role-iptables/tree/master/test
  • Advanced: https://github.com/chrismeyersfsu/role-install_mongod/tree/master/test

There's a working example regarding this: https://github.com/William-Yeh/docker-ansible

First, choose the base image you'd like to begin with from the following list:

  • williamyeh/ansible:debian8-onbuild
  • williamyeh/ansible:debian7-onbuild
  • williamyeh/ansible:ubuntu14.04-onbuild
  • williamyeh/ansible:ubuntu12.04-onbuild
  • williamyeh/ansible:centos7-onbuild
  • williamyeh/ansible:centos6-onbuild

Second, put the following Dockerfile along with your playbook directory:

FROM williamyeh/ansible:ubuntu14.04-onbuild

# ==> Specify playbook filename;   default = "playbook.yml"
#ENV PLAYBOOK   playbook.yml

# ==> Specify inventory filename;  default = "/etc/ansible/hosts"
#ENV INVENTORY  inventory.ini

# ==> Executing Ansible...
RUN ansible-playbook-wrapper

Third, docker build .

For more advanced usage, the role in Ansible Galaxy williamyeh/nginx also demonstrates how to do a simple integration test for a variety of Linux distributions on Travis CI’s Ubuntu 12.04 worker instances.

Disclosure: I am the author of the docker-ansible and wiliamyeh/nginx projects.


Running the playbook in a docker container may not actually be the best approach unless your stage and production servers are also Docker containers. The Docker ubuntu image is stripped down and will have some differences from a full installation. A better option might be to run the playbook in an Ubuntu VM that matches your staging and production installations.

That said, in order to run the ansible playbook within the container you should write a Dockerfile that runs your playbook. Here's a sample Dockerfile:

 # Start with the ubuntu image
 FROM ubuntu
 # Update apt cache
 RUN apt-get -y update
 # Install ansible dependencies
 RUN apt-get install -y python-yaml python-jinja2 git
 # Clone ansible repo (could also add the ansible PPA and do an apt-get install instead)
 RUN git clone http://github.com/ansible/ansible.git /tmp/ansible

 # Set variables for ansible
 WORKDIR /tmp/ansible
 ENV PATH /tmp/ansible/bin:/sbin:/usr/sbin:/usr/bin
 ENV ANSIBLE_LIBRARY /tmp/ansible/library
 ENV PYTHONPATH /tmp/ansible/lib:$PYTHON_PATH

 # add playbooks to the image. This might be a git repo instead
 ADD playbooks/ /etc/ansible/
 ADD inventory /etc/ansible/hosts
 WORKDIR /etc/ansible

 # Run ansible using the site.yml playbook 
 RUN ansible-playbook /etc/ansible/site.yml -c local

The ansible inventory file would look like

[local]
localhost

Then you can just docker build . (where . is the root of the directory where your playbooks and Dockerfile live), then docker run on the resulting image.

Michael DeHaan, the CTO of Ansible, has an informative blog post on this topic.

Tags:

Docker

Ansible