This is a minor annoyance to people who want to work with docker on their vagrant boxes and provision them with the ansible_local provisioner.
To have docker installed in your box, you simply need to enable the docker provisoner in your Vagrantfile:
config.vm.provision "docker", run: "once"
Since you’re using the ansible_local provisiner, you might skip this and write a task that installs docker from get.docker.com or wherever it suits you anyway, but I prefer this as vagrant knows how to best install docker onto itself.
Now obviously you can have the provisioner pull images for you, but for any crazy reason you want to pass most, if not all, of the provisioning to ansible. And thus you want to use among others the docker_image module. So you write something like:
- name: install python-docker become: true apt: name: python-docker state: present - name: install docker images docker_image: name: busybox
Well this is going to greet you with an error message when you up the machine for the fist time:
Error message
TASK [install docker images] ***************************************************
fatal: [default]: FAILED! => {“changed”: false, “msg”: “Error connecting: Error while fetching server API version: (‘Connection aborted.’, error(13, ‘Permission denied’))”}
to retry, use: –limit @/vagrant/ansible.retry
Whereas when you happily run vagrant provision right away:
TASK [install docker images] ***************************************************
changed: [default]
Why does this happen? Because even though the installation of docker makes the vagrant user a member of group docker, this becomes effective with the next login.
The quickest way to bypass this is to make that part of your first run of ansible provisioning as super user:
- name: install docker images become: true docker_image: name: busybox
I am using the docker_image module only as an example here for lack of a better example with other docker modules on a Saturday morning. Pulling images is something that is of course very easy to do with the vagrant docker provisioner itself.
default: Running ansible-playbook…
PLAY [all] *********************************************************************
TASK [Gathering Facts] *********************************************************
ok: [default]TASK [install python-docker] ***************************************************
changed: [default]TASK [install docker images] ***************************************************
changed: [default]PLAY RECAP *********************************************************************
default : ok=3 changed=2 unreachable=0 failed=0