Ansible Lab environment using Docker

Some time ago I created a short guide about Ansible test/dev environment setup using docker (<a href="https://github.com/LMtx/ansible-lab-docker" target="_blank">https://github.com/LMtx/ansible-lab-docker)</a>. This approach is still valid today - I hope you will find it useful.

Some time ago I created a short guide about Ansible test/dev environment setup using docker (https://github.com/LMtx/ansible-lab-docker). This approach is still valid today - I hope you will find it useful.

Introduction

The aim of this guide is setup of Ansible training environment using Docker containers. After finishing this tutorial you will have Docker master container that can manage three host containers (you can easily extend number of managed hosts to meet your needs).

Why I decided to use Docker instead of conventional virtualization like VirtualBox? Docker containers consume much less resources so you can build bigger test environments on your laptop. Docker container is way faster to start/kill than standard virtual machine which is important when you experiment and bring the whole environment up and down. I used Docker Compose to automate setup of lab environment (there is no need to maintain each container separately).

This guide is not Ansible or Docker tutorial (although I explain some basic concepts). It's purpose is solely setup of lab environment to enable experiments with ansible on local machine.

IMPORTANT: In order to follow this tutorial you need to install Docker CE (Community Edition) on your machine. The installation is well documented at https://docs.docker.com/engine/installation/#supported-platforms and I will not cover it here.

A brief description of Ansible and Docker:

Ansible

Ansible is IT automation system. It handles configuration-management, application deployment, cloud provisioning, ad-hoc task-execution, and multinode orchestration - including trivializing things like zero downtime rolling updates with load balancers.

You can read more at www.ansible.com

Docker

Docker is the world’s leading software container platform. Developers use Docker to eliminate "works on my machine" problems when collaborating on code with co-workers. Operators use Docker to run and manage apps side-by-side in isolated containers to get better compute density. Enterprises use Docker to build agile software delivery pipelines to ship new features faster, more securely and with confidence for both Linux, Windows Server, and Linux-on-mainframe apps.

You can read more at www.docker.com

Quick startClone repository

Clone this git repository:

git clone https://github.com/LMtx/ansible-lab-docker.git

Build images and run containers

Enter ansible directory containing docker-compose.yml file.

Build docker images and run containers in the background (details defined in docker-compose.yml):

docker-compose up -d --build

Connect to master node:

docker exec -it master01 bash

Verify if network connection is working between master and managed hosts:

ping -c 2 host01

Start an SSH Agent on master node to handle SSH keys protected by passphrase:

ssh-agent bash

Load private key into SSH Agent in order to allow establishing connections without entering key passphrase every time:

ssh-add master_key

Enter passphrase for master_key:

As passphrase enter: 12345

Default key passphrase can be changed in ansible/master/Dockerfile

Ansible playbooks

Run a sample ansible playbook that checks connection between master node and managed hosts:

ansible-playbook -i inventory ping_all.yml

Confirm every new host for SSH connections:

ECDSA key fingerprint is SHA256:HwEUUnBtOm9hVAR2PJflNdCVchSCzIlpOpqYlwp+w+w.
Are you sure you want to continue connecting (yes/no)?

Type: yes (three times)

Install PHP on web inventory group:

In order to group managed hosts for easier maintenance you can use groups in ansible inventory file.

Run a sample ansible playbook:

ansible-playbook -i inventory install_php.yml

Copy data between local file system and containers

Copy directory from container to local file system

docker cp master01:/var/ans/ .

Copy directory from local file system to container:

docker cp ./ans master01:/var/

You can check usage executing:

docker cp --help

Cleanup

After you are done with your experiments or want to destroy lab environment to bring new one execute following commands.

Stop containers:

docker-compose kill

Remove containers:

docker-compose rm

Remove volume:

docker volume rm ansible_ansible_vol

If you want you can remove Docker images (although that is not required to start new lab environment):

docker rmi ansible_host ansible_master ansible_base

Tips

In order to share public SSH key between master and host containers I used Docker volume mounted to all containers:

docker-compose.yml:

[...]
volumes:
  - ansible_vol:/var/ans
[...]

Master container stores SSH key in that volume (ansible/master/Dockerfile):

[...]
WORKDIR /var/ans
RUN ssh-keygen -t rsa -N 12345 -C "master key" -f master_key
[...]

And host containers add SSH public key to authorized_keys file (ansible/host/run.sh) in order to allow connections from master:

cat /var/ans/master_key.pub >> /root/.ssh/authorized_keys

IMPORTANT: this is valid setup for lab environment but for production deployment you have to distribute the public key other way.

TroubleshootingHost containers stop after creation

Check that ansible/hosts/run.sh has proper end of line type - it should be Linux/Unix (LF) not Windows (CRLF). You can change end of line type using source code editor (like Notepad++ or Visual Studio Code); under Linux you can use dos2unix command.

Other issue

Please open an issue and I'll try to help.

WordPress in Docker. Part 1: Dockerization

WordPress in Docker. Part 1: Dockerization

This entry-level guide will tell you why and how to Dockerize your WordPress projects.

This entry-level guide will tell you why and how to Dockerize your WordPress projects.

Docker Tutorial for Beginners Linux

Docker Tutorial for Beginners Linux

Docker Tutorial for Beginners Linux - In this video tutorial , we will look at some basic Docker commands and a simple build-ship-run workflow. We’ll start by running some simple containers, then we’ll use a Dockerfile to build a custom app. Finally, we’ll look at how to use bind mounts to modify a running container as you might if you were actively developing using Docker.

In this video tutorial , we will look at some basic Docker commands and a simple build-ship-run workflow. We’ll start by running some simple containers, then we’ll use a Dockerfile to build a custom app. Finally, we’ll look at how to use bind mounts to modify a running container as you might if you were actively developing using Docker.

List all containers in Docker(Docker command)

List all containers in Docker(Docker command)

We can get a list of all containers in docker using `docker container list` or `docker ps` commands.

We can get a list of all containers in docker using docker container list or docker ps commands.

List Docker Containers

To list down docker containers we can use below two commands

  • docker container list
  • docker ps

docker container ls command introduced in docker 1.13 version. In older versions we have to use docker ps command.

List all Containers in docker, using docker ls command

The below command returns a list of all containers in docker.

docker container list -all

or

docker container ls -all

List all containers in docker, using docker ps command

In older version of docker we can use docker ps command to list all containers in docker.

$ docker ps -all

or

$ docker ps -a

List all Running docker containers

The default docker container ls command shows all running docker containers.

$ docker container list

or

$ docker container ls

or

To get list of all running docker containers use the below command

$ docker ps

List all stopped docker containers command

To get list of all stopped containers in docker use the below commands

$ docker container list -f "status=exited"

or

$ docker container ls -f "status=exited"

or you can use docker ps command

$ docker ps -f "status=exited"

List all latest created docker containers

To list out all latest created containers in docker use the below command.

$ docker container list --latest

Show n last created docker containers

To display n last created containers in docker use the below command.

$ docker container list --last=n