Nested loop with second loop depending on first item

3,948 views
Skip to first unread message

Guillaume Subiron

unread,
Dec 11, 2013, 3:53:14 AM12/11/13
to ansible...@googlegroups.com
Hi,

I'm trying to do a special kind of nesting loop, using the item of the
first loop in the second loop:

- name: Prepare OSDs
shell: ceph-deploy osd prepare {{ item[0] }}:{{ item[1] }}
with_nested:
- groups['ceph-ODSs']
- hostvars[item[0]]['disks']

I'm not sure if this is possible, but I can't find any workaround.

--
Guillaume Subiron
Mail - mae...@subiron.org
GPG - C7C4 455C
Jabber - mae...@im.subiron.org
IRC - maethor@(freenode|geeknode)

Serge van Ginderachter

unread,
Dec 11, 2013, 5:18:28 AM12/11/13
to ansible...@googlegroups.com
Have a look at the with_subelements lookup plugin.


--
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 ansible-proje...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Guillaume Subiron

unread,
Dec 11, 2013, 5:40:08 AM12/11/13
to ansible...@googlegroups.com
Le 13/12/11 11:18, Serge van Ginderachter claviotta :
> Have a look at the with_subelements lookup plugin.

I know very well with_subelements, but in this case I'm not trying to
access a subelement in the first element, I'm trying to use the first
element to access an entry in an other dictionary.

I don't think with_subelements is well suited to this case. Do you
have an example ?

Michael DeHaan

unread,
Dec 11, 2013, 8:05:32 AM12/11/13
to ansible...@googlegroups.com
Before we dive into a technical solution let me understand your use case and what you are modelling a bit better.

So groups['ceph-ODSs'] would be all machines in the ceph-ODSs group.

I'd probably just define a variable like "disks" on the group, but I'm unclear why that wouldn't work in your case.

I could probably understand more if I could see how "disks" differs between hosts.




--
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 ansible-proje...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.



--
Michael DeHaan <mic...@ansibleworks.com>
CTO, AnsibleWorks, Inc.
http://www.ansibleworks.com/

Guillaume Subiron

unread,
Dec 11, 2013, 8:21:27 AM12/11/13
to ansible...@googlegroups.com
Le 13/12/11 08:05, Michael DeHaan claviotta :
> Before we dive into a technical solution let me understand your use case
> and what you are modelling a bit better.
>
> So groups['ceph-ODSs'] would be all machines in the ceph-ODSs group.

That's right.

>
> I'd probably just define a variable like "disks" on the group, but I'm
> unclear why that wouldn't work in your case.
>
> I could probably understand more if I could see how "disks" differs between
> hosts.

It's simple, my Ceph OSD (storage nodes) are all différents. Some
contains 2 hard drives (sdb, sdc), some contains 10 (sdb, sdc, sdd…).
"disks" is a list of hard drives, which is different from one host to
another. ex:

inventory

osd0
osd1

[ceph-OSDs]
osd0
osd1

host_vars/osd0

disks:
- sdb

host_vars/osd1

disks:
- sdb
- sdc

In my nested loop, I need to loop over the Ceph Storage nodes and
their hard drive. The hard drive list is an host variable (accessible
by hostvars[osd0]['disks'], for instance).

With the example above, I want my playbook to do :

ceph_deploy osd prepare osd0:sda
ceph_deploy osd prepare osd1:sda
ceph_deploy osd prepare osd1:sdb

Michael DeHaan

unread,
Dec 11, 2013, 8:24:40 AM12/11/13
to ansible...@googlegroups.com
I think you probably want this:

- shell: echo {{ item.0 }}-{{item.1 }}
  with_together:
      - groups['ceph-OSDs']
      - disks

this will print for the first host

osd0-sdb
osd1-sdb

and for the second host

osd0-sdb
osd0-sdc
osd1-sdb
osd1-sdc

Let me know if that works for you and if I'm missing something we'll figure it out.

Thanks!





--
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 ansible-proje...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Guillaume Subiron

unread,
Dec 11, 2013, 8:53:10 AM12/11/13
to ansible...@googlegroups.com
Hum, this is not what I'm looking for, because my action is not
executed on the ceph-OSDs, but on another host (a centralized admin
node).
In this playbook, I'm not doing anything on the ceph-OSDs.

What I need to do (only on my admin node) is :

- shell: echo {{ item.0 }}-{{ item.1 }}
with_nested:
- groups['ceph-OSDs']
- the disks of the current item in the "groups['ceph-OSDs']" loop

I want it to print (on the admin host) :

osd0-sdb
osd1-sdb
osd1-sdc

Do you understand the problem ? I don't see any workaround. This is a
matter of syntax.


Le 13/12/11 08:24, Michael DeHaan claviotta :

Guillaume Subiron

unread,
Dec 11, 2013, 9:24:37 AM12/11/13
to ansible...@googlegroups.com
After reading nested.py and realizing it would never do what I wanted,
I found a workaround.

On each ceph-ODSs :

- delegate_to: "{{ ceph-admin }}"
shell: echo {{ inventory_hostname }}-{{ item }}
with_items: disks



Anyway, thank you very much for your help :)


Le 13/12/11 14:53, Guillaume Subiron claviotta :

Q

unread,
Jun 12, 2017, 9:09:28 AM6/12/17
to Ansible Project, mae...@subiron.org
Guillaume,

I have exactly the same problem with setting up OSD via ADM host and I was pulling my hair for 2 days.
I don't know how to thank you:)

saisum...@gmail.com

unread,
Nov 14, 2018, 3:05:32 AM11/14/18
to Ansible Project
Hi I have seen ur resolutions in this page i.

I am also having the same issue with nested loops .
my scenario is nothing but the matrix multiplication of n*n
Can some one please suggest how to implement it using ansible loops along with adding conidition of count ++ and count --

J Hawkesworth

unread,
Nov 18, 2018, 5:29:35 AM11/18/18
to Ansible Project

Brian Coca

unread,
Nov 21, 2018, 1:47:53 PM11/21/18
to ansible...@googlegroups.com
actually use the product filter instead of cartesian lookup



----------
Brian Coca
Reply all
Reply to author
Forward
0 new messages