How to use the docker connection-plugin of ansible?

It's simple: set connection: docker and use container names as inventory hosts.

Example:

# docker run -d --name=mycontainer -e FOO=bar alpine:latest sleep 600
fde1a28914174c53e8f186f2b8ea312c0bda9c895fc6c956f3f1315788f0bf20
# ansible all -i 'mycontainer,' -c docker -m raw -a 'echo $FOO'
mycontainer | SUCCESS | rc=0 >>
bar

Just keep in mind, that most of Ansible modules require Python, but usually you have minimal amount of libraries inside your containers, and Python is not among them.


2020 TLDR: run a minimal Python container

In 2020, the above solution (running a minimal Alpine container) doesn't work -- Python is not installed.

Building on Konstantin Suvorov's answer, to make Ansible happy, give it a slim Python container:

docker run -d --name=mycontainer python:3.8-slim-buster sleep 600

Check:

ansible all -i 'mycontainer,' -c docker -m setup

Classic solution

The solution above no longer works, Python is not discoverable by Ansible:

docker run -d --name=bogus alpine:latest sleep 600

ansible all -i 'bogus,' -c docker -m setup

[WARNING]: No python interpreters found for host bogus (tried ['/usr/bin/python',
'python3.7', 'python3.6', 'python3.5', 'python2.7', 'python2.6',
'/usr/libexec/platform-python', '/usr/bin/python3', 'python'])

To make Ansible happy, give it a slim Python container:

docker run -d --name=mycontainer python:3.8-slim-buster sleep 600

Check:

ansible all -i 'mycontainer,' -c docker -m setup

Recommended Docker image

Itamar Turner-Trauring[1] recommended base Python image = python:3.8-slim-buster. The Alpine image, although nice and tiny, causes a lots of problems with Python! The above image is Debian-based, small enough, and totally solid.

[1] from https://pythonspeed.com/articles/base-image-python-docker-images/

Tags:

Docker

Ansible