So I actually got this working. It think some of my confusion comes from
how to specify 'list' variables. The docker module, says the 'volumes'
parameter was a 'list'. Being new to Ansible and with no volumes example,
I dug around a bit. EC2 module has a 'list' var of instance-ids and this
example:
vars:
instance_ids:
- 'i-xxxxxx'
- 'i-xxxxxx'
- 'i-xxxxxx'
region: us-east-1
tasks:
- name: Start the sandbox instances
local_action:
module: ec2
instance_ids: '{{ instance_ids }}'
So I tried to copy that with docker:
vars:
theVolumes:
- '/etc/foo:/foo'
- '/etc/bar:/bar'
tasks:
- name: run bash
docker:
image=centos
volumes='{{ theVolumes }}'
state=running
stdin_open=yes tty=yes
command=/bin/bash
But docker client does not like that.
<96.119.0.167> REMOTE_MODULE docker image=centos volumes='['/etc/foo:/foo',
> '/etc/bar:/boo']' state=running stdin_open=yes tty=yes command=/bin/bash
> msg: Docker API error: Cannot start container
> 35fb847fdc84ff5bcbdce19b9a443a4eb86de5018d96fd620ca22dcb7dc4f3b0: /etc/bar
> must be an absolute path
>
Despite the fact that it appears to have parse the volumes correctly, I get
the absolute path error seen above. If I change the command to:
tasks:
- name: run bash
docker:
image=centos
volumes='/etc/foo:foo,/etc/bar:bar'
state=running
stdin_open=yes tty=yes
command=/bin/bash
My guess is that this works with ec2 because that's running locally, but
docker has to serialize the list to the server? I think my other issues
were red-herrings and I was getting confused reading the code. How does
the docker module know that a string with commas in it is a list?
if self.module.params.get('volumes'):
self.binds = {}
self.volumes = {}
vols = self.module.params.get('volumes')
for vol in vols:
Is the fact that it is annotated a 'list' in the module spec (volumes=
dict(default=None, type='list')) make Ansible 'pre-parse' that String into
a List? Should the user really have to change how they specify a list
based on whether it is executed locally or remotely? I am able to use var
if I do this:
vars:
theVolumes:
- '/etc/foo:/foo'
- '/etc/bar:/bar'
tasks:
- name: run bash
docker:
image=centos
volumes={{ theVolumes | join(',') }}
state=running
stdin_open=yes tty=yes
command=/bin/bash
But IMO if their is Ansible magic with lists going on, it should do that
already.
On Tuesday, September 9, 2014 12:43:38 PM UTC-4, Michael DeHaan wrote:
>
> Ok can you please file a ticket on this one so we can investigate?
>
> Thanks!
>
> On Mon, Sep 8, 2014 at 5:44 PM, Matt Hughes <[email protected]
> <javascript:>> wrote:
>
>> [clduser@docker-registry ~]$ sudo docker -v
>> Docker version 1.1.2, build d84a070/1.1.2
>>
>> [clduser@docker-registry ~]$ pip list | grep docker
>> docker-py (0.4.0)
>>
>> Using the latest ‘devel’ branch of Ansible. Just repulled now and still
>> experiencing this as of commit c610783f900586b170a6dfa3a02696f568a11728.
>>
>>
>> On September 8, 2014 at 5:41:18 PM, Michael DeHaan ([email protected]
>> <javascript:>) wrote:
>>
>> Can you share the version of Ansible, docker-py, and Docker being used in
>> this case?
>>
>> Thanks!
>>
>>
>>
>> On Mon, Sep 8, 2014 at 12:09 PM, Matt Hughes <[email protected]
>> <javascript:>> wrote:
>>
>>> Volumes also don't appear to be working for me either. I can start the
>>> container, but the mounted volume is always empty inside the container,
>>> despite the host having two volumes. As the original poster says, if I
>>> just use the docker command directly, the volume mount works as expected.
>>>
>>> - name: Start Registry
>>> docker: image={{docker_image}} state=running
>>> volumes="/etc/docker-registry/keys:/etc/docker-registry/keys" name=registry
>>>
>>> See anything wrong?
>>>
>>> On Tuesday, August 26, 2014 8:27:59 PM UTC-4, James Cammarata wrote:
>>>>
>>>> I merged in support for specifying :ro/:rw a few weeks ago, and it was
>>>> included in the 1.7.1 release.
>>>>
>>>>
>>>> On Tue, Aug 26, 2014 at 2:26 PM, Steven Truong <[email protected]>
>>>> wrote:
>>>>
>>>>> TASK: [echo $myhome]
>>>>> **********************************************************
>>>>> ok: [localhost] => {
>>>>> "myhome": {
>>>>> "changed": true,
>>>>> "cmd": "echo $HOME",
>>>>> "delta": "0:00:00.165168",
>>>>> "end": "2014-08-26 19:22:36.055947",
>>>>> "invocation": {
>>>>> "module_args": "echo $HOME",
>>>>> "module_name": "shell"
>>>>> },
>>>>> "rc": 0,
>>>>> "start": "2014-08-26 19:22:35.890779",
>>>>> "stderr": "",
>>>>> "stdout": "/root",
>>>>> "stdout_lines": [
>>>>> "/root"
>>>>> ]
>>>>> }
>>>>> }
>>>>>
>>>>>
>>>>> I removed :rw and :ro and it still did not work. I think that Ansible
>>>>> does not support these third fields yet.
>>>>>
>>>>> Steven.
>>>>>
>>>>> On Tuesday, August 26, 2014 12:16:30 PM UTC-7, James Cammarata wrote:
>>>>>
>>>>>> If you remove the variables and hard-code the paths, does it work
>>>>>> for you then? I'm curious if things like spaces/newlines in the stdout
>>>>>> variables you're using are causing the problem.
>>>>>>
>>>>>> You might want to put in a "- debug: var=myhome" before the docker
>>>>>> task to view the value of stdout there.
>>>>>>
>>>>>>
>>>>>> On Tue, Aug 26, 2014 at 2:05 PM, Steven Truong <[email protected]>
>>>>>> wrote:
>>>>>>
>>>>>>> Hi all,
>>>>>>>
>>>>>>> I tried to use the volumes option and nothing seems to work for me.
>>>>>>>
>>>>>>> I want to mount 2 directories ~/dockerstorage/model and
>>>>>>> ~/repo/ops/ansible to the container and I used either of these commands
>>>>>>> and
>>>>>>> nothing worked.
>>>>>>>
>>>>>>> docker: image=registry.my.com:5000/steven/centos65_prod_ready:v1
>>>>>>> docker_url=tcp://{{ ansible_default_ipv4.address }}:7777
>>>>>>> publish_all_ports=True state=running volumes=/home/kafka/models:{{
>>>>>>> myhome.stdout }}/dockerstorage/models:rw,/usr/local/src/ansible:{{
>>>>>>> myhome.stdout }}/repo/ops/ansible:ro
>>>>>>>
>>>>>>> docker: image=registry.my.com:5000/steven/centos65_prod_ready:v1
>>>>>>> docker_url=tcp://{{ ansible_default_ipv4.address }}:7777
>>>>>>> publish_all_ports=True state=running volumes={{ myhome.stdout
>>>>>>> }}/dockerstorage/models:/home/kafka/models:rw,{{ myhome.stdout
>>>>>>> }}/repo/ops/ansible:/usr/local/src/ansible:ro
>>>>>>>
>>>>>>> I sshed into the containers and the mounted points in either case
>>>>>>> were all empty.
>>>>>>>
>>>>>>> I ran using docker directly and it worked for me:
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> docker run -d -P -v
>>>>>>> /home/steven/dockerstorage/models:/home/kafka/models:rw -v
>>>>>>> /home/steven/repo/ops/ansible:/usr/local/src/ansible:ro
>>>>>>> registry.my.com:5000/steven/centos65_prod_ready:v1
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> Please let me know what is the right ways to use "volumes" for
>>>>>>> docker. From the comments in the docker module, it appears to me that
>>>>>>> the
>>>>>>> /mnt:/tmp is in reversed orders from those of the docker command line
>>>>>>> because of the case when we just want to create a volume such as /mnt
>>>>>>> and
>>>>>>> there is no equivalent mounted point from the host. I think that this
>>>>>>> is
>>>>>>> confusing and users have to read the codes to find out.
>>>>>>>
>>>>>>> Thanks,
>>>>>>> Steven.
>>>>>>>
>>>>>>> [root@sc2-dock1 cloud]# pwd
>>>>>>> /usr/local/ansible/library/cloud
>>>>>>>
>>>>>>>
>>>>>>> class DockerManager:
>>>>>>>
>>>>>>> counters = {'created':0, 'started':0, 'stopped':0, 'killed':0,
>>>>>>> 'removed':0, 'restarted':0, 'pull':0}
>>>>>>>
>>>>>>> def __init__(self, module):
>>>>>>> self.module = module
>>>>>>>
>>>>>>> self.binds = None
>>>>>>> self.volumes = None
>>>>>>> if self.module.params.get('volumes'):
>>>>>>> self.binds = {}
>>>>>>> self.volumes = {}
>>>>>>> vols = self.module.params.get('volumes')
>>>>>>> for vol in vols:
>>>>>>> parts = vol.split(":")
>>>>>>> # host mount (e.g. /mnt:/tmp, bind mounts host's
>>>>>>> /tmp to /mnt in the container)
>>>>>>> if len(parts) == 2:
>>>>>>> self.volumes[parts[1]] = {}
>>>>>>> self.binds[parts[0]] = parts[1]
>>>>>>> # docker mount (e.g. /www, mounts a docker volume
>>>>>>> /www on the container at the same location)
>>>>>>> else:
>>>>>>> self.volumes[parts[0]] = {}
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> You received this message because you are subscribed to the Google
>>>>>>> Groups "Ansible Project" group.
>>>>>>> To unsubscribe from this group and stop receiving emails from it,
>>>>>>> send an email to [email protected].
>>>>>>> To post to this group, send email to [email protected].
>>>>>>>
>>>>>>> To view this discussion on the web visit
>>>>>>> https://groups.google.com/d/msgid/ansible-project/40310529-7426-4321-b9a6-20a9f73d9005%40googlegroups.com
>>>>>>>
>>>>>>> <https://groups.google.com/d/msgid/ansible-project/40310529-7426-4321-b9a6-20a9f73d9005%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>>> .
>>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>>
>>>>>>
>>>>>> --
>>>>> You received this message because you are subscribed to the Google
>>>>> Groups "Ansible Project" group.
>>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>>> an email to [email protected].
>>>>> To post to this group, send email to [email protected].
>>>>> To view this discussion on the web visit
>>>>> https://groups.google.com/d/msgid/ansible-project/5f1b7eb9-d3b1-4907-b01f-ae291f16b636%40googlegroups.com
>>>>>
>>>>> <https://groups.google.com/d/msgid/ansible-project/5f1b7eb9-d3b1-4907-b01f-ae291f16b636%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>> .
>>>>>
>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>
>>>>
>>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "Ansible Project" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to [email protected] <javascript:>.
>>> To post to this group, send email to [email protected]
>>> <javascript:>.
>>> To view this discussion on the web visit
>>> https://groups.google.com/d/msgid/ansible-project/b1f989cf-6b9b-4e6c-972c-861b72fa1da6%40googlegroups.com
>>>
>>> <https://groups.google.com/d/msgid/ansible-project/b1f989cf-6b9b-4e6c-972c-861b72fa1da6%40googlegroups.com?utm_medium=email&utm_source=footer>.
>>>
>>>
>>>
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
>> --
>> You received this message because you are subscribed to a topic in the
>> Google Groups "Ansible Project" group.
>> To unsubscribe from this topic, visit
>> https://groups.google.com/d/topic/ansible-project/tjBFAN1Qc7w/unsubscribe
>> .
>> To unsubscribe from this group and all its topics, send an email to
>> [email protected] <javascript:>.
>> To post to this group, send email to [email protected]
>> <javascript:>.
>> To view this discussion on the web visit
>> https://groups.google.com/d/msgid/ansible-project/CA%2BnsWgzkekA9EK%2BOQzUGQ2P0EvE%3Dqh0hGuVum06L4S0Fxpj%2B1Q%40mail.gmail.com
>>
>> <https://groups.google.com/d/msgid/ansible-project/CA%2BnsWgzkekA9EK%2BOQzUGQ2P0EvE%3Dqh0hGuVum06L4S0Fxpj%2B1Q%40mail.gmail.com?utm_medium=email&utm_source=footer>
>> .
>> For more options, visit https://groups.google.com/d/optout.
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "Ansible Project" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected] <javascript:>.
>> To post to this group, send email to [email protected]
>> <javascript:>.
>> To view this discussion on the web visit
>> https://groups.google.com/d/msgid/ansible-project/etPan.540e2353.836c40e.1a8%40Matthews-MacBook-Pro.local
>>
>> <https://groups.google.com/d/msgid/ansible-project/etPan.540e2353.836c40e.1a8%40Matthews-MacBook-Pro.local?utm_medium=email&utm_source=footer>
>> .
>>
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>
--
You received this message because you are subscribed to the Google Groups
"Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/ansible-project/9c9fc37d-fa1e-490a-8d35-2f1f2a84f5f4%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.