Ansible with Docker
'Docker module', you say? No need for that fancy stuff. We're just going to set up a couple of docker containers and connect to them like any other machine.
Set up two containers: deb and arch, add them to an ansible hosts file, then do a 'ping' to see if they respond.
Required Packages
ansiblejqdocker
Debian Container
1docker run -di --rm --name deb --hostname deb debian
2docker exec -it deb sh -c 'apt update && apt -y install openssh-server python3 sudo'
Generate the host's ssh keys, then start the ssh daemon:
1docker exec -it deb sh -c 'ssh-keygen -A'
2docker exec -d deb /usr/sbin/sshd -D
Arch Linux Container
1docker run -di --rm --name arch --hostname arch archlinux
2docker exec -it arch sh -c 'pacman -Syu --noconfirm python sudo openssh'
3docker exec -it arch sh -c 'ssh-keygen -A'
4docker exec -d arch /usr/sbin/sshd -D
ssh Keys
Copy across your public ssh key to the container's authorized_keys file:
1pubkey=~/.ssh/id_rsa.pub
2for hostname in arch deb; do
3    docker cp $pubkey $hostname:/root/.ssh/authorized_keys
4    docker exec -it $hostname sh -c "chown -R root:root /root/.ssh/"
5    docker exec -it $hostname sh -c "chmod -R 700 /root/.ssh/"
6done
Hosts File
Find name of containers' IPv4 addresses.
1docker network inspect bridge
The output is awful.
Use jq to parse the json:
1docker network inspect bridge  | jq -r '.[].Containers | .[].IPv4Address'
Now put those into a host file:
1docker_hosts=hosts.txt
2echo '[containers]' > $docker_hosts
3
4docker network inspect bridge  | \
5    jq -r '.[].Containers | .[] | "root@" + .IPv4Address' | \
6    cut -d/ -f1 >> $docker_hosts
You may need to add those host keys to your known hosts file. Either connect interactively, or (for scripts):
 1hosts="$(docker network inspect bridge  | jq -r '.[].Containers | .[] | .Name + " " + .IPv4Address' | \
 2    cut -d/ -f1)"
 3
 4echo "$hosts"
 5
 6echo "$hosts" | while read hostname ip; do
 7    printf "%s" "$ip"
 8    key="$(docker exec $hostname cat /etc/ssh/ssh_host_ed25519_key.pub)"
 9    echo "$ip $key" >> ~/.ssh/known_hosts
10done
Check if they ping:
1ansible -i $docker_hosts all -m ping
This command produces an irritating warning about the python interpreter (i.e., python3).
Make the warning shut-up:
1echo '
2[containers:vars]
3ansible_python_interpreter=/usr/bin/python3.13' >> $docker_hosts
Now the ping is cleaner:
1ansible -i $docker_hosts all -m ping