There are two approaches to configuring a Docker container with Ansible:
- CHROOT: configure a rootfs with the chroot connection plugin and import it in Docker
- SSH: launch an ssh server in the container and use Ansible with the default SSH connection plugin
Each approach presents a drawback:
- CHROOT: cannot save the state of the container in between runs of Ansible.
This prevents Docker from sharing rootfs layers and therefore prevents caching. - SSH: requires an SSH server running in the container.
This SSH server is not necessarily a desired service in the container.
Furthermore, paying the SSH setup and encryption costs for a local container seems silly.
Wouldn’t it be nice to harvest the power of Docker rootfs sharing/caching with the following Dockerfile:
PLUGIN ansible
FROM ubuntu
RUN apt-get install python apt-python
ANSIBLE install-things.yaml
ANSIBLE setup-things.yaml
ANSIBLE run-things.yaml
If I understand Docker builds correctly, a RUN <command>
directive work as follows:
- Start the Docker container with rootfs available after the last line, and the command
<command>
. - Once
<command>
ends, the container stops and the rootfs is saved.
Implementing an Ansible directive seems to be doable, using the accelerate connection plugin without an SSH setup phase as follows:
- Start the Docker container with the command
python -c "<ansible accelerate daemon code>"
. - Use
ansible-playbook
with the accelerate-no-ssh connection plugin (to be implemented) to configure the container. - Once
ansible-playbook
is done, the daemon stops which stops the container, and the rootfs can be saved.
I have started a discussion regarding the Docker side of things at: https://github.com/dotcloud/docker/issues/2841. It also includes a little bit more of motivation of why I think Ansible and Docker are a good match.